changeset 395:ac9cd48151b6

Added couple of docgen modules.
author Jari-Matti M?kel? <jmjm@iki.fi>
date Wed, 19 Sep 2007 23:12:20 +0300
parents 6440da4adb07
children 0a4619735ce9
files trunk/src/docgen-tests.d trunk/src/docgen/archdoc.xmi trunk/src/docgen/docgen.d trunk/src/docgen/graphutils/dotwriter.d trunk/src/docgen/graphutils/modulenamewriter.d trunk/src/docgen/graphutils/modulepathwriter.d trunk/src/docgen/graphutils/primitives.d trunk/src/docgen/graphutils/writer.d trunk/src/docgen/graphutils/writers.d trunk/src/docgen/lstlang0.sty trunk/src/docgen/misc/misc.d trunk/src/docgen/modulegraph/writer.d trunk/src/docgen/sourcelisting/writer.d trunk/src/docgen/sourcelisting/writers.d
diffstat 14 files changed, 1917 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen-tests.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,55 @@
+/**
+ * Author: Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module trunk.src.tests;
+
+import docgen.graphutils.writers;
+import tango.io.Stdout;
+import tango.io.FileConduit;
+
+/**
+ * A temporary test program for the docgen package.
+ * I'll replace this with proper unittests in the future.
+ *
+ */
+void main() {
+    {
+        auto a = new Vertex("mod_a", "path.to.mod_a", 1);
+        auto b = new Vertex("mod_b", "path.to.mod_b", 2);
+        auto c = new Vertex("mod_c", "path.to.mod_c", 3);
+
+        auto d = new Vertex("mod_d", "path.to.mod_d", 4);
+        auto e = new Vertex("mod_e", "path.to.mod_e", 5);
+        auto f = new Vertex("mod_f", "path.to.mod_f", 6);
+        auto g = new Vertex("mod_g", "path.to.mod_g", 7);
+
+        Edge[] edges;
+        //edges ~= a.addChild(b);
+        //edges ~= b.addChild(c);
+        //edges ~= c.addChild(a);
+        edges ~= d.addChild(a);
+        //edges ~= e.addChild(a);
+        edges ~= b.addChild(d);
+        edges ~= b.addChild(e);
+        edges ~= g.addChild(a);
+        edges ~= b.addChild(f);
+        edges ~= g.addChild(f);
+        edges ~= a.addChild(g);
+
+
+
+        GraphOptions test;
+        test.graphFormat = GraphFormat.Dot;
+        test.HighlightCyclicVertices = true;
+        //test.format = GraphOutputFormat.ModuleNames;
+        //test.format = GraphOutputFormat.ModulePaths;
+        test.depth = 5;
+        //test.depth++;
+
+        auto gwf = new DefaultGraphWriterFactory(test);
+        auto writer = gwf.createGraphWriter([Stdout.stream, new FileConduit("test.dot", FileConduit.WriteCreate)]);
+
+        writer([a,b,c,d,e,f,g], edges);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/archdoc.xmi	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,1066 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XMI xmlns:UML="http://schema.omg.org/spec/UML/1.3" verified="false" timestamp="2007-09-19T22:58:35" xmi.version="1.2" >
+ <XMI.header>
+  <XMI.documentation>
+   <XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
+   <XMI.exporterVersion>1.5.71</XMI.exporterVersion>
+   <XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
+  </XMI.documentation>
+  <XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
+ </XMI.header>
+ <XMI.content>
+  <UML:Model isSpecification="false" isLeaf="false" isRoot="false" xmi.id="m1" isAbstract="false" name="Umbrello UML mallintaja" >
+   <UML:Namespace.ownedElement>
+    <UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="folder" isRoot="false" isAbstract="false" name="folder" />
+    <UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="datatype" isRoot="false" isAbstract="false" name="datatype" />
+    <UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="enum" isRoot="false" isAbstract="false" name="enum" />
+    <UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="interface" isRoot="false" isAbstract="false" name="interface" />
+    <UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Logical View" isRoot="false" isAbstract="false" name="Logical View" >
+     <UML:Namespace.ownedElement>
+      <UML:Package stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Datatypes" isRoot="false" isAbstract="false" name="Datatypes" >
+       <UML:Namespace.ownedElement>
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="wMWsornjU1NO" isRoot="false" isAbstract="false" name="int" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="MGwAYPpykhTm" isRoot="false" isAbstract="false" name="char" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="EaC7G8UkzGbk" isRoot="false" isAbstract="false" name="bool" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="z3jKRbJnqFxM" isRoot="false" isAbstract="false" name="float" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="clKKQl7eLHlZ" isRoot="false" isAbstract="false" name="double" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="NFJMWv4VyoqO" isRoot="false" isAbstract="false" name="short" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="N7BDN7YzqsIG" isRoot="false" isAbstract="false" name="long" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="cPuvefV1toMN" isRoot="false" isAbstract="false" name="unsigned int" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="hQqeEe2cmDn9" isRoot="false" isAbstract="false" name="unsigned short" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="IL68COOolGjP" isRoot="false" isAbstract="false" name="unsigned long" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="wERn1lAgB0KQ" isRoot="false" isAbstract="false" name="string" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="tblJnk8mwuii" isRoot="false" isAbstract="false" name="GraphNode[]" elementReference="FVtbgO8sd2ii" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="zgj70ST7PbVQ" isRoot="false" isAbstract="false" name="undef" >
+         <UML:GeneralizableElement.generalization>
+          <UML:Generalization xmi.idref="1dmVIJyonUEn" />
+          <UML:Generalization xmi.idref="p27xKs3wyvpN" />
+          <UML:Generalization xmi.idref="lO9c3UK3Ot3L" />
+          <UML:Generalization xmi.idref="ns2H6KLVJ9Xb" />
+         </UML:GeneralizableElement.generalization>
+        </UML:DataType>
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="UGpWCc0uWy3g" isRoot="false" isAbstract="false" name="Vertex[]" elementReference="FVtbgO8sd2ii" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="QXgD4zE4FsCt" isRoot="false" isAbstract="false" name="GraphWriterOptions *" />
+        <UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="DaFOT7jBVtui" isRoot="false" isAbstract="false" name="CodeListerOptions *" />
+       </UML:Namespace.ownedElement>
+      </UML:Package>
+      <UML:Class comment="CodeLister " isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="gGNje78ValnI" isRoot="false" isAbstract="true" name="AbstractListingWriter" >
+       <UML:Classifier.feature>
+        <UML:Attribute isSpecification="false" visibility="protected" xmi.id="hcALY1fmWlEG" type="DdhFJyNQcQSm" name="factory" />
+        <UML:Attribute isSpecification="false" visibility="protected" xmi.id="9QXgkpqgA1Du" type="3qQutO5Yhxt6" name="outputs" />
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="Aa3THxJUbPoV" isRoot="false" isAbstract="false" isQuery="false" name="this" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="BqUI126Bc7cr" value="" type="DdhFJyNQcQSm" name="factory" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="UJXlWuv0im5m" value="" type="3qQutO5Yhxt6" name="outputs" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="UY72E0ULeXyT" isRoot="false" isAbstract="false" name="Parser" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="KASRlJWedAvi" client="gGNje78ValnI" name="" supplier="UY72E0ULeXyT" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="OcpJQugxHW8F" isRoot="false" isAbstract="false" name="ListingOptions" >
+       <UML:Classifier.feature>
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="gOHG3iCLbStZ" type="58hyBKGITKzU" name="docFormat" />
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="uYIB5OPcbNSb" client="gGNje78ValnI" name="" supplier="OcpJQugxHW8F" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="dw4fHleozmt5" client="gGNje78ValnI" name="" supplier="zgj70ST7PbVQ" />
+      <UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="58hyBKGITKzU" isRoot="false" isAbstract="false" name="DocFormat" >
+       <UML:EnumerationLiteral comment="LaTeX + listings currently" isSpecification="false" isLeaf="false" visibility="public" namespace="58hyBKGITKzU" xmi.id="jnhozkQ1UqIp" isRoot="false" isAbstract="false" name="LaTeX" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="58hyBKGITKzU" xmi.id="DhN6TjTmtUai" isRoot="false" isAbstract="false" name="XML" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="58hyBKGITKzU" xmi.id="eyKevtlegQQd" isRoot="false" isAbstract="false" name="HTML" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="58hyBKGITKzU" xmi.id="9qedeuTpcot5" isRoot="false" isAbstract="false" name="PlainText" />
+      </UML:Enumeration>
+      <UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="o5RT7D5TyDem" isRoot="false" isAbstract="false" name="CommentFormat" >
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="o5RT7D5TyDem" xmi.id="pCzlo8cW1N0o" isRoot="false" isAbstract="false" name="ddoc" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="o5RT7D5TyDem" xmi.id="FS23UTFrinBx" isRoot="false" isAbstract="false" name="doxygen" />
+      </UML:Enumeration>
+      <UML:Interface stereotype="interface" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="zhVfgpENwAeN" isRoot="false" isAbstract="true" name="ListingWriter" >
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="eGKXDits9Kho" isRoot="false" isAbstract="false" isQuery="false" name="generateListing" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="KNIleVffDrUP" value="" type="yBk69LKYzyaX" name="stream" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="fA2So7Re6pf2" isRoot="false" isAbstract="false" isQuery="false" name="generateListing" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="Au5dZofnQ9Fm" value="" type="UY72E0ULeXyT" name="parser" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Interface>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="qxq04A8rywIb" isRoot="false" isAbstract="false" name="XMLWriter" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="u534X7uMBIy5" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="KoEO9zJwTXuD" isRoot="false" isAbstract="false" isQuery="false" name="generateListing" />
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="w884b40YcIag" isRoot="false" isAbstract="false" name="HTMLWriter" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="1tZ6hQ3Znq07" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="mBRaST74dftD" isRoot="false" isAbstract="false" isQuery="false" name="generateListing" />
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="B92ON93E7uE9" isRoot="false" isAbstract="false" name="LatexWriter" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="FbDTu6ZqYxZ5" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="JpwoOQQ4RzaO" isRoot="false" isAbstract="false" isQuery="false" name="generateListing" />
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="2MyyGGXAPfEy" isRoot="false" isAbstract="false" name="PlainTextWriter" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="jNbdqaYMr5vR" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="VRgNwkJTDt0B" isRoot="false" isAbstract="false" isQuery="false" name="generateListing" />
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="haoxC1oM2QVz" isRoot="false" isAbstract="false" name="DefaultListingFactory" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="0zf0YojVOJsY" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="2SrUGMptabML" isRoot="false" isAbstract="false" isQuery="false" name="createListingWriter" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="pioyJkpEo7Bj" type="zhVfgpENwAeN" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="GYFWlYNnmcE7" value="" type="3qQutO5Yhxt6" name="outputs" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="pOOtPyR4YD1i" client="gGNje78ValnI" name="" supplier="zhVfgpENwAeN" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Hf6nfAgadb4K" client="gGNje78ValnI" name="" supplier="haoxC1oM2QVz" />
+      <UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Zq72H2CSpWXa" client="2MyyGGXAPfEy" name="" supplier="zhVfgpENwAeN" />
+      <UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="A6N2elCBKnZO" client="B92ON93E7uE9" name="" supplier="zhVfgpENwAeN" />
+      <UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="eumL2kguvB4r" client="w884b40YcIag" name="" supplier="zhVfgpENwAeN" />
+      <UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="4EmCZ7If6KdF" client="qxq04A8rywIb" name="" supplier="zhVfgpENwAeN" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="lPLNpCYn0pMy" client="haoxC1oM2QVz" name="" supplier="qxq04A8rywIb" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="vlcHfpQlYKr7" client="haoxC1oM2QVz" name="" supplier="w884b40YcIag" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Kg5HoKskzFEv" client="haoxC1oM2QVz" name="" supplier="B92ON93E7uE9" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="9Vk40Voo7HZw" client="haoxC1oM2QVz" name="" supplier="2MyyGGXAPfEy" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="PsKBU0u8FFdQ" client="zhVfgpENwAeN" name="" supplier="zgj70ST7PbVQ" />
+      <UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="xxCyboRg8fju" client="gGNje78ValnI" name="" supplier="zhVfgpENwAeN" />
+      <UML:Generalization isSpecification="false" child="2MyyGGXAPfEy" visibility="public" namespace="Logical View" xmi.id="jNbdqaYMr5vR" parent="gGNje78ValnI" discriminator="" name="" />
+      <UML:Generalization isSpecification="false" child="B92ON93E7uE9" visibility="public" namespace="Logical View" xmi.id="FbDTu6ZqYxZ5" parent="gGNje78ValnI" discriminator="" name="" />
+      <UML:Generalization isSpecification="false" child="w884b40YcIag" visibility="public" namespace="Logical View" xmi.id="1tZ6hQ3Znq07" parent="gGNje78ValnI" discriminator="" name="" />
+      <UML:Generalization isSpecification="false" child="qxq04A8rywIb" visibility="public" namespace="Logical View" xmi.id="u534X7uMBIy5" parent="gGNje78ValnI" discriminator="" name="" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="098RWfwZqN4L" isRoot="false" isAbstract="false" name="ModuleGraphFactory" >
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="CMMapfT5KiQP" isRoot="false" isAbstract="false" isQuery="false" name="createGraphWriter" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="dnaY7cwuRQn2" type="2Mzl2VgeffI0" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="r5Ijnmvx8HYv" value="" type="Ug6grrz7llbI" name="modules" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="4F09aHCjljSA" isRoot="false" isAbstract="false" name="GraphFormat" >
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="4F09aHCjljSA" xmi.id="Uhfew917nyad" isRoot="false" isAbstract="false" name="Dot" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="4F09aHCjljSA" xmi.id="Jy1fqRBSwrTe" isRoot="false" isAbstract="false" name="ModuleNames" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="4F09aHCjljSA" xmi.id="aow2SW2oUhRP" isRoot="false" isAbstract="false" name="ModulePaths" />
+      </UML:Enumeration>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="pwXaDeUXVlRv" isRoot="false" isAbstract="false" name="ClassGraphFactory" >
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="RDl3vCbldkit" isRoot="false" isAbstract="false" isQuery="false" name="createGraphWriter" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="hvf2wcEjK0hb" type="2Mzl2VgeffI0" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="eZGRSI3D44ZH" value="" type="Ug6grrz7llbI" name="modules" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="FVtbgO8sd2ii" isRoot="false" isAbstract="false" name="Vertex" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="rtOV4FVf7iPk" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="cf98eu4OpFbX" type="cPuvefV1toMN" name="id" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="hgsYJ2YnnaVS" type="wERn1lAgB0KQ" name="name" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="sBVGlTogVHfE" type="wERn1lAgB0KQ" name="location" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="ajeRzBpBzXm2" type="XjtDAoectTTH" name="incomingEdges" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="hTSa11gAdwIE" type="XjtDAoectTTH" name="outgoingEdges" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="VXmaXhPeKk9I" type="BQqAv02HTM6x" name="type" />
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="2fXtbb2YF7TG" isRoot="false" isAbstract="false" isQuery="false" name="this" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="yejRa2Oznwhc" value="" type="wERn1lAgB0KQ" name="name" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="659S1872M8Cd" value="" type="wERn1lAgB0KQ" name="loc" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="QSb02dspK6xX" value="" type="cPuvefV1toMN" name="id" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="PX2Y1eFKtaj6" isRoot="false" isAbstract="false" isQuery="false" name="isCyclic" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="iUqWazEDkmmr" type="EaC7G8UkzGbk" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Generalization isSpecification="false" child="zgj70ST7PbVQ" visibility="public" namespace="Logical View" xmi.id="1dmVIJyonUEn" parent="FVtbgO8sd2ii" discriminator="" name="" />
+      <UML:Generalization isSpecification="false" child="zgj70ST7PbVQ" visibility="public" namespace="Logical View" xmi.id="p27xKs3wyvpN" parent="FVtbgO8sd2ii" discriminator="" name="" />
+      <UML:Generalization isSpecification="false" child="zgj70ST7PbVQ" visibility="public" namespace="Logical View" xmi.id="lO9c3UK3Ot3L" parent="FVtbgO8sd2ii" discriminator="" name="" />
+      <UML:Generalization isSpecification="false" child="zgj70ST7PbVQ" visibility="public" namespace="Logical View" xmi.id="ns2H6KLVJ9Xb" parent="FVtbgO8sd2ii" discriminator="" name="" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="taceG4p7AY1k" isRoot="false" isAbstract="true" name="AbstractGraphWriter" >
+       <UML:Classifier.feature>
+        <UML:Attribute isSpecification="false" visibility="protected" xmi.id="jYgSGEsqagKv" type="H9NLXsg0Hncp" name="factory" />
+        <UML:Attribute isSpecification="false" visibility="protected" xmi.id="4Bqtwxx8p0pI" type="3qQutO5Yhxt6" name="outputs" />
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="RhFDP34VCWM4" isRoot="false" isAbstract="false" isQuery="false" name="this" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="tBvamRjPCFGt" value="" type="H9NLXsg0Hncp" name="factory" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="9EFHJ6ymPiIf" value="" type="3qQutO5Yhxt6" name="outputs" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="672lM6F9KhcI" isRoot="false" isAbstract="false" name="GraphWriterOptions" >
+       <UML:Classifier.feature>
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="zRuotD7A5ZEx" type="4F09aHCjljSA" name="format" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="dMwwhlSnUoPh" type="VDAdlQhZ750q" name="imageFormat" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="E1vnjmQdHkkv" type="58hyBKGITKzU" name="docFormat" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="cGQrznU4axXm" type="cPuvefV1toMN" name="depth" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="UirRcvN0JEsV" type="EaC7G8UkzGbk" name="IncludeUnlocatableModules" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="AQlvQmLLBkXo" type="EaC7G8UkzGbk" name="GroupByFullPackageName" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="vOQEdHhXSPF8" type="EaC7G8UkzGbk" name="GroupByPackageNames" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="TrfH97Bbn23Q" type="EaC7G8UkzGbk" name="HighlightCyclicVertices" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="uBkkfpbvggDX" type="EaC7G8UkzGbk" name="HighlightCyclicEdges" />
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Interface stereotype="interface" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="2Mzl2VgeffI0" isRoot="false" isAbstract="true" name="GraphWriter" >
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="kluUKuajlkAu" isRoot="false" isAbstract="false" isQuery="false" name="generateGraph" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="fREmiJ7UKXFJ" value="" type="UGpWCc0uWy3g" name="vertices" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="OVLa6NXYfSPa" value="" type="XjtDAoectTTH" name="edges" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Interface>
+      <UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="QrZyyaltfezo" name="" >
+       <UML:Association.connection>
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="pWxiAyPVfU1m" aggregation="composite" type="zgj70ST7PbVQ" name="" />
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="g6iEmDoC2LA0" aggregation="none" type="FVtbgO8sd2ii" name="" />
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Generalization isSpecification="false" child="FVtbgO8sd2ii" visibility="public" namespace="Logical View" xmi.id="rtOV4FVf7iPk" parent="zgj70ST7PbVQ" discriminator="" name="" />
+      <UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="YFH3CyxPGsNY" client="taceG4p7AY1k" name="" supplier="2Mzl2VgeffI0" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="ZUDChgtO8jSy" isRoot="false" isAbstract="false" name="DotWriter" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="gO9JCUKh4zz7" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="nXwHg6RtyC4B" isRoot="false" isAbstract="false" isQuery="false" name="generateGraph" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="L3a5zNEcbuwz" value="" type="UGpWCc0uWy3g" name="vertices" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="FX185qpx9hBY" value="" type="XjtDAoectTTH" name="edges" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Generalization isSpecification="false" child="ZUDChgtO8jSy" visibility="public" namespace="Logical View" xmi.id="gO9JCUKh4zz7" parent="taceG4p7AY1k" discriminator="" name="" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Ug6grrz7llbI" isRoot="false" isAbstract="false" name="Parser[]" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="85ASUVIYu8Rm" isRoot="false" isAbstract="false" name="ClassGraphWriter" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="R1LMLXi8zBZD" isRoot="false" isAbstract="false" name="ModuleGraphWriter" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="eIi8xlOA51aq" client="zgj70ST7PbVQ" name="" supplier="ZUDChgtO8jSy" />
+      <UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="xcuomSYFMuc3" name="" >
+       <UML:Association.connection>
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="z3vey0rU0fYl" aggregation="none" type="zgj70ST7PbVQ" name="" />
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="v0wc5Ii1vbnf" aggregation="none" type="ZUDChgtO8jSy" name="" />
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="KxhR786WWKiA" name="" >
+       <UML:Association.connection>
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="S4OAgzf4nSFv" aggregation="none" type="haoxC1oM2QVz" name="" />
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="LyN0X3ypydE5" aggregation="none" type="2MyyGGXAPfEy" name="" />
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="036VnHDG2xBH" name="" >
+       <UML:Association.connection>
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="JoUpcbtKT5YV" aggregation="none" type="haoxC1oM2QVz" name="" />
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="eUTueiMekR8X" aggregation="none" type="B92ON93E7uE9" name="" />
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="MPnzJ9f0egCU" name="" >
+       <UML:Association.connection>
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="ZYvknQmE8PDm" aggregation="none" type="haoxC1oM2QVz" name="" />
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="KYVg4GCPeyMv" aggregation="none" type="w884b40YcIag" name="" />
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="qQ8ZNcL54wHR" name="" >
+       <UML:Association.connection>
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="wREu0yqd0ws9" aggregation="none" type="haoxC1oM2QVz" name="" />
+        <UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="3UwgJY27yBeJ" aggregation="none" type="qxq04A8rywIb" name="" />
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="BQqAv02HTM6x" isRoot="false" isAbstract="false" name="VertexType" >
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="BQqAv02HTM6x" xmi.id="UWXR1uwj6Xht" isRoot="false" isAbstract="false" name="module" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="BQqAv02HTM6x" xmi.id="KZH8gthgkYAr" isRoot="false" isAbstract="false" name="package" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="BQqAv02HTM6x" xmi.id="GvOp2iAWCfvE" isRoot="false" isAbstract="false" name="class" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="BQqAv02HTM6x" xmi.id="XsxdPcUh9joq" isRoot="false" isAbstract="false" name="interface" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="BQqAv02HTM6x" xmi.id="dTUN2eCIZb6Z" isRoot="false" isAbstract="false" name="trait" />
+      </UML:Enumeration>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="PILb9kCQnOZd" isRoot="false" isAbstract="false" name="Edge" >
+       <UML:Classifier.feature>
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="Aq7LuhClDFeB" type="FVtbgO8sd2ii" name="incoming" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="xg3pIv6gVUUO" type="FVtbgO8sd2ii" name="outgoing" />
+        <UML:Attribute isSpecification="false" visibility="private" xmi.id="eaFFJAnvNrxh" type="uzw9DITFgRm2" name="type" />
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="p2AAWOx6E09l" isRoot="false" isAbstract="false" isQuery="false" name="this" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="mN7gwLT6JP4I" value="" type="FVtbgO8sd2ii" name="o" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="WNmYYSfW1HTL" value="" type="FVtbgO8sd2ii" name="i" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="ITeVbCmrH3BN" value="" type="BQqAv02HTM6x" name="type" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="faPqILFpZIBc" isRoot="false" isAbstract="false" isQuery="false" name="isCyclic" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="Oglo4WqmSTmM" type="EaC7G8UkzGbk" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="uzw9DITFgRm2" isRoot="false" isAbstract="false" name="EdgeType" >
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="uzw9DITFgRm2" xmi.id="Gv3YsqBCKi6E" isRoot="false" isAbstract="false" name="unspecified" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="uzw9DITFgRm2" xmi.id="A1QhopWR6xzK" isRoot="false" isAbstract="false" name="aggregation" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="uzw9DITFgRm2" xmi.id="OVYO1FWE3aSP" isRoot="false" isAbstract="false" name="association" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="uzw9DITFgRm2" xmi.id="uXTHm0iw18dq" isRoot="false" isAbstract="false" name="composition" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="uzw9DITFgRm2" xmi.id="3Mv6vLTpsw6c" isRoot="false" isAbstract="false" name="cyclicDependency" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="uzw9DITFgRm2" xmi.id="0BPEtKs5X9EB" isRoot="false" isAbstract="false" name="dependency" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="uzw9DITFgRm2" xmi.id="w8F05EKRiqqj" isRoot="false" isAbstract="false" name="generalization" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="uzw9DITFgRm2" xmi.id="OQEcUiDMf7Wr" isRoot="false" isAbstract="false" name="inheritance" />
+      </UML:Enumeration>
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="YjondCVQ8s2U" client="2Mzl2VgeffI0" name="" supplier="zgj70ST7PbVQ" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="XjtDAoectTTH" isRoot="false" isAbstract="false" name="Edge[]" />
+      <UML:Interface stereotype="interface" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="H9NLXsg0Hncp" isRoot="false" isAbstract="true" name="GraphWriterFactory" >
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="FYgiWJyDqrhK" isRoot="false" isAbstract="false" isQuery="false" name="options" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="305OynxgFlBp" type="672lM6F9KhcI" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="L1C3szmMnzpw" isRoot="false" isAbstract="false" isQuery="false" name="createGraphWriter" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="YLOGwvBFuNIk" value="" type="3qQutO5Yhxt6" name="outputs" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Interface>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="GIPhxHkszygs" isRoot="false" isAbstract="true" name="AbstractGraphWriterFactory" >
+       <UML:Classifier.feature>
+        <UML:Attribute isSpecification="false" visibility="protected" xmi.id="ZmI5M1aN978M" type="672lM6F9KhcI" name="m_options" />
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="liEDYXNQ5pTO" isRoot="false" isAbstract="false" isQuery="false" name="options" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="kP1U9lJYR2KV" type="QXgD4zE4FsCt" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="m7wwiwCSxVGR" client="2Mzl2VgeffI0" name="" supplier="FVtbgO8sd2ii" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="R79vj31U6PK0" client="2Mzl2VgeffI0" name="" supplier="PILb9kCQnOZd" />
+      <UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Pef9sSrIGFql" client="GIPhxHkszygs" name="" supplier="H9NLXsg0Hncp" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="p0keVPRrye6f" client="H9NLXsg0Hncp" name="" supplier="672lM6F9KhcI" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="vJ8WmfZPiVQE" isRoot="false" isAbstract="false" name="DefaultGraphWriterFactory" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="kOBlgJz6y2Lz" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="rSVt3npBuRwI" isRoot="false" isAbstract="false" isQuery="false" name="this" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="o4PMZ16oEaaK" value="" type="672lM6F9KhcI" name="options" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="qt3yjRHa0HmR" isRoot="false" isAbstract="false" isQuery="false" name="createGraphWriter" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="37SmulDSCnBM" value="" type="3qQutO5Yhxt6" name="outputs" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="leYQpk5LWBlE" isRoot="false" isAbstract="false" name="ModuleNameWriter" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="51RZVXixdhgF" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="VR6VNEtfCgkY" isRoot="false" isAbstract="false" isQuery="false" name="generateGraph" />
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="cQGGEupKkEKw" isRoot="false" isAbstract="false" name="ModulePathWriter" >
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="Z4ZHkEV03W4k" />
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="wEWZIkURw0Kn" isRoot="false" isAbstract="false" isQuery="false" name="generateGraph" />
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Generalization isSpecification="false" child="cQGGEupKkEKw" visibility="public" namespace="Logical View" xmi.id="Z4ZHkEV03W4k" parent="taceG4p7AY1k" discriminator="" name="" />
+      <UML:Generalization isSpecification="false" child="leYQpk5LWBlE" visibility="public" namespace="Logical View" xmi.id="51RZVXixdhgF" parent="taceG4p7AY1k" discriminator="" name="" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="3qQutO5Yhxt6" isRoot="false" isAbstract="false" name="OutputStream[]" />
+      <UML:Interface stereotype="interface" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="QbirDWtuKiBS" isRoot="false" isAbstract="true" name="OutputStream" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="0e7qU7vxuugt" client="H9NLXsg0Hncp" name="" supplier="QbirDWtuKiBS" />
+      <UML:Generalization isSpecification="false" child="vJ8WmfZPiVQE" visibility="public" namespace="Logical View" xmi.id="kOBlgJz6y2Lz" parent="GIPhxHkszygs" discriminator="" name="" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="jUfTITIIjhSw" client="vJ8WmfZPiVQE" name="" supplier="leYQpk5LWBlE" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ntBujkSHp8rF" client="vJ8WmfZPiVQE" name="" supplier="cQGGEupKkEKw" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="oG7IcloUW5iz" client="vJ8WmfZPiVQE" name="" supplier="ZUDChgtO8jSy" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="6E5Os60E5bNw" client="taceG4p7AY1k" name="" supplier="QbirDWtuKiBS" />
+      <UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="m1ftLgsc5LXQ" isRoot="false" isAbstract="true" name="AbstractListingFactory" >
+       <UML:Classifier.feature>
+        <UML:Attribute isSpecification="false" visibility="protected" xmi.id="xswAJre2CrPi" type="OcpJQugxHW8F" name="m_options" />
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="mZ1wtQujXunn" isRoot="false" isAbstract="false" isQuery="false" name="options" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="ZAH1c2Nf2S1z" type="DaFOT7jBVtui" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Interface stereotype="interface" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="DdhFJyNQcQSm" isRoot="false" isAbstract="true" name="ListingFactory" >
+       <UML:Classifier.feature>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="QR4frQ4pllIy" isRoot="false" isAbstract="false" isQuery="false" name="options" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="DzfRkqGVDHxN" type="OcpJQugxHW8F" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="GL3CAg7Qy0PF" isRoot="false" isAbstract="false" isQuery="false" name="createListingWriter" >
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="0HtRJDvsLArx" type="zhVfgpENwAeN" />
+          <UML:Parameter isSpecification="false" visibility="private" xmi.id="rlp4XIxd1W9V" value="" type="3qQutO5Yhxt6" name="outputs" />
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Interface>
+      <UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="M1DRAGcxqQmM" client="m1ftLgsc5LXQ" name="" supplier="DdhFJyNQcQSm" />
+      <UML:Generalization isSpecification="false" child="haoxC1oM2QVz" visibility="public" namespace="Logical View" xmi.id="0zf0YojVOJsY" parent="m1ftLgsc5LXQ" discriminator="" name="" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="6bs0V3Pr6aVg" client="DdhFJyNQcQSm" name="" supplier="OcpJQugxHW8F" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="yQFLdIs4FB5E" client="DdhFJyNQcQSm" name="" supplier="3qQutO5Yhxt6" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ykj8Siycsv3x" client="gGNje78ValnI" name="" supplier="3qQutO5Yhxt6" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="YFeUspY6csTF" client="zhVfgpENwAeN" name="" supplier="UY72E0ULeXyT" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8nWBoU6zOpZ6" client="gGNje78ValnI" name="" supplier="QbirDWtuKiBS" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="0RBqSjye7dsd" client="DdhFJyNQcQSm" name="" supplier="QbirDWtuKiBS" />
+      <UML:Interface stereotype="interface" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="yBk69LKYzyaX" isRoot="false" isAbstract="true" name="InputStream" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="veycFmCVOnie" client="zhVfgpENwAeN" name="" supplier="yBk69LKYzyaX" />
+      <UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="VDAdlQhZ750q" isRoot="false" isAbstract="false" name="ImageFormat" >
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="VDAdlQhZ750q" xmi.id="NPNgtZqJFAtE" isRoot="false" isAbstract="false" name="PNG" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="VDAdlQhZ750q" xmi.id="2W24K4edixcf" isRoot="false" isAbstract="false" name="SVG" />
+       <UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="VDAdlQhZ750q" xmi.id="kjad3bVP0s5s" isRoot="false" isAbstract="false" name="GIF" />
+      </UML:Enumeration>
+     </UML:Namespace.ownedElement>
+     <XMI.extension xmi.extender="umbrello" >
+      <diagrams>
+       <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1042" snapy="10" showatts="1" xmi.id="VfRLtV4Z9Ptg" documentation="" type="1" showops="1" showpackage="0" name="Source listing classes" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" canvasheight="860" >
+        <widgets>
+         <classwidget usesdiagramfillcolor="0" width="428" showattsigs="601" x="504" fillcolor="#ffffc0" y="464" drawascircle="0" showopsigs="601" linewidth="none" height="72" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="gGNje78ValnI" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,1,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="1" width="62" showattsigs="601" x="862" fillcolor="none" y="200" showopsigs="601" linewidth="none" height="36" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="UY72E0ULeXyT" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,75,0,0,0,0,0" linecolor="none" />
+         <classwidget usesdiagramfillcolor="0" width="175" showattsigs="601" x="135" fillcolor="#ffffc0" y="236" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="OcpJQugxHW8F" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,0,0,0,0,0" linecolor="#ff0000" />
+         <interfacewidget usesdiagramfillcolor="0" width="368" x="643" fillcolor="#ffffc0" y="291" drawascircle="0" showopsigs="601" linewidth="none" height="81" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="zhVfgpENwAeN" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,1,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="145" showattsigs="601" x="404" fillcolor="#ffffc0" y="747" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="qxq04A8rywIb" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="145" showattsigs="601" x="559" fillcolor="#ffffc0" y="747" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="w884b40YcIag" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="145" showattsigs="601" x="714" fillcolor="#ffffc0" y="747" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="B92ON93E7uE9" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="145" showattsigs="601" x="869" fillcolor="#ffffc0" y="747" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="2MyyGGXAPfEy" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="411" showattsigs="601" x="17" fillcolor="#ffffc0" y="582" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="haoxC1oM2QVz" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="226" showattsigs="601" x="109" fillcolor="#ffffc0" y="482" drawascircle="0" showopsigs="601" linewidth="none" height="54" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="m1ftLgsc5LXQ" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,1,0,0,0,0" linecolor="#ff0000" />
+         <interfacewidget usesdiagramfillcolor="0" width="411" x="17" fillcolor="#ffffc0" y="355" drawascircle="0" showopsigs="601" linewidth="none" height="81" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="DdhFJyNQcQSm" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+         <interfacewidget usesdiagramfillcolor="1" width="127" x="498" fillcolor="none" y="324" drawascircle="0" showopsigs="601" linewidth="none" height="54" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="QbirDWtuKiBS" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,75,1,0,0,0,0" linecolor="none" />
+         <interfacewidget usesdiagramfillcolor="1" width="113" x="690" fillcolor="none" y="182" drawascircle="0" showopsigs="601" linewidth="none" height="54" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="yBk69LKYzyaX" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,75,1,0,0,0,0" linecolor="none" />
+        </widgets>
+        <messages/>
+        <associations>
+         <assocwidget totalcounta="4" indexa="3" totalcountb="2" indexb="1" linewidth="none" widgetbid="zhVfgpENwAeN" widgetaid="gGNje78ValnI" xmi.id="xxCyboRg8fju" type="511" linecolor="none" >
+          <linepath>
+           <startpoint startx="825" starty="464" />
+           <endpoint endx="827" endy="372" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="5" indexb="4" linewidth="none" widgetbid="gGNje78ValnI" widgetaid="2MyyGGXAPfEy" xmi.id="jNbdqaYMr5vR" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="965" starty="747" />
+           <endpoint endx="846" endy="536" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="5" indexb="3" linewidth="none" widgetbid="gGNje78ValnI" widgetaid="B92ON93E7uE9" xmi.id="FbDTu6ZqYxZ5" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="810" starty="747" />
+           <endpoint endx="760" endy="536" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="5" indexb="2" linewidth="none" widgetbid="gGNje78ValnI" widgetaid="w884b40YcIag" xmi.id="1tZ6hQ3Znq07" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="655" starty="747" />
+           <endpoint endx="675" endy="536" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="5" indexb="1" linewidth="none" widgetbid="gGNje78ValnI" widgetaid="qxq04A8rywIb" xmi.id="u534X7uMBIy5" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="500" starty="747" />
+           <endpoint endx="589" endy="536" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="5" indexa="4" totalcountb="3" indexb="1" linewidth="none" widgetbid="2MyyGGXAPfEy" widgetaid="haoxC1oM2QVz" xmi.id="KxhR786WWKiA" type="512" linecolor="none" >
+          <linepath>
+           <startpoint startx="345" starty="627" />
+           <endpoint endx="917" endy="747" />
+           <point x="846" y="686" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="5" indexa="3" totalcountb="3" indexb="1" linewidth="none" widgetbid="B92ON93E7uE9" widgetaid="haoxC1oM2QVz" xmi.id="036VnHDG2xBH" type="512" linecolor="none" >
+          <linepath>
+           <startpoint startx="263" starty="627" />
+           <endpoint endx="762" endy="747" />
+           <point x="693" y="689" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="5" indexa="2" totalcountb="3" indexb="1" linewidth="none" widgetbid="w884b40YcIag" widgetaid="haoxC1oM2QVz" xmi.id="MPnzJ9f0egCU" type="512" linecolor="none" >
+          <linepath>
+           <startpoint startx="181" starty="627" />
+           <endpoint endx="607" endy="747" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="5" indexa="1" totalcountb="3" indexb="1" linewidth="none" widgetbid="qxq04A8rywIb" widgetaid="haoxC1oM2QVz" xmi.id="qQ8ZNcL54wHR" type="512" linecolor="none" >
+          <linepath>
+           <startpoint startx="99" starty="627" />
+           <endpoint endx="452" endy="747" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="4" indexa="1" visibilityB="200" totalcountb="3" indexb="2" linewidth="none" widgetbid="DdhFJyNQcQSm" widgetaid="gGNje78ValnI" xmi.id="hcALY1fmWlEG" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
+          <linepath>
+           <startpoint startx="611" starty="464" />
+           <endpoint endx="428" endy="409" />
+           <point x="541" y="409" />
+          </linepath>
+          <floatingtext usesdiagramfillcolor="1" width="66" x="448" fillcolor="none" y="410" linewidth="none" posttext="" role="710" height="22" usefillcolor="1" pretext="#" isinstance="0" xmi.id="zbXkpXlCS0lr" text="factory" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="DdhFJyNQcQSm" widgetaid="m1ftLgsc5LXQ" xmi.id="M1DRAGcxqQmM" type="511" linecolor="none" >
+          <linepath>
+           <startpoint startx="222" starty="482" />
+           <endpoint endx="222" endy="436" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="m1ftLgsc5LXQ" widgetaid="haoxC1oM2QVz" xmi.id="0zf0YojVOJsY" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="222" starty="582" />
+           <endpoint endx="222" endy="536" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="OcpJQugxHW8F" widgetaid="DdhFJyNQcQSm" xmi.id="6bs0V3Pr6aVg" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="222" starty="355" />
+           <endpoint endx="222" endy="281" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="2" indexb="1" linewidth="none" widgetbid="UY72E0ULeXyT" widgetaid="zhVfgpENwAeN" xmi.id="YFeUspY6csTF" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="888" starty="291" />
+           <endpoint endx="893" endy="236" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="4" indexa="2" totalcountb="2" indexb="1" linewidth="none" widgetbid="QbirDWtuKiBS" widgetaid="gGNje78ValnI" xmi.id="8nWBoU6zOpZ6" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="718" starty="464" />
+           <endpoint endx="561" endy="378" />
+           <point x="604" y="432" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="QbirDWtuKiBS" widgetaid="DdhFJyNQcQSm" xmi.id="0RBqSjye7dsd" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="428" starty="382" />
+           <endpoint endx="498" endy="351" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="yBk69LKYzyaX" widgetaid="zhVfgpENwAeN" xmi.id="veycFmCVOnie" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="765" starty="291" />
+           <endpoint endx="746" endy="236" />
+          </linepath>
+         </assocwidget>
+        </associations>
+       </diagram>
+       <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1042" snapy="10" showatts="1" xmi.id="BbQfy5JEWUGf" documentation="" type="1" showops="1" showpackage="0" name="Class graph classes" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" canvasheight="860" >
+        <widgets>
+         <classwidget usesdiagramfillcolor="0" width="386" showattsigs="601" x="304" fillcolor="#ffffc0" y="533" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="pwXaDeUXVlRv" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="168" showattsigs="601" x="201" fillcolor="#ffffc0" y="283" showopsigs="601" linewidth="none" height="36" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="85ASUVIYu8Rm" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+        </widgets>
+        <messages/>
+        <associations/>
+       </diagram>
+       <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1042" snapy="10" showatts="1" xmi.id="PnEBEL9IihdQ" documentation="" type="1" showops="1" showpackage="0" name="Module doc classes" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" canvasheight="860" >
+        <widgets/>
+        <messages/>
+        <associations/>
+       </diagram>
+       <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1042" snapy="10" showatts="1" xmi.id="i9im14LKfTmZ" documentation="" type="1" showops="1" showpackage="0" name="Module graph classes" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" canvasheight="860" >
+        <widgets>
+         <classwidget usesdiagramfillcolor="0" width="386" showattsigs="601" x="307" fillcolor="#ffffc0" y="545" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="098RWfwZqN4L" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="194" showattsigs="601" x="197" fillcolor="#ffffc0" y="276" showopsigs="601" linewidth="none" height="36" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="R1LMLXi8zBZD" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+        </widgets>
+        <messages/>
+        <associations/>
+       </diagram>
+       <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1042" snapy="10" showatts="1" xmi.id="HBjs7fL0WfO5" documentation="" type="1" showops="1" showpackage="0" name="General classes" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" canvasheight="860" >
+        <widgets>
+         <enumwidget usesdiagramfillcolor="0" width="162" x="98" fillcolor="#ffffc0" y="44" linewidth="none" height="108" usefillcolor="1" isinstance="0" xmi.id="58hyBKGITKzU" showpackage="0" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+         <enumwidget usesdiagramfillcolor="0" width="183" x="300" fillcolor="#ffffc0" y="44" linewidth="none" height="72" usefillcolor="1" isinstance="0" xmi.id="o5RT7D5TyDem" showpackage="0" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+        </widgets>
+        <messages/>
+        <associations/>
+       </diagram>
+       <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1042" snapy="10" showatts="1" xmi.id="37Q7pvtspjUI" documentation="" type="1" showops="1" showpackage="0" name="Graph classes" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" canvasheight="860" >
+        <widgets>
+         <classwidget usesdiagramfillcolor="0" width="330" showattsigs="601" x="324" fillcolor="#ffffc0" y="228" showopsigs="601" linewidth="none" height="162" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="FVtbgO8sd2ii" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <enumwidget usesdiagramfillcolor="0" width="172" x="62" fillcolor="#ffffc0" y="90" linewidth="none" height="90" usefillcolor="1" isinstance="0" xmi.id="4F09aHCjljSA" showpackage="0" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,1,0,0,0,0" linecolor="#ff0000" />
+         <interfacewidget usesdiagramfillcolor="0" width="375" x="622" fillcolor="#ffffc0" y="433" drawascircle="0" showopsigs="601" linewidth="none" height="63" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="2Mzl2VgeffI0" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="436" showattsigs="601" x="481" fillcolor="#ffffc0" y="546" drawascircle="0" showopsigs="601" linewidth="none" height="72" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="taceG4p7AY1k" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="236" showattsigs="601" x="70" fillcolor="#ffffc0" y="228" showopsigs="601" linewidth="none" height="189" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="672lM6F9KhcI" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="375" showattsigs="601" x="623" fillcolor="#ffffc0" y="766" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="ZUDChgtO8jSy" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <enumwidget usesdiagramfillcolor="0" width="110" x="434" fillcolor="#ffffc0" y="54" linewidth="none" height="126" usefillcolor="1" isinstance="0" xmi.id="BQqAv02HTM6x" showpackage="0" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="309" showattsigs="601" x="729" fillcolor="#ffffc0" y="234" showopsigs="601" linewidth="none" height="108" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="PILb9kCQnOZd" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <enumwidget usesdiagramfillcolor="0" width="136" x="815" fillcolor="#ffffc0" y="0" linewidth="none" height="180" usefillcolor="1" isinstance="0" xmi.id="uzw9DITFgRm2" showpackage="0" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,50,0,0,0,0,0" linecolor="#ff0000" />
+         <interfacewidget usesdiagramfillcolor="0" width="338" x="19" fillcolor="#ffffc0" y="440" drawascircle="0" showopsigs="601" linewidth="none" height="81" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="H9NLXsg0Hncp" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="250" showattsigs="601" x="63" fillcolor="#ffffc0" y="554" drawascircle="0" showopsigs="601" linewidth="none" height="54" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="GIPhxHkszygs" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="319" showattsigs="601" x="29" fillcolor="#ffffc0" y="646" showopsigs="601" linewidth="none" height="63" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="vJ8WmfZPiVQE" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="156" showattsigs="601" x="296" fillcolor="#ffffc0" y="766" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="leYQpk5LWBlE" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <classwidget usesdiagramfillcolor="0" width="147" showattsigs="601" x="464" fillcolor="#ffffc0" y="766" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="cQGGEupKkEKw" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <interfacewidget usesdiagramfillcolor="1" width="127" x="426" fillcolor="none" y="423" drawascircle="0" showopsigs="601" linewidth="none" height="54" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="QbirDWtuKiBS" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,75,1,0,0,0,0" linecolor="none" />
+         <enumwidget usesdiagramfillcolor="0" width="112" x="259" fillcolor="#ffffc0" y="90" linewidth="none" height="90" usefillcolor="1" isinstance="0" xmi.id="VDAdlQhZ750q" showpackage="0" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,0,75,1,0,0,0,0" linecolor="#ff0000" />
+        </widgets>
+        <messages/>
+        <associations>
+         <assocwidget totalcounta="4" indexa="3" totalcountb="2" indexb="1" linewidth="none" widgetbid="2Mzl2VgeffI0" widgetaid="taceG4p7AY1k" xmi.id="YFH3CyxPGsNY" type="511" linecolor="none" >
+          <linepath>
+           <startpoint startx="808" starty="546" />
+           <endpoint endx="809" endy="496" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="4" indexb="3" linewidth="none" widgetbid="taceG4p7AY1k" widgetaid="ZUDChgtO8jSy" xmi.id="gO9JCUKh4zz7" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="873" starty="766" />
+           <endpoint endx="808" endy="618" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="4" indexb="1" linewidth="none" widgetbid="FVtbgO8sd2ii" widgetaid="PILb9kCQnOZd" xmi.id="Aq7LuhClDFeB" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
+          <linepath>
+           <startpoint startx="729" starty="270" />
+           <endpoint endx="654" endy="268" />
+          </linepath>
+          <floatingtext usesdiagramfillcolor="1" width="76" x="653" fillcolor="none" y="246" linewidth="none" posttext="" role="710" height="22" usefillcolor="1" pretext="-" isinstance="0" xmi.id="v0msW7sgOVcJ" text="incoming" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="uzw9DITFgRm2" widgetaid="PILb9kCQnOZd" xmi.id="eaFFJAnvNrxh" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
+          <linepath>
+           <startpoint startx="883" starty="234" />
+           <endpoint endx="883" endy="180" />
+          </linepath>
+          <floatingtext usesdiagramfillcolor="1" width="43" x="838" fillcolor="none" y="182" linewidth="none" posttext="" role="710" height="22" usefillcolor="1" pretext="-" isinstance="0" xmi.id="XKgRPSjN3G7s" text="type" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="4" indexb="2" linewidth="none" widgetbid="FVtbgO8sd2ii" widgetaid="PILb9kCQnOZd" xmi.id="xg3pIv6gVUUO" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
+          <linepath>
+           <startpoint startx="729" starty="306" />
+           <endpoint endx="654" endy="309" />
+          </linepath>
+          <floatingtext usesdiagramfillcolor="1" width="75" x="649" fillcolor="none" y="309" linewidth="none" posttext="" role="710" height="22" usefillcolor="1" pretext="-" isinstance="0" xmi.id="ns2Esn3lmpbG" text="outgoing" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" totalcountb="4" indexb="3" linewidth="none" widgetbid="FVtbgO8sd2ii" widgetaid="2Mzl2VgeffI0" xmi.id="m7wwiwCSxVGR" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="747" starty="433" />
+           <endpoint endx="654" endy="349" />
+           <point x="714" y="385" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="2" indexb="1" linewidth="none" widgetbid="PILb9kCQnOZd" widgetaid="2Mzl2VgeffI0" xmi.id="R79vj31U6PK0" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="872" starty="433" />
+           <endpoint endx="883" endy="342" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="H9NLXsg0Hncp" widgetaid="GIPhxHkszygs" xmi.id="Pef9sSrIGFql" type="511" linecolor="none" >
+          <linepath>
+           <startpoint startx="188" starty="554" />
+           <endpoint endx="188" endy="521" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="4" indexa="1" visibilityB="200" totalcountb="3" indexb="2" linewidth="none" widgetbid="H9NLXsg0Hncp" widgetaid="taceG4p7AY1k" xmi.id="jYgSGEsqagKv" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
+          <linepath>
+           <startpoint startx="590" starty="546" />
+           <endpoint endx="357" endy="494" />
+           <point x="516" y="494" />
+          </linepath>
+          <floatingtext usesdiagramfillcolor="1" width="66" x="359" fillcolor="none" y="496" linewidth="none" posttext="" role="710" height="22" usefillcolor="1" pretext="#" isinstance="0" xmi.id="icdjqjacbcqS" text="factory" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="672lM6F9KhcI" widgetaid="H9NLXsg0Hncp" xmi.id="p0keVPRrye6f" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="188" starty="440" />
+           <endpoint endx="188" endy="417" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="4" indexb="2" linewidth="none" widgetbid="taceG4p7AY1k" widgetaid="cQGGEupKkEKw" xmi.id="Z4ZHkEV03W4k" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="562" starty="766" />
+           <endpoint endx="699" endy="618" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="4" indexb="1" linewidth="none" widgetbid="taceG4p7AY1k" widgetaid="leYQpk5LWBlE" xmi.id="51RZVXixdhgF" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="400" starty="766" />
+           <endpoint endx="590" endy="618" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="QbirDWtuKiBS" widgetaid="H9NLXsg0Hncp" xmi.id="0e7qU7vxuugt" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="357" starty="467" />
+           <endpoint endx="426" endy="450" />
+           <point x="409" y="467" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="GIPhxHkszygs" widgetaid="vJ8WmfZPiVQE" xmi.id="kOBlgJz6y2Lz" type="500" linecolor="none" >
+          <linepath>
+           <startpoint startx="188" starty="646" />
+           <endpoint endx="188" endy="608" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" totalcountb="3" indexb="1" linewidth="none" widgetbid="leYQpk5LWBlE" widgetaid="vJ8WmfZPiVQE" xmi.id="jUfTITIIjhSw" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="135" starty="709" />
+           <endpoint endx="348" endy="766" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="3" indexb="1" linewidth="none" widgetbid="cQGGEupKkEKw" widgetaid="vJ8WmfZPiVQE" xmi.id="ntBujkSHp8rF" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="241" starty="709" />
+           <endpoint endx="513" endy="766" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" totalcountb="3" indexb="1" linewidth="none" widgetbid="ZUDChgtO8jSy" widgetaid="vJ8WmfZPiVQE" xmi.id="oG7IcloUW5iz" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="348" starty="677" />
+           <endpoint endx="748" endy="766" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="4" indexa="2" totalcountb="2" indexb="1" linewidth="none" widgetbid="QbirDWtuKiBS" widgetaid="taceG4p7AY1k" xmi.id="6E5Os60E5bNw" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="699" starty="546" />
+           <endpoint endx="553" endy="450" />
+           <point x="679" y="524" />
+           <point x="597" y="524" />
+           <point x="597" y="494" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="BQqAv02HTM6x" widgetaid="FVtbgO8sd2ii" xmi.id="VXmaXhPeKk9I" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
+          <linepath>
+           <startpoint startx="489" starty="228" />
+           <endpoint endx="489" endy="180" />
+          </linepath>
+          <floatingtext usesdiagramfillcolor="1" width="41" x="446" fillcolor="none" y="182" linewidth="none" posttext="" role="710" height="22" usefillcolor="1" pretext="-" isinstance="0" xmi.id="OtDAgpQaGKsD" text="type" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="4F09aHCjljSA" widgetaid="672lM6F9KhcI" xmi.id="zRuotD7A5ZEx" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
+          <linepath>
+           <startpoint startx="148" starty="228" />
+           <endpoint endx="148" endy="180" />
+          </linepath>
+          <floatingtext usesdiagramfillcolor="1" width="56" x="150" fillcolor="none" y="182" linewidth="none" posttext="" role="710" height="22" usefillcolor="1" pretext="-" isinstance="0" xmi.id="431nLOrSgmJx" text="format" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="VDAdlQhZ750q" widgetaid="672lM6F9KhcI" xmi.id="dMwwhlSnUoPh" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
+          <linepath>
+           <startpoint startx="227" starty="228" />
+           <endpoint endx="315" endy="180" />
+          </linepath>
+          <floatingtext usesdiagramfillcolor="1" width="99" x="273" fillcolor="none" y="196" linewidth="none" posttext="" role="710" height="22" usefillcolor="1" pretext="-" isinstance="0" xmi.id="ox6exKnKRPMI" text="imageFormat" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </assocwidget>
+        </associations>
+       </diagram>
+       <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1042" snapy="10" showatts="1" xmi.id="cZsSOYL0vMYc" documentation="" type="3" showops="1" showpackage="0" name="Graph generation" localid="fNm3GNcdo5oo" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" canvasheight="860" >
+        <widgets>
+         <objectwidget usesdiagramfillcolor="0" width="191" x="432" fillcolor="#ffffc0" y="48" instancename="" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="vJ8WmfZPiVQE" decon="0" localid="xkkShjnglZDn" multipleinstance="0" drawasactor="0" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,1,0,0,0" linecolor="#ff0000" />
+         <objectwidget usesdiagramfillcolor="0" width="82" x="846" fillcolor="#ffffc0" y="48" instancename="" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="ZUDChgtO8jSy" decon="0" localid="5sYVesgRYawR" multipleinstance="0" drawasactor="0" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,1,0,0,0" linecolor="#ff0000" />
+         <objectwidget usesdiagramfillcolor="0" width="144" x="37" fillcolor="#ffffc0" y="48" instancename="" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="R1LMLXi8zBZD" decon="0" localid="8k1etAbDCjb4" multipleinstance="0" drawasactor="0" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,1,0,0,0" linecolor="#ff0000" />
+         <notewidget usesdiagramfillcolor="1" width="130" x="558" fillcolor="none" y="105" linewidth="none" height="63" usefillcolor="1" isinstance="0" xmi.id="mi9i1VrBEe8P" text="Common graph settings are bound first." usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         <notewidget usesdiagramfillcolor="1" width="205" x="241" fillcolor="none" y="207" linewidth="none" height="50" usefillcolor="1" isinstance="0" xmi.id="AvASsvve1luo" text="A new writer is usually created for each graph file." usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         <notewidget usesdiagramfillcolor="1" width="194" x="214" fillcolor="none" y="455" linewidth="none" height="50" usefillcolor="1" isinstance="0" xmi.id="pnt8L3mW94H6" text="Writer can be used to generate several graphs." usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+        </widgets>
+        <messages>
+         <messagewidget usesdiagramfillcolor="1" width="412" x="123" fillcolor="none" y="98" operation="rSVt3npBuRwI" linewidth="none" widgetbid="xkkShjnglZDn" height="32" usefillcolor="1" seqnum="" textid="17kr4cTMN71P" widgetaid="8k1etAbDCjb4" isinstance="0" xmi.id="rSVt3npBuRwI" sequencemessagetype="1000" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" >
+          <floatingtext usesdiagramfillcolor="1" width="233" x="128" fillcolor="none" y="76" linewidth="none" posttext="" role="704" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="17kr4cTMN71P" text=": this(options : GraphWriterOptions)" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </messagewidget>
+         <messagewidget usesdiagramfillcolor="1" width="412" x="123" fillcolor="none" y="284" operation="qt3yjRHa0HmR" linewidth="none" widgetbid="xkkShjnglZDn" height="73" usefillcolor="1" seqnum="" textid="8R7413dyF3lY" widgetaid="8k1etAbDCjb4" isinstance="0" xmi.id="qt3yjRHa0HmR" sequencemessagetype="1000" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" >
+          <floatingtext usesdiagramfillcolor="1" width="306" x="128" fillcolor="none" y="262" linewidth="none" posttext="" role="704" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="8R7413dyF3lY" text=": createGraphWriter(outputs : OutputStream[])" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </messagewidget>
+         <messagewidget usesdiagramfillcolor="1" width="368" x="527" fillcolor="none" y="304" operation="RhFDP34VCWM4" linewidth="none" widgetbid="5sYVesgRYawR" height="32" usefillcolor="1" seqnum="" textid="KpN7JYvOVJ7T" widgetaid="xkkShjnglZDn" isinstance="0" xmi.id="RhFDP34VCWM4" sequencemessagetype="1000" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" >
+          <floatingtext usesdiagramfillcolor="1" width="399" x="532" fillcolor="none" y="282" linewidth="none" posttext="" role="704" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="KpN7JYvOVJ7T" text=": this(factory : GraphWriterFactory, outputs : OutputStream[])" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </messagewidget>
+         <messagewidget usesdiagramfillcolor="1" width="772" x="123" fillcolor="none" y="537" operation="nXwHg6RtyC4B" linewidth="none" widgetbid="5sYVesgRYawR" height="32" usefillcolor="1" seqnum="" textid="CUWS73hkulgU" widgetaid="8k1etAbDCjb4" isinstance="0" xmi.id="nXwHg6RtyC4B" sequencemessagetype="1000" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" >
+          <floatingtext usesdiagramfillcolor="1" width="338" x="249" fillcolor="none" y="515" linewidth="none" posttext="" role="704" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="CUWS73hkulgU" text=": generateGraph(vertices : Vertex[], edges : Edge[])" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="none" />
+         </messagewidget>
+        </messages>
+        <associations/>
+       </diagram>
+      </diagrams>
+     </XMI.extension>
+    </UML:Model>
+    <UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Use Case View" isRoot="false" isAbstract="false" name="Use Case View" >
+     <UML:Namespace.ownedElement/>
+    </UML:Model>
+    <UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Component View" isRoot="false" isAbstract="false" name="Component View" >
+     <UML:Namespace.ownedElement>
+      <UML:Component executable="0" isSpecification="false" isLeaf="false" visibility="public" namespace="Component View" xmi.id="3XF2INiTN1r0" isRoot="false" isAbstract="false" name="DocumentGenerator" />
+      <UML:Component executable="0" isSpecification="false" isLeaf="false" visibility="public" namespace="Component View" xmi.id="JrRpdxcmaX5Z" isRoot="false" isAbstract="false" name="ModuleDoc" />
+      <UML:Component executable="0" isSpecification="false" isLeaf="false" visibility="public" namespace="Component View" xmi.id="oCHM2Pm3w15E" isRoot="false" isAbstract="false" name="SourceListing" />
+      <UML:Component executable="0" isSpecification="false" isLeaf="false" visibility="public" namespace="Component View" xmi.id="OmgklXk4NCu0" isRoot="false" isAbstract="false" name="ModuleGraph" />
+      <UML:Component executable="0" isSpecification="false" isLeaf="false" visibility="public" namespace="Component View" xmi.id="9Wmh3pGp1WC1" isRoot="false" isAbstract="false" name="ClassGraph" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="9zv0am0s4p3H" client="3XF2INiTN1r0" name="" supplier="9Wmh3pGp1WC1" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="7Qg9DhQeLLiC" client="3XF2INiTN1r0" name="" supplier="OmgklXk4NCu0" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="TCboYJyLq3UQ" client="3XF2INiTN1r0" name="" supplier="JrRpdxcmaX5Z" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="3BrrELHlDrWv" client="3XF2INiTN1r0" name="" supplier="oCHM2Pm3w15E" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="G51CBWFaF9t3" client="3XF2INiTN1r0" name="" supplier="9Wmh3pGp1WC1" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="sgHau3wyChzY" client="3XF2INiTN1r0" name="" supplier="OmgklXk4NCu0" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="8Xdyj7yz61iY" client="3XF2INiTN1r0" name="" supplier="JrRpdxcmaX5Z" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="YbwqcMQKAE7f" client="3XF2INiTN1r0" name="" supplier="oCHM2Pm3w15E" />
+      <UML:Component executable="0" isSpecification="false" isLeaf="false" visibility="public" namespace="Component View" xmi.id="JeCajbMGRVUn" isRoot="false" isAbstract="false" name="Parser&amp;Lexer" />
+      <UML:Dependency isSpecification="false" visibility="public" namespace="Component View" xmi.id="ZZ3AIK4OAcIw" client="3XF2INiTN1r0" name="" supplier="JeCajbMGRVUn" />
+     </UML:Namespace.ownedElement>
+     <XMI.extension xmi.extender="umbrello" >
+      <diagrams>
+       <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1042" snapy="10" showatts="1" xmi.id="9cvLzH7kYq8S" documentation="" type="7" showops="1" showpackage="0" name="high level components" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,10,-1,0,50,0,0,0,0,0" linecolor="#ff0000" canvasheight="860" >
+        <widgets>
+         <componentwidget usesdiagramfillcolor="1" width="223" x="380" fillcolor="none" y="310" linewidth="none" height="66" usefillcolor="1" isinstance="0" xmi.id="3XF2INiTN1r0" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,75,0,0,0,0,0" linecolor="none" />
+         <componentwidget usesdiagramfillcolor="0" width="230" x="183" fillcolor="#ffffc0" y="447" linewidth="none" height="66" usefillcolor="1" isinstance="0" xmi.id="JrRpdxcmaX5Z" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <componentwidget usesdiagramfillcolor="0" width="201" x="568" fillcolor="#ffffc0" y="447" linewidth="none" height="66" usefillcolor="1" isinstance="0" xmi.id="oCHM2Pm3w15E" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+         <componentwidget usesdiagramfillcolor="0" width="247" x="166" fillcolor="#ffffc0" y="158" linewidth="none" height="66" usefillcolor="1" isinstance="0" xmi.id="OmgklXk4NCu0" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,1,0,0,0,0" linecolor="#ff0000" />
+         <componentwidget usesdiagramfillcolor="0" width="279" x="568" fillcolor="#ffffc0" y="158" linewidth="none" height="66" usefillcolor="1" isinstance="0" xmi.id="9Wmh3pGp1WC1" usesdiagramusefillcolor="0" font="Sans Serif,10,-1,5,75,0,0,0,0,0" linecolor="#ff0000" />
+         <componentwidget usesdiagramfillcolor="1" width="159" x="98" fillcolor="none" y="310" linewidth="none" height="66" usefillcolor="1" isinstance="0" xmi.id="JeCajbMGRVUn" usesdiagramusefillcolor="1" font="Sans Serif,10,-1,0,75,0,0,0,0,0" linecolor="none" />
+        </widgets>
+        <messages/>
+        <associations>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="2" indexb="1" linewidth="none" widgetbid="9Wmh3pGp1WC1" widgetaid="3XF2INiTN1r0" xmi.id="G51CBWFaF9t3" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="528" starty="310" />
+           <endpoint endx="707" endy="224" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="OmgklXk4NCu0" widgetaid="3XF2INiTN1r0" xmi.id="sgHau3wyChzY" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="454" starty="310" />
+           <endpoint endx="289" endy="224" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="JrRpdxcmaX5Z" widgetaid="3XF2INiTN1r0" xmi.id="8Xdyj7yz61iY" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="454" starty="376" />
+           <endpoint endx="298" endy="447" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="3" indexa="2" totalcountb="2" indexb="1" linewidth="none" widgetbid="oCHM2Pm3w15E" widgetaid="3XF2INiTN1r0" xmi.id="YbwqcMQKAE7f" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="528" starty="376" />
+           <endpoint endx="668" endy="447" />
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="JeCajbMGRVUn" widgetaid="3XF2INiTN1r0" xmi.id="ZZ3AIK4OAcIw" type="502" linecolor="none" >
+          <linepath>
+           <startpoint startx="380" starty="343" />
+           <endpoint endx="257" endy="343" />
+          </linepath>
+         </assocwidget>
+        </associations>
+       </diagram>
+      </diagrams>
+     </XMI.extension>
+    </UML:Model>
+    <UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Deployment View" isRoot="false" isAbstract="false" name="Deployment View" >
+     <UML:Namespace.ownedElement/>
+    </UML:Model>
+    <UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Entity Relationship Model" isRoot="false" isAbstract="false" name="Entity Relationship Model" >
+     <UML:Namespace.ownedElement/>
+    </UML:Model>
+   </UML:Namespace.ownedElement>
+  </UML:Model>
+ </XMI.content>
+ <XMI.extensions xmi.extender="umbrello" >
+  <docsettings viewid="i9im14LKfTmZ" documentation="" uniqueid="0HtRJDvsLArx" />
+  <listview>
+   <listitem open="1" type="800" label="Näytöt" >
+    <listitem open="1" type="801" id="Logical View" >
+     <listitem open="0" type="807" id="BbQfy5JEWUGf" label="Class graph classes" />
+     <listitem open="0" type="807" id="HBjs7fL0WfO5" label="General classes" />
+     <listitem open="0" type="807" id="37Q7pvtspjUI" label="Graph classes" />
+     <listitem open="0" type="807" id="PnEBEL9IihdQ" label="Module doc classes" />
+     <listitem open="0" type="807" id="i9im14LKfTmZ" label="Module graph classes" />
+     <listitem open="0" type="807" id="VfRLtV4Z9Ptg" label="Source listing classes" />
+     <listitem open="0" type="810" id="cZsSOYL0vMYc" label="Graph generation" />
+     <listitem open="0" type="813" id="m1ftLgsc5LXQ" >
+      <listitem open="0" type="814" id="xswAJre2CrPi" />
+      <listitem open="0" type="815" id="mZ1wtQujXunn" />
+     </listitem>
+     <listitem open="0" type="813" id="taceG4p7AY1k" >
+      <listitem open="0" type="814" id="jYgSGEsqagKv" />
+      <listitem open="0" type="814" id="4Bqtwxx8p0pI" />
+      <listitem open="0" type="815" id="RhFDP34VCWM4" />
+     </listitem>
+     <listitem open="0" type="813" id="GIPhxHkszygs" >
+      <listitem open="0" type="814" id="ZmI5M1aN978M" />
+      <listitem open="0" type="815" id="liEDYXNQ5pTO" />
+     </listitem>
+     <listitem open="0" type="813" id="gGNje78ValnI" >
+      <listitem open="0" type="814" id="hcALY1fmWlEG" />
+      <listitem open="0" type="814" id="9QXgkpqgA1Du" />
+      <listitem open="0" type="815" id="Aa3THxJUbPoV" />
+     </listitem>
+     <listitem open="0" type="813" id="pwXaDeUXVlRv" >
+      <listitem open="0" type="815" id="RDl3vCbldkit" />
+     </listitem>
+     <listitem open="0" type="813" id="85ASUVIYu8Rm" />
+     <listitem open="1" type="813" id="OcpJQugxHW8F" >
+      <listitem open="0" type="814" id="gOHG3iCLbStZ" />
+     </listitem>
+     <listitem open="0" type="813" id="haoxC1oM2QVz" >
+      <listitem open="0" type="815" id="2SrUGMptabML" />
+     </listitem>
+     <listitem open="1" type="813" id="vJ8WmfZPiVQE" >
+      <listitem open="0" type="815" id="rSVt3npBuRwI" />
+      <listitem open="0" type="815" id="qt3yjRHa0HmR" />
+     </listitem>
+     <listitem open="0" type="813" id="ZUDChgtO8jSy" >
+      <listitem open="0" type="815" id="nXwHg6RtyC4B" />
+     </listitem>
+     <listitem open="1" type="813" id="PILb9kCQnOZd" >
+      <listitem open="0" type="814" id="Aq7LuhClDFeB" />
+      <listitem open="0" type="814" id="xg3pIv6gVUUO" />
+      <listitem open="0" type="814" id="eaFFJAnvNrxh" />
+      <listitem open="0" type="815" id="p2AAWOx6E09l" />
+      <listitem open="0" type="815" id="faPqILFpZIBc" />
+     </listitem>
+     <listitem open="0" type="813" id="XjtDAoectTTH" />
+     <listitem open="1" type="813" id="672lM6F9KhcI" >
+      <listitem open="0" type="814" id="zRuotD7A5ZEx" />
+      <listitem open="0" type="814" id="dMwwhlSnUoPh" />
+      <listitem open="0" type="814" id="E1vnjmQdHkkv" />
+      <listitem open="0" type="814" id="cGQrznU4axXm" />
+      <listitem open="0" type="814" id="UirRcvN0JEsV" />
+      <listitem open="0" type="814" id="AQlvQmLLBkXo" />
+      <listitem open="0" type="814" id="vOQEdHhXSPF8" />
+      <listitem open="0" type="814" id="TrfH97Bbn23Q" />
+      <listitem open="0" type="814" id="uBkkfpbvggDX" />
+     </listitem>
+     <listitem open="0" type="813" id="w884b40YcIag" >
+      <listitem open="0" type="815" id="mBRaST74dftD" />
+     </listitem>
+     <listitem open="0" type="813" id="B92ON93E7uE9" >
+      <listitem open="0" type="815" id="JpwoOQQ4RzaO" />
+     </listitem>
+     <listitem open="0" type="813" id="098RWfwZqN4L" >
+      <listitem open="0" type="815" id="CMMapfT5KiQP" />
+     </listitem>
+     <listitem open="0" type="813" id="R1LMLXi8zBZD" />
+     <listitem open="1" type="813" id="leYQpk5LWBlE" >
+      <listitem open="0" type="815" id="VR6VNEtfCgkY" />
+     </listitem>
+     <listitem open="1" type="813" id="cQGGEupKkEKw" >
+      <listitem open="0" type="815" id="wEWZIkURw0Kn" />
+     </listitem>
+     <listitem open="0" type="813" id="3qQutO5Yhxt6" />
+     <listitem open="0" type="813" id="UY72E0ULeXyT" />
+     <listitem open="0" type="813" id="Ug6grrz7llbI" />
+     <listitem open="0" type="813" id="2MyyGGXAPfEy" >
+      <listitem open="0" type="815" id="VRgNwkJTDt0B" />
+     </listitem>
+     <listitem open="1" type="813" id="FVtbgO8sd2ii" >
+      <listitem open="0" type="814" id="cf98eu4OpFbX" />
+      <listitem open="0" type="814" id="hgsYJ2YnnaVS" />
+      <listitem open="0" type="814" id="sBVGlTogVHfE" />
+      <listitem open="0" type="814" id="ajeRzBpBzXm2" />
+      <listitem open="0" type="814" id="hTSa11gAdwIE" />
+      <listitem open="0" type="814" id="VXmaXhPeKk9I" />
+      <listitem open="0" type="815" id="2fXtbb2YF7TG" />
+      <listitem open="0" type="815" id="PX2Y1eFKtaj6" />
+     </listitem>
+     <listitem open="0" type="813" id="qxq04A8rywIb" >
+      <listitem open="0" type="815" id="KoEO9zJwTXuD" />
+     </listitem>
+     <listitem open="0" type="817" id="zhVfgpENwAeN" >
+      <listitem open="0" type="815" id="eGKXDits9Kho" />
+      <listitem open="0" type="815" id="fA2So7Re6pf2" />
+     </listitem>
+     <listitem open="0" type="817" id="DdhFJyNQcQSm" >
+      <listitem open="0" type="815" id="QR4frQ4pllIy" />
+      <listitem open="0" type="815" id="GL3CAg7Qy0PF" />
+     </listitem>
+     <listitem open="0" type="817" id="2Mzl2VgeffI0" >
+      <listitem open="0" type="815" id="kluUKuajlkAu" />
+     </listitem>
+     <listitem open="0" type="817" id="H9NLXsg0Hncp" >
+      <listitem open="0" type="815" id="FYgiWJyDqrhK" />
+      <listitem open="0" type="815" id="L1C3szmMnzpw" />
+     </listitem>
+     <listitem open="0" type="817" id="yBk69LKYzyaX" />
+     <listitem open="0" type="817" id="QbirDWtuKiBS" />
+     <listitem open="0" type="830" id="Datatypes" >
+      <listitem open="1" type="829" id="DaFOT7jBVtui" />
+      <listitem open="1" type="829" id="tblJnk8mwuii" />
+      <listitem open="1" type="829" id="QXgD4zE4FsCt" />
+      <listitem open="1" type="829" id="UGpWCc0uWy3g" />
+      <listitem open="1" type="829" id="EaC7G8UkzGbk" />
+      <listitem open="1" type="829" id="MGwAYPpykhTm" />
+      <listitem open="1" type="829" id="clKKQl7eLHlZ" />
+      <listitem open="1" type="829" id="z3jKRbJnqFxM" />
+      <listitem open="1" type="829" id="wMWsornjU1NO" />
+      <listitem open="1" type="829" id="N7BDN7YzqsIG" />
+      <listitem open="1" type="829" id="NFJMWv4VyoqO" />
+      <listitem open="1" type="829" id="wERn1lAgB0KQ" />
+      <listitem open="0" type="829" id="zgj70ST7PbVQ" />
+      <listitem open="1" type="829" id="cPuvefV1toMN" />
+      <listitem open="1" type="829" id="IL68COOolGjP" />
+      <listitem open="1" type="829" id="hQqeEe2cmDn9" />
+     </listitem>
+     <listitem open="0" type="831" id="o5RT7D5TyDem" >
+      <listitem open="0" type="839" id="pCzlo8cW1N0o" />
+      <listitem open="0" type="839" id="FS23UTFrinBx" />
+     </listitem>
+     <listitem open="0" type="831" id="58hyBKGITKzU" >
+      <listitem open="0" type="839" id="jnhozkQ1UqIp" />
+      <listitem open="0" type="839" id="DhN6TjTmtUai" />
+      <listitem open="0" type="839" id="eyKevtlegQQd" />
+      <listitem open="0" type="839" id="9qedeuTpcot5" />
+     </listitem>
+     <listitem open="0" type="831" id="uzw9DITFgRm2" >
+      <listitem open="0" type="839" id="Gv3YsqBCKi6E" />
+      <listitem open="0" type="839" id="A1QhopWR6xzK" />
+      <listitem open="0" type="839" id="OVYO1FWE3aSP" />
+      <listitem open="0" type="839" id="uXTHm0iw18dq" />
+      <listitem open="0" type="839" id="3Mv6vLTpsw6c" />
+      <listitem open="0" type="839" id="0BPEtKs5X9EB" />
+      <listitem open="0" type="839" id="w8F05EKRiqqj" />
+      <listitem open="0" type="839" id="OQEcUiDMf7Wr" />
+     </listitem>
+     <listitem open="0" type="831" id="4F09aHCjljSA" >
+      <listitem open="0" type="839" id="Uhfew917nyad" />
+      <listitem open="0" type="839" id="Jy1fqRBSwrTe" />
+      <listitem open="0" type="839" id="aow2SW2oUhRP" />
+     </listitem>
+     <listitem open="1" type="831" id="VDAdlQhZ750q" >
+      <listitem open="0" type="839" id="NPNgtZqJFAtE" />
+      <listitem open="0" type="839" id="2W24K4edixcf" />
+      <listitem open="0" type="839" id="kjad3bVP0s5s" />
+     </listitem>
+     <listitem open="0" type="831" id="BQqAv02HTM6x" >
+      <listitem open="0" type="839" id="UWXR1uwj6Xht" />
+      <listitem open="0" type="839" id="KZH8gthgkYAr" />
+      <listitem open="0" type="839" id="GvOp2iAWCfvE" />
+      <listitem open="0" type="839" id="XsxdPcUh9joq" />
+      <listitem open="0" type="839" id="dTUN2eCIZb6Z" />
+     </listitem>
+    </listitem>
+    <listitem open="1" type="802" id="Use Case View" />
+    <listitem open="1" type="821" id="Component View" >
+     <listitem open="0" type="819" id="9cvLzH7kYq8S" label="high level components" />
+     <listitem open="1" type="822" id="9Wmh3pGp1WC1" />
+     <listitem open="1" type="822" id="3XF2INiTN1r0" />
+     <listitem open="1" type="822" id="JrRpdxcmaX5Z" />
+     <listitem open="1" type="822" id="OmgklXk4NCu0" />
+     <listitem open="1" type="822" id="JeCajbMGRVUn" />
+     <listitem open="1" type="822" id="oCHM2Pm3w15E" />
+    </listitem>
+    <listitem open="1" type="827" id="Deployment View" />
+    <listitem open="1" type="836" id="Entity Relationship Model" />
+   </listitem>
+  </listview>
+  <codegeneration>
+   <codegenerator language="C++" />
+  </codegeneration>
+ </XMI.extensions>
+</XMI>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/docgen.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,22 @@
+/**
+ * Author: Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module trunk.src.docgen.docgen;
+
+import docgen.modulegraph.writer;
+
+struct DocGeneratorOptions {
+  GraphWriterOptions graph;
+  ListingsOptions listings;
+  CommentFormat commentFormat;
+}
+
+/**
+ * Main routine for doc generation.
+ */
+class DocGenerator {
+  public static void generate() {
+
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/graphutils/dotwriter.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,97 @@
+/**
+ * Author: Aziz Köksal & Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.graphutils.dotwriter;
+import docgen.graphutils.writer;
+
+import tango.io.protocol.Writer : Writer;
+import tango.io.FileConduit : FileConduit;
+import tango.io.Print: Print;
+import tango.text.convert.Layout : Layout;
+
+
+/**
+ * Creates a graph rule file for the dot utility.
+ *
+ * TODO: support changing colors / graph style?
+ */
+class DotWriter : AbstractGraphWriter {
+  this(GraphWriterFactory factory, OutputStream[] outputs) {
+    super(factory, outputs);
+    assert(outputs.length == 2, "Wrong number of outputs");
+  }
+
+  void generateGraph(Vertex[] vertices, Edge[] edges) {
+    auto output2 = new Print!(char)(new Layout!(char), outputs[0]);
+    auto output = new Print!(char)(new Layout!(char), outputs[1]);
+
+    Vertex[][char[]] verticesByPckgName;
+    if (factory.options.GroupByFullPackageName)
+      foreach (module_; vertices)
+        verticesByPckgName[module_.name] ~= module_; // FIXME: is it name or loc?
+
+    if (factory.options.HighlightCyclicVertices ||
+        factory.options.HighlightCyclicEdges)
+      findCycles(vertices, edges);
+
+    if (cast(FileConduit)outputs[1]) {
+      // name of the .dot file
+      char[] fn = (cast(FileConduit)outputs[1]).toUtf8();
+
+      // .dot -> .svg/.png/.gif/...
+      fn = fn[0..$-3] ~ imageFormatExts[factory.options.imageFormat];
+
+      switch(factory.options.docFormat) {
+        case DocFormat.LaTeX:
+          output2.format("\\includegraphics{{{0}}", fn);
+          break;
+        case DocFormat.XML:
+          // TODO
+          break;
+        case DocFormat.HTML:
+          output2.format(`<img src="{0}" />`, fn);
+          break;
+        case DocFormat.PlainText:
+          throw new Exception("Dot output is not supported in plain text mode.");
+      }
+    }
+
+    output("Digraph ModuleDependencies {\n");
+
+    if (factory.options.HighlightCyclicVertices)
+      foreach (module_; vertices)
+        output.format(
+          `  n{0} [label="{1}"{2}];`\n,
+          module_.id,
+          module_.name,
+          (module_.isCyclic ? ",style=filled,fillcolor=tomato" : "")
+        );
+    else
+        foreach (i, module_; vertices)
+            output.format(`  n{0} [label="{1}"];`, i, module_.name);
+
+    foreach (edge; edges)
+      output.format(
+        `  n{0} -> n{1}{2};`\n,
+        edge.outgoing.id,
+        edge.incoming.id,
+        (edge.isCyclic ? "[color=red]" : "")
+      );
+
+    if (factory.options.GroupByFullPackageName)
+      foreach (packageName, vertices; verticesByPckgName) {
+        output.format(
+          `  subgraph "cluster_{0}" {{`\n`    label="{0}";color=blue;`\n`    `,
+          packageName,
+          packageName
+        );
+
+        foreach (module_; vertices)
+          output.format(`n{0};`, module_.id);
+        output("\n  }\n");
+      }
+
+    output("}");
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/graphutils/modulenamewriter.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,38 @@
+/**
+ * Author: Aziz Köksal & Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.graphutils.modulenamewriter;
+import docgen.graphutils.writer;
+
+import tango.io.protocol.Writer : Writer;
+import tango.io.FileConduit : FileConduit;
+import tango.io.Print: Print;
+import tango.text.convert.Layout : Layout;
+
+
+/**
+ * TODO: add support for html/xml/latex?
+ */
+class ModuleNameWriter : AbstractGraphWriter {
+  this(GraphWriterFactory factory, OutputStream[] outputs) {
+    super(factory, outputs);
+    assert(outputs.length == 1, "Wrong number of outputs");
+  }
+
+  void generateGraph(Vertex[] vertices, Edge[] edges) {
+    auto output = new Writer(outputs[0]);
+
+    void doList(Vertex[] v, uint level, char[] indent = "") {
+      if (!level) return;
+
+      foreach (vertex; v) {
+        output(indent)(vertex.name).newline;
+        if (vertex.outgoing.length)
+          doList(vertex.outgoing, level-1, indent ~ "  ");
+      }
+    }
+
+    doList(vertices, factory.options.depth);
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/graphutils/modulepathwriter.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,37 @@
+/**
+ * Author: Aziz Köksal & Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.graphutils.modulepathwriter;
+import docgen.graphutils.writer;
+
+import tango.io.protocol.Writer : Writer;
+import tango.io.FileConduit : FileConduit;
+import tango.io.Print: Print;
+import tango.text.convert.Layout : Layout;
+
+/**
+ * TODO: add support for html/xml/latex?
+ */
+class ModulePathWriter : AbstractGraphWriter {
+  this(GraphWriterFactory factory, OutputStream[] outputs) {
+    super(factory, outputs);
+    assert(outputs.length == 1, "Wrong number of outputs");
+  }
+
+  void generateGraph(Vertex[] vertices, Edge[] edges) {
+    auto output = new Writer(outputs[0]);
+
+    void doPaths(Vertex[] v, uint level, char[] indent = "") {
+      if (!level) return;
+
+      foreach (vertex; v) {
+        output(indent)(vertex.location).newline;
+        if (vertex.outgoing.length)
+          doPaths(vertex.outgoing, level-1, indent ~ "  ");
+      }
+    }
+
+    doPaths(vertices, factory.options.depth);
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/graphutils/primitives.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,94 @@
+/**
+ * Author: Aziz Köksal & Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.graphutils.primitives;
+
+enum EdgeType {
+  Unspecified,
+  Aggregation,
+  Association,
+  Composition,
+  CyclicDependency,
+  Dependency,
+  Generalization,
+  Inheritance,
+  Reserved // for the cycle algorithm
+}
+
+class Edge {
+  Vertex outgoing;
+  Vertex incoming;
+  EdgeType type;
+
+  this(Vertex o, Vertex i, EdgeType type = EdgeType.Unspecified) {
+    this.outgoing = o;
+    this.incoming = i;
+    this.type = type;
+  }
+
+  bool isCyclic() {
+    return type == EdgeType.CyclicDependency;
+  }
+}
+
+enum VertexType {
+  Module,
+  Package,
+  Class,
+  Interface,
+  Trait
+}
+
+class Vertex {
+  char[] name;
+  char[] location;
+  uint id;
+
+  Edge[] incomingEdges;
+  Edge[] outgoingEdges;
+  VertexType type;
+
+  this(char[] name, char[] location, uint id = 0) {
+    this.name = name;
+    this.location = location;
+    this.id = id;
+  }
+
+  Edge addChild(Vertex v, EdgeType type = EdgeType.Unspecified) {
+    auto edge = new Edge(v, this, type);
+    incomingEdges ~= edge;
+    v.outgoingEdges ~= edge;
+    return edge;
+  }
+
+  Edge addParent(Vertex v, EdgeType type = EdgeType.Unspecified) {
+    return v.addChild(this, type);
+  }
+
+  Vertex[] incoming() {
+    Vertex[] tmp;
+
+    foreach(edge; incomingEdges)
+      tmp ~= edge.outgoing;
+
+    return tmp;
+  }
+
+  Vertex[] outgoing() {
+    Vertex[] tmp;
+
+    foreach(edge; outgoingEdges)
+      tmp ~= edge.incoming;
+
+    return tmp;
+  }
+
+  bool isCyclic() {
+    foreach(edge; outgoingEdges)
+      if (edge.isCyclic)
+        return true;
+
+    return false;
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/graphutils/writer.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,176 @@
+/**
+ * Author: Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.graphutils.writer;
+
+public import docgen.misc.misc;
+public import docgen.graphutils.primitives;
+import tango.io.model.IConduit : OutputStream;
+debug import tango.io.Stdout;
+
+enum ImageFormat {
+  PNG,
+  SVG,
+  GIF
+}
+
+const imageFormatExts = [ "png", "svg", "gif" ];
+
+enum GraphFormat {
+  Dot,
+  ModuleNames,
+  ModulePaths
+}
+
+struct GraphOptions {
+  GraphFormat graphFormat;
+  ImageFormat imageFormat;
+  DocFormat docFormat;
+  uint depth;
+  bool IncludeUnlocatableModules;
+  bool HighlightCyclicEdges;
+  bool HighlightCyclicVertices;
+  bool GroupByPackageNames;
+  bool GroupByFullPackageName;
+}
+
+interface GraphWriter {
+  void generateGraph(Vertex[], Edge[]);
+}
+
+alias void delegate(Vertex[], Edge[]) GraphWriterDg;
+
+abstract class AbstractGraphWriter : GraphWriter {
+  protected GraphWriterFactory factory;
+  protected OutputStream[] outputs;
+
+  this(GraphWriterFactory factory, OutputStream[] outputs) {
+    this.factory = factory;
+    this.outputs = outputs;
+  }
+
+  /**
+   * Marks all cycles in the graph.
+   *
+   * May have bugs, but is a bit simpler than the previous version.
+   */
+  protected static void findCycles(Vertex[] vertices, Edge[] edges) {
+    debug void p() {
+      foreach(e; edges) Stderr(e.type)(" "c);
+      Stderr.newline;
+    }
+
+    bool visit(Edge edge) {
+      if (edge.type == EdgeType.Reserved) {
+        edge.type = EdgeType.CyclicDependency;
+        debug p();
+        return true;
+      }
+
+      bool wasCyclic = edge.isCyclic();
+      edge.type = EdgeType.Reserved;
+      debug p();
+
+      foreach(edge2; edge.incoming.outgoingEdges)
+        if (visit(edge2)) {
+          if (edge.isCyclic()) {
+            edge.type = EdgeType.Reserved;
+            wasCyclic = true;
+            debug p();
+            continue;
+          }
+          edge.type = EdgeType.CyclicDependency;
+          return true;
+        }
+
+      edge.type = wasCyclic ? EdgeType.CyclicDependency : EdgeType.Dependency;
+      debug p();
+      return false;
+    }
+
+    foreach(vertex; vertices)
+      foreach(edge; vertex.outgoingEdges)
+        if (edge.type == EdgeType.Unspecified) {
+          visit(edge);
+          debug Stderr("*\n");
+        }
+  }
+
+    /+
+    void analyzeGraph(Vertex[] vertices, Edge[] edges)
+    {
+    void recursive(Vertex[] modules)
+    {
+      foreach (idx, vertex; vertices)
+      {
+        uint outgoing, incoming;
+        foreach (j, edge; edges)
+        {
+          if (edge.outgoing is vertex)
+            outgoing++;
+          if (edge.incoming is vertex)
+            incoming++;
+        }
+
+        if (outgoing == 0)
+        {
+          if (incoming != 0)
+          {
+            // Vertex is a sink.
+            alias outgoing i; // Reuse
+            alias incoming j; // Reuse
+            // Remove edges.
+            for (i=j=0; i < edges.length; i++)
+              if (edges[i].incoming !is vertex)
+                edges[j++] = edges[i];
+            edges.length = j;
+            vertices = vertices[0..idx] ~ vertices[idx+1..$];
+            return recursive(modules);
+          }
+          else
+            assert(0, "orphaned module: "~vertex.getFQN()~" (has no edges in graph)"); // orphaned vertex (module) in graph
+        }
+        else if (incoming == 0)
+        {
+          // Vertex is a source
+          alias outgoing i; // Reuse
+          alias incoming j; // Reuse
+          // Remove edges.
+          for (i=j=0; i < edges.length; i++)
+            if (edges[i].outgoing !is vertex)
+              edges[j++] = edges[i];
+          edges.length = j;
+          vertices = vertices[0..idx] ~ vertices[idx+1..$];
+          return recursive(modules);
+        }
+//         else
+//         {
+//           // source && sink
+//         }
+      }
+
+      // When reaching this point it means only cylic edges and vertices are left.
+      foreach (vertex; vertices)
+        vertex.isCyclic = true;
+      foreach (edge; edges)
+        if (edge)
+          edge.isCyclic = true;
+    }
+    recursive(vertices);
+    }
+    +/
+}
+
+interface GraphWriterFactory {
+  GraphOptions *options();
+  GraphWriterDg createGraphWriter(OutputStream[] outputs);
+}
+
+abstract class AbstractGraphWriterFactory : GraphWriterFactory {
+  protected GraphOptions m_options;
+
+  public GraphOptions *options() {
+    return &m_options;
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/graphutils/writers.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,27 @@
+/**
+ * Author: Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.graphutils.writers;
+
+public import docgen.graphutils.writer;
+import docgen.graphutils.dotwriter;
+import docgen.graphutils.modulepathwriter;
+import docgen.graphutils.modulenamewriter;
+
+class DefaultGraphWriterFactory : AbstractGraphWriterFactory {
+  this(GraphOptions options) {
+    m_options = options;
+  }
+
+  GraphWriterDg createGraphWriter(OutputStream[] outputs) {
+    switch (m_options.graphFormat) {
+      case GraphFormat.Dot:
+        return &((new DotWriter(this, outputs)).generateGraph);
+      case GraphFormat.ModuleNames:
+        return &((new ModuleNameWriter(this, outputs)).generateGraph);
+      case GraphFormat.ModulePaths:
+        return &((new ModulePathWriter(this, outputs)).generateGraph);
+    }
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/lstlang0.sty	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,21 @@
+%%
+%% D definition (c) 2007 Jari-Matti Mäkelä
+%%
+\lst@definelanguage{D}%
+  {morekeywords={abstract,alias,align,asm,assert,auto,body,bool,break,%
+      byte,case,cast,catch,cdouble,cent,cfloat,char,class,const,continue,%
+      creal,dchar,debug,default,delegate,delete,deprecated,do,double,%
+      else,enum,export,extern,false,final,finally,float,for,foreach,%
+      foreach_reverse,function,goto,idouble,if,ifloat,import,in,inout,%
+      int,interface,invariant,ireal,is,lazy,long,macro,mixin,module,new,%
+      null,out,override,package,pragma,private,protected,public,real,ref,%
+      return,scope,short,static,struct,super,switch,synchronized,template,%
+      this,throw,true,try,typedef,typeid,typeof,ubyte,ucent,uint,ulong,%
+      union,unittest,ushort,version,void,volatile,wchar,while,with},%
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[n]{/+}{+/},%
+   morecomment=[l]//,%
+   morestring=[b]",%
+   morestring=[b]`%
+  }[keywords,comments,strings]%
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/misc/misc.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,17 @@
+/**
+ * Author: Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.misc.misc;
+
+enum DocFormat {
+  LaTeX,
+  XML,
+  HTML,
+  PlainText
+}
+
+enum CommentFormat {
+  Ddoc,
+  Doxygen
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/modulegraph/writer.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,143 @@
+/**
+ * Author: Aziz Köksal & Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.modulegraph.writer;
+
+import docgen.graphutils.writers;
+
+import dil.Parser;
+import dil.Module;
+import dil.Settings;
+import tango.text.Regex : RegExp = Regex;
+import tango.io.FilePath;
+import tango.io.FileConst;
+import tango.text.Util;
+import common;
+
+alias FileConst.PathSeparatorChar dirSep;
+
+class ModuleGraphGenerator {
+  private static string findModulePath(string moduleFQN, string[] importPaths) {
+    string modulePath;
+
+    foreach (path; importPaths) {
+      modulePath = path ~ (path[$-1] == dirSep ? "" : [dirSep])
+                        ~ moduleFQN ~ ".d";
+
+      // TODO: also check for *.di?
+      if ((new FilePath(modulePath)).exists())
+        return modulePath;
+    }
+
+    return null;
+  }
+
+  /**
+   * Imports the transitive closure of imports starting from "filePath".
+   *
+   * The search can be filtered by providing a list of regexps that match the
+   * FQNs of modules to be ignored.
+   *
+   * TODO: integrate better with the docgen stuff - there's no need to
+   * scan&parse several times
+   */
+  public static void loadModules(string filePath, string[] importPaths,
+                                 string[] strRegexps,
+                                 bool IncludeUnlocatableModules,
+                                 out Vertex[] vertices, out Edge[] edges,
+                                 out Module[] modules) {
+    // Init regular expressions.
+    RegExp[] regexps;
+    foreach (strRegexp; strRegexps)
+      regexps ~= new RegExp(strRegexp);
+
+    // Add directory of file and global directories to import paths.
+    auto fileDir = (new FilePath(filePath)).folder();
+    if (fileDir.length)
+      importPaths ~= fileDir;
+    importPaths ~= GlobalSettings.importPaths;
+
+    Vertex[string] loadedModules;
+    Edge[] _edges;
+    Module[] _modules;
+
+    int modCounter = 0;
+
+    void addModule(Vertex mod) {
+      assert(!(mod.location in loadedModules));
+
+      mod.id = modCounter++;
+      loadedModules[mod.location] = mod;
+    }
+
+    Vertex loadModule(string moduleFQNPath) {
+      // Return already loaded module.
+      auto mod_ = moduleFQNPath in loadedModules;
+      if (mod_ !is null) return *mod_;
+
+      // Ignore module names matching regular expressions.
+      foreach (rx; regexps)
+      if (rx.test(replace(moduleFQNPath, dirSep, '.')))
+        return null;
+
+      auto modulePath = findModulePath(moduleFQNPath, importPaths);
+      if (moduleFQNPath == filePath) modulePath = filePath;
+      auto FQN = replace(moduleFQNPath, dirSep, '.');
+
+      Vertex mod;
+
+      if (modulePath is null) {
+        if (IncludeUnlocatableModules) {
+          mod = new Vertex(FQN, moduleFQNPath);
+          addModule(mod);
+        }
+      } else {
+        mod = new Vertex(FQN, moduleFQNPath);
+        addModule(mod);
+
+        auto m = new Module(modulePath);
+        _modules ~= m;
+        m.parse();
+
+        auto moduleFQNs = m.getImports();
+
+        foreach (moduleFQN_; moduleFQNs) {
+          auto loaded_mod = loadModule(moduleFQN_);
+
+          if (loaded_mod !is null)
+            loaded_mod.addChild(mod);
+        }
+      }
+
+      return mod;
+    } // loadModule
+
+    loadModule(filePath);
+
+    // Finished loading modules.
+
+    // Ordered list of loaded modules.
+    vertices = loadedModules.values;
+    edges = _edges;
+    modules = _modules;
+  }
+
+  /**
+   * TODO
+   */
+  static void generateGraph(GraphWriterOptions *options) {
+    auto gwf = new DefaultGraphWriterFactory(*options);
+
+    auto writer = gwf.createGraphWriter([Stdout.stream]);
+
+    Edge[] edges;
+    Vertex[] vertices;
+
+    loadModules(null, null, null,
+      gwf.options.IncludeUnlocatableModules,
+      vertices, edges);
+
+    writer(vertices, edges);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/sourcelisting/writer.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,41 @@
+/**
+ * Author: Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.sourcelisting.writer;
+
+public import docgen.misc.misc;
+import dil.Parser;
+import tango.io.model.IConduit : OutputStream, InputStream;
+
+struct ListingOptions {
+  DocFormat docFormat;
+}
+
+interface ListingWriter {
+  void generateListing(Parser parser);
+  void generateListing(InputStream input);
+}
+
+abstract class AbstractListingWriter : ListingWriter {
+  protected ListingWriterFactory factory;
+  protected OutputStream[] outputs;
+
+  this(ListingWriterFactory factory, OutputStream[] outputs) {
+    this.factory = factory;
+    this.outputs = outputs;
+  }
+}
+
+interface ListingWriterFactory {
+  ListingOptions *options();
+  ListingWriter createListingWriter(OutputStream[] outputs);
+}
+
+abstract class AbstractListingWriterFactory : ListingWriterFactory {
+  protected ListingOptions m_options;
+
+  public ListingOptions *options() {
+    return &m_options;
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/docgen/sourcelisting/writers.d	Wed Sep 19 23:12:20 2007 +0300
@@ -0,0 +1,83 @@
+/**
+ * Author: Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.sourcelisting.writers;
+
+public import docgen.sourcelisting.writer;
+import dil.Parser;
+
+class DefaultListingWriterFactory : AbstractListingWriterFactory {
+  this(ListingOptions options) {
+    m_options = options;
+  }
+
+  ListingWriter createListingWriter(OutputStream[] outputs) {
+    switch (m_options.docFormat) {
+      case DocFormat.LaTeX:
+        return new LaTeXWriter(this, outputs);
+      case DocFormat.XML:
+        return new XMLWriter(this, outputs);
+      case DocFormat.HTML:
+        return new HTMLWriter(this, outputs);
+      case DocFormat.PlainText:
+        return new PlainTextWriter(this, outputs);
+    }
+  }
+}
+
+
+/**
+ * TODO
+ */
+class LaTeXWriter : AbstractListingWriter {
+  this(ListingWriterFactory factory, OutputStream[] outputs) {
+    super(factory, outputs);
+    assert(outputs.length == 2, "Wrong number of outputs");
+  }
+
+  void generateListing(Parser parser) { /* TODO */ }
+  void generateListing(InputStream input) { /* TODO */ }
+}
+
+
+/**
+ * TODO
+ */
+class XMLWriter : AbstractListingWriter {
+  this(ListingWriterFactory factory, OutputStream[] outputs) {
+    super(factory, outputs);
+    assert(outputs.length == 2, "Wrong number of outputs");
+  }
+
+  void generateListing(Parser parser) { /* TODO */ }
+  void generateListing(InputStream input) { /* TODO */ }
+}
+
+
+/**
+ * TODO: add support for html/xml/latex?
+ */
+class HTMLWriter : AbstractListingWriter {
+  this(ListingWriterFactory factory, OutputStream[] outputs) {
+    super(factory, outputs);
+    assert(outputs.length == 2, "Wrong number of outputs");
+  }
+
+  void generateListing(Parser parser) { /* TODO */ }
+  void generateListing(InputStream input) { /* TODO */ }
+}
+
+
+/**
+ * TODO
+ */
+class PlainTextWriter : AbstractListingWriter {
+  this(ListingWriterFactory factory, OutputStream[] outputs) {
+    super(factory, outputs);
+    assert(outputs.length == 2, "Wrong number of outputs");
+  }
+
+  void generateListing(Parser parser) { /* TODO */ }
+  void generateListing(InputStream input) { /* TODO */ }
+}
\ No newline at end of file