Merge branch 'genomix/fullstack_genomix' into wbiesing/refactor_p4

use static final values "debug" and "problemKmers" to log all actions
for given set of kmers

Conflicts:
	genomix/genomix-
pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/config/GenomixJobConf.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/config/GenomixJobConf.java
index 4e8fd4f..14423e1 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/config/GenomixJobConf.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/config/GenomixJobConf.java
@@ -111,7 +111,7 @@
         private int clusterWaitTime = -1;
         
         @Option(name = "-drawStatistics", usage = "Plot coverage statistics after graphbuilding stages", required = false)
-        private boolean drawStatistics = false;
+        private boolean drawStatistics = false;  // TODO make this a proper map-reduce job
 
         // Graph cleaning
         @Option(name = "-bridgeRemove_maxLength", usage = "Nodes with length <= bridgeRemoveLength that bridge separate paths are removed from the graph", required = false)
@@ -121,7 +121,7 @@
         private float bubbleMerge_maxDissimilarity = -1;
 
         @Option(name = "-graphCleanMaxIterations", usage = "The maximum number of iterations any graph cleaning job is allowed to run for", required = false)
-        private int graphCleanMaxIterations = -1;
+        private int graphCleanMaxIterations = -1; // TODO respect this value in pregelix
         
         @Option(name = "-pathMergeRandom_randSeed", usage = "The seed used in the random path-merge algorithm", required = false)
         private long pathMergeRandom_randSeed = -1;
@@ -139,6 +139,7 @@
         private int maxReadIDsPerEdge = -1;
         
         // Hyracks/Pregelix Setup
+        // TODO remove ip and port?  (refactor Nan's driver)
         @Option(name = "-ip", usage = "IP address of the cluster controller", required = false)
         private String ipAddress;
         
@@ -161,7 +162,7 @@
     /**
      * the set of patterns that can be applied to the graph 
      */
-    public static enum Patterns {
+    public static enum Patterns {  // TODO static needed for other place we use enum?
         BUILD,
         BUILD_HYRACKS,
         BUILD_HADOOP,
@@ -233,13 +234,13 @@
 //    public static final String FRAME_SIZE = "genomix.framesize";
     public static final String FRAME_SIZE = "pregelix.framesize";
     public static final String FRAME_LIMIT = "genomix.framelimit";
-    public static final String GROUPBY_TYPE = "genomix.graph.groupby.type";
+    public static final String GROUPBY_TYPE = "genomix.graph.groupby.type"; // TODO strip this out
     public static final String OUTPUT_FORMAT = "genomix.graph.output";
 
-    public static final String GROUPBY_TYPE_PRECLUSTER = "precluster";
+    public static final String GROUPBY_TYPE_PRECLUSTER = "precluster"; // TODO remove
     
-    public static final String JOB_PLAN_GRAPHBUILD = "graphbuild";
-    public static final String JOB_PLAN_GRAPHSTAT = "graphstat";
+    public static final String JOB_PLAN_GRAPHBUILD = "graphbuild"; // TODO remove
+    public static final String JOB_PLAN_GRAPHSTAT = "graphstat"; // TODO remove
 
     public static final String OUTPUT_FORMAT_BINARY = "genomix.outputformat.binary";
     public static final String OUTPUT_FORMAT_TEXT = "genomix.outputformat.text";
@@ -257,7 +258,7 @@
                     Patterns.SCAFFOLD, Patterns.MERGE
             };
     
-    private String[] extraArguments = {};
+    private String[] extraArguments = {};  // TODO remove extraArguments
     
     private static Map<String, Long> tickTimes = new HashMap<String, Long>(); 
     
@@ -295,7 +296,7 @@
     /**
      * retrieve any unparsed arguments from parseArguments. Returns an empty array if we weren't initialized use fromArguments()
      */
-    public String[] getExtraArguments() {
+    public String[] getExtraArguments() { // TODO remove
         return extraArguments;
     }
        
@@ -457,7 +458,7 @@
             return System.currentTimeMillis() - time;
     }
 
-    public static void setGlobalStaticConstants(Configuration conf) {
+    public static void setGlobalStaticConstants(Configuration conf) { // TODO make sure everyone uses this version
         KmerBytesWritable.setGlobalKmerLength(Integer.parseInt(conf.get(GenomixJobConf.KMER_LENGTH)));
 //        EdgeWritable.MAX_READ_IDS_PER_EDGE = Integer.parseInt(conf.get(GenomixJobConf.MAX_READIDS_PER_EDGE));
     }
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/minicluster/GenomixClusterManager.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/minicluster/GenomixClusterManager.java
index 9a520b9..28a742c 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/minicluster/GenomixClusterManager.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/minicluster/GenomixClusterManager.java
@@ -236,6 +236,7 @@
                         Path jarDestDir = new Path(conf.get(GenomixJobConf.HDFS_WORK_PATH) + "/jar-dependencies");
                         // dist cache requires absolute paths. we have to use the working directory if HDFS_WORK_PATH is relative
                         if (!jarDestDir.isAbsolute()) {
+                        	// TODO move this to a single function
                             // working dir is the correct base, but we must use the path version (not a URI). Get URI and strip out leading identifiers
                             String hostNameRE = "([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])(\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9]))*";
                             String[] workDirs = dfs.getWorkingDirectory().toString()
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/EdgeListWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/EdgeListWritable.java
index 4ad48e4..ba5fb53 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/EdgeListWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/EdgeListWritable.java
@@ -246,7 +246,7 @@
         };
         return it;
     }
-
+    
     public Iterable<VKmerBytesWritable> getKeys() {
         return new Iterable<VKmerBytesWritable>() {
             @Override
@@ -255,7 +255,7 @@
             }
         };
     }
-
+    
     public PositionListWritable getReadIDs(VKmerBytesWritable key) {
         for (EdgeWritable e : this) {
             if (e.getKey().equals(key))
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
index 1c0a023..0250a73 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
@@ -78,7 +78,14 @@
                 b |= NEXT.val;
             return b;  
         }
+		public final EnumSet<EDGETYPE> edgeType(){
+		    return edgeTypesInDir(this);
+		}
 		
+	    public static final EnumSet<EDGETYPE> edgeTypesInDir(DIR direction) {
+	        return direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING;
+	    }
+	    
 		public static EnumSet<DIR> enumSetFromByte(short s) {
 		    EnumSet<DIR> retSet = EnumSet.noneOf(DIR.class);
 		    if ((s & PREVIOUS.get()) != 0)
@@ -100,8 +107,182 @@
             return retSet;
         }
 	}
-
-
+	
+    public enum EDGETYPE {
+            
+            FF((byte)(0b00 << 0)),
+            FR((byte)(0b01 << 0)),
+            RF((byte)(0b10 << 0)),
+            RR((byte)(0b11 << 0));
+            
+            public static final byte MASK = (byte)(0b11 << 0); 
+            public static final byte CLEAR = (byte)(0b1111100 << 0);
+            private final byte val;
+            
+            private EDGETYPE(byte val){
+                this.val = val;
+            }
+            
+            public final byte get(){
+                return val;
+            }
+            
+            public static final EnumSet<EDGETYPE> INCOMING = EnumSet.of(RF, RR);
+            public static final EnumSet<EDGETYPE> OUTGOING = EnumSet.of(FF, FR);
+                    
+            public static EDGETYPE fromByte(short b) {
+                b &= MASK;
+                if(b == FF.val)
+                    return FF;
+                if(b == FR.val)
+                    return FR;
+                if(b == RF.val)
+                    return RF;
+                if(b == RR.val)
+                    return RR;
+                return null;
+    
+            }
+            /**
+             * Returns the edge dir for B->A when the A->B edge is type @dir
+             */
+            public EDGETYPE mirror(){
+                return mirror(this);
+            }
+            
+            public static EDGETYPE mirror(EDGETYPE edgeType){
+                switch (edgeType) {
+                    case FF:
+                        return RR;
+                    case FR:
+                        return FR;
+                    case RF:
+                        return RF;
+                    case RR:
+                        return FF;
+                    default:
+                        throw new RuntimeException("Unrecognized direction in mirrorDirection: " + edgeType);
+                }
+            }
+            
+            public DIR dir() {
+                return dir(this);
+            }
+            
+            public static DIR dir(EDGETYPE edgeType){ // .dir static / non-static
+                switch(edgeType){
+                    case FF:
+                    case FR:
+                        return DIR.NEXT;
+                    case RF:
+                    case RR:
+                        return DIR.PREVIOUS;
+                    default:
+                        throw new RuntimeException("Unrecognized direction in dirFromEdgeType: " + edgeType);
+                }
+            }
+            
+            /**
+             * return the edgetype corresponding to moving across edge1 and edge2.
+             * 
+             *  So if A <-e1- B -e2-> C, we will return the relationship from A -> C
+             *  
+             *  If the relationship isn't a valid path (e.g., e1,e2 are both FF), an exception is raised.
+             */
+            public static EDGETYPE resolveLinkThroughMiddleNode(EDGETYPE BtoA, EDGETYPE BtoC) {
+                EDGETYPE AtoB = mirror(BtoA);
+                // a valid path must exist from A to C
+                // specifically, two rules apply for AtoB and BtoC
+                //      1) the internal letters must be the same (so FF, RF will be an error)
+                //      2) the final direction is the 1st letter of AtoB + 2nd letter of BtoC
+                // TODO? maybe we could use the string version to resolve this following above rules
+                switch(AtoB) {
+                    case FF:
+                        switch (BtoC) {
+                            case FF:
+                            case FR:
+                                return BtoC;
+                            case RF:
+                            case RR:
+                                throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
+                        }
+                        break;
+                    case FR:
+                        switch (BtoC) {
+                            case FF:
+                            case FR:
+                                throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
+                            case RF:
+                                return FF;
+                            case RR:
+                                return FR;
+                        }
+                        break;
+                    case RF:
+                        switch (BtoC) {
+                            case FF:
+                                return RF;
+                            case FR:
+                                return RR;
+                            case RF:
+                            case RR:
+                                throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
+                        }
+                        break;
+                    case RR:
+                        switch (BtoC) {
+                            case FF:
+                            case FR:
+                                throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
+                            case RF:
+                                return RF;
+                            case RR:
+                                return RR;
+                        }
+                        break;
+                }
+                throw new IllegalStateException("Logic Error or unrecognized direction... original values were: " + BtoA + " and " + BtoC);
+            }
+            
+            public boolean causesFlip(){
+                return causesFlip(this);
+            }
+            public static boolean causesFlip(EDGETYPE edgeType) {
+                switch (edgeType) {
+                    case FF:
+                    case RR:
+                        return false;
+                    case FR:
+                    case RF:
+                        return true;
+                    default:
+                        throw new IllegalArgumentException("unrecognized direction: " + edgeType);
+                }
+            }
+            
+            /**
+             * check if need filp
+             */
+            public EDGETYPE flip(){
+                return flip(this);
+            }
+            
+            public static EDGETYPE flip(EDGETYPE neighborToMe){ // TODO use NodeWritable
+                switch (neighborToMe) {
+                    case FF:
+                        return FR;
+                    case FR:
+                        return FF;
+                    case RF:
+                        return RR;
+                    case RR:
+                        return RF;
+                    default:
+                        throw new RuntimeException("Unrecognized direction for neighborDir: " + neighborToMe);
+                }
+            }
+        }
+        
     private static final long serialVersionUID = 1L;
     public static final NodeWritable EMPTY_NODE = new NodeWritable();
 
@@ -121,151 +302,12 @@
 //    public String previous;
 //    public int stepCount;
     // merge/update directions
-    public static class DirectionFlag { // TODO change to "EdgeType" and make enum-based
-        public static final byte DIR_FF = 0b00 << 0;
-        public static final byte DIR_FR = 0b01 << 0;
-        public static final byte DIR_RF = 0b10 << 0;
-        public static final byte DIR_RR = 0b11 << 0;
-        public static final byte DIR_MASK = 0b11 << 0;
-        public static final byte DIR_CLEAR = 0b1111100 << 0;
-
-        public static final byte[] values = { DIR_FF, DIR_FR, DIR_RF, DIR_RR };
-        
-        /**
-         * Returns the edge dir for B->A when the A->B edge is type @dir
-         */
-        public static byte mirrorEdge(byte edgeType) {
-            switch (edgeType) {
-                case DIR_FF:
-                    return DIR_RR;
-                case DIR_FR:
-                    return DIR_FR;
-                case DIR_RF:
-                    return DIR_RF;
-                case DIR_RR:
-                    return DIR_FF;
-                default:
-                    throw new RuntimeException("Unrecognized direction in mirrorDirection: " + edgeType);
-            }
-        }
-        
-        public static DIR dirFromEdgeType(byte b) {
-            switch(b & DirectionFlag.DIR_MASK) {
-                case DIR_FF:
-                case DIR_FR:
-                    return DIR.NEXT;
-                case DIR_RF:
-                case DIR_RR:
-                    return DIR.PREVIOUS;
-                default:
-                    throw new RuntimeException("Unrecognized direction in dirFromEdgeType: " + b);
-                    
-            }
-        }
-        
-        /**
-         * return the edgetype corresponding to moving across edge1 and edge2.
-         * 
-         *  So if A <-e1- B -e2-> C, we will return the relationship from A -> C
-         *  
-         *  If the relationship isn't a valid path (e.g., e1,e2 are both FF), an exception is raised.
-         */
-        public static byte resolveLinkThroughMiddleNode(byte BtoA, byte BtoC) {
-            BtoA &= DIR_MASK;
-            BtoC &= DIR_MASK;
-            byte AtoB = mirrorEdge(BtoA);
-            // a valid path must exist from A to C
-            // specifically, two rules apply for AtoB and BtoC
-            //      1) the internal letters must be the same (so FF, RF will be an error)
-            //      2) the final direction is the 1st letter of AtoB + 2nd letter of BtoC
-            // TODO? maybe we could use the string version to resolve this following above rules
-            switch(AtoB) {
-                case DIR_FF:
-                    switch (BtoC) {
-                        case DIR_FF:
-                        case DIR_FR:
-                            return BtoC;
-                        case DIR_RF:
-                        case DIR_RR:
-                            throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
-                    }
-                    break;
-                case DIR_FR:
-                    switch (BtoC) {
-                        case DIR_FF:
-                        case DIR_FR:
-                            throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
-                        case DIR_RF:
-                            return DIR_FF;
-                        case DIR_RR:
-                            return DIR_FR;
-                    }
-                    break;
-                case DIR_RF:
-                    switch (BtoC) {
-                        case DIR_FF:
-                            return DIR_RF;
-                        case DIR_FR:
-                            return DIR_RR;
-                        case DIR_RF:
-                        case DIR_RR:
-                            throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
-                    }
-                    break;
-                case DIR_RR:
-                    switch (BtoC) {
-                        case DIR_FF:
-                        case DIR_FR:
-                            throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
-                        case DIR_RF:
-                            return DIR_RF;
-                        case DIR_RR:
-                            return DIR_RR;
-                    }
-                    break;
-            }
-            throw new IllegalStateException("Logic Error or unrecognized direction... original values were: " + BtoA + " and " + BtoC);
-        }
-
-        public static boolean causesFlip(byte direction) {
-            direction &= DIR_MASK;
-            switch (direction) {
-                case DIR_FF:
-                case DIR_RR:
-                    return false;
-                case DIR_FR:
-                case DIR_RF:
-                    return true;
-                default:
-                    throw new IllegalArgumentException("unrecognized direction: " + direction);
-            }
-        }
-    }
-    
-    
-    
-    public static class IncomingListFlag { // TODO refactor as a function using DIR
-        public static final byte DIR_RF = 0b10 << 0;
-        public static final byte DIR_RR = 0b11 << 0;
-
-        public static final byte[] values = {DIR_RF, DIR_RR };
-    }
-    
-    public static class OutgoingListFlag {
-        public static final byte DIR_FF = 0b00 << 0;
-        public static final byte DIR_FR = 0b01 << 0;
-
-        public static final byte[] values = {DIR_FF, DIR_FR };
-    }
-    
-    public static final byte[] edgeTypesInDir(DIR direction) {
-        return direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
-    }
     
     
     public NodeWritable() {
-        for (byte d : DirectionFlag.values) {
-            edges[d] = new EdgeListWritable();
+        
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            edges[e.get()] = new EdgeListWritable();
         }
         startReads = new PositionListWritable();
         endReads = new PositionListWritable();
@@ -299,8 +341,8 @@
 
     public void setAsCopy(EdgeListWritable[] edges, PositionListWritable startReads, PositionListWritable endReads,
             VKmerBytesWritable kmer2, float coverage) {
-        for (byte d : DirectionFlag.values) {
-            this.edges[d].setAsCopy(edges[d]);
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            this.edges[e.get()].setAsCopy(edges[e.get()]);
         }
         this.startReads.set(startReads);
         this.endReads.set(endReads);
@@ -309,8 +351,8 @@
     }
 
     public void reset() {
-        for (byte d : DirectionFlag.values) {
-            edges[d].reset();
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            edges[e.get()].reset();
         }
         startReads.reset();
         endReads.reset();
@@ -329,13 +371,25 @@
     public int getKmerLength() {
         return internalKmer.getKmerLetterLength();
     }
-
-    public EdgeListWritable getEdgeList(byte dir) {
-        return edges[dir & DirectionFlag.DIR_MASK];
+    
+    //This function works on only this case: in this DIR, vertex has and only has one EDGETYPE
+    public EDGETYPE getEdgetypeFromDir(DIR direction){
+        if(getDegree(direction) != 1)
+            throw new IllegalArgumentException("getEdgetypeFromDir is used on the case, in which the vertex has and only has one EDGETYPE!");
+        EnumSet<EDGETYPE> ets = direction.edgeType(); 
+        for(EDGETYPE et : ets){
+            if(getEdgeList(et).getCountOfPosition() > 0)
+                return et;
+        }
+        return null;
+    }
+    
+    public EdgeListWritable getEdgeList(EDGETYPE edgeType) {
+        return edges[edgeType.get() & EDGETYPE.MASK];
     }
 
-    public void setEdgeList(byte dir, EdgeListWritable edgeList) {
-        this.edges[dir & DirectionFlag.DIR_MASK].setAsCopy(edgeList);
+    public void setEdgeList(EDGETYPE edgeType, EdgeListWritable edgeList) {
+        this.edges[edgeType.get() & EDGETYPE.MASK].setAsCopy(edgeList);
     }
     
     public EdgeListWritable[] getEdges() {
@@ -407,8 +461,8 @@
      */
     public int getSerializedLength() {
         int length = 0;
-        for (byte d : DirectionFlag.values) {
-            length += edges[d].getLength();
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            length += edges[e.get()].getLength();
         }
         length += startReads.getLength();
         length += endReads.getLength();
@@ -429,9 +483,9 @@
 
     public void setAsCopy(byte[] data, int offset) {
         int curOffset = offset;
-        for (byte d : DirectionFlag.values) {
-            edges[d].setAsCopy(data, curOffset);
-            curOffset += edges[d].getLength();
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            edges[e.get()].setAsCopy(data, curOffset);
+            curOffset += edges[e.get()].getLength();
         }
         startReads.set(data, curOffset);
         curOffset += startReads.getLength();
@@ -444,9 +498,9 @@
 
     public void setAsReference(byte[] data, int offset) {
         int curOffset = offset;
-        for (byte d : DirectionFlag.values) {
-            edges[d].setAsReference(data, curOffset);
-            curOffset += edges[d].getLength();
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            edges[e.get()].setAsReference(data, curOffset);
+            curOffset += edges[e.get()].getLength();
         }
         startReads.setNewReference(data, curOffset);
         curOffset += startReads.getLength();
@@ -460,8 +514,8 @@
 
     @Override
     public void write(DataOutput out) throws IOException {
-        for (byte d : DirectionFlag.values) {
-            edges[d].write(out);
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            edges[e.get()].write(out);
         }
         startReads.write(out);
         endReads.write(out);
@@ -472,8 +526,8 @@
     @Override
     public void readFields(DataInput in) throws IOException {
         reset();
-        for (byte d : DirectionFlag.values) {
-            edges[d].readFields(in);
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            edges[e.get()].readFields(in);
         }
         startReads.readFields(in);
         endReads.readFields(in);
@@ -504,8 +558,8 @@
             return false;
 
         NodeWritable nw = (NodeWritable) o;
-        for (byte d : DirectionFlag.values) {
-            if (!edges[d].equals(nw.edges[d]))
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            if (!edges[e.get()].equals(nw.edges[e.get()]))
                 return false;
         }
         
@@ -517,8 +571,8 @@
     public String toString() {
         StringBuilder sbuilder = new StringBuilder();
         sbuilder.append('{');
-        for (byte d : DirectionFlag.values) {
-            sbuilder.append(edges[d].toString()).append('\t');
+        for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+            sbuilder.append(edges[e.get()].toString()).append('\t');
         }
         sbuilder.append("{5':" + startReads.toString() + ", ~5':" + endReads.toString() + "}").append('\t');
         sbuilder.append(internalKmer.toString()).append('\t');
@@ -543,23 +597,23 @@
      * @param other
      *            : the node to merge with. I should have a `dir` edge towards `other`
      */
-    public void mergeWithNode(byte dir, final NodeWritable other) {
-        mergeEdges(dir, other);
-        mergeStartAndEndReadIDs(dir, other);
+    public void mergeWithNode(EDGETYPE edgeType, final NodeWritable other) {
+        mergeEdges(edgeType, other);
+        mergeStartAndEndReadIDs(edgeType, other);
         mergeCoverage(other);
-        internalKmer.mergeWithKmerInDir(dir, KmerBytesWritable.lettersInKmer, other.internalKmer);
+        internalKmer.mergeWithKmerInDir(edgeType, KmerBytesWritable.lettersInKmer, other.internalKmer);
     }
     
-    public void mergeWithNodeWithoutKmer(byte dir, final NodeWritable other) {
-        mergeEdges(dir, other);
-        mergeStartAndEndReadIDs(dir, other);
+    public void mergeWithNodeWithoutKmer(EDGETYPE edgeType, final NodeWritable other) {
+        mergeEdges(edgeType, other);
+        mergeStartAndEndReadIDs(edgeType, other);
         mergeCoverage(other);
     }
     
     public void mergeWithNodeWithoutKmer(final NodeWritable other) {
-        byte dir = DirectionFlag.DIR_FF;
-        mergeEdges(dir, other);
-        mergeStartAndEndReadIDs(dir, other);
+        EDGETYPE edgeType = EDGETYPE.FF;
+        mergeEdges(edgeType, other);
+        mergeStartAndEndReadIDs(edgeType, other);
         mergeCoverage(other);
     }
 
@@ -601,91 +655,76 @@
             }
         }
     }
-
+//
     /**
      * update my edge list
      */
-    public void updateEdges(byte deleteDir, VKmerBytesWritable toDelete, byte updateDir, byte replaceDir, NodeWritable other, boolean applyDelete){
+    public void updateEdges(EDGETYPE deleteDir, VKmerBytesWritable toDelete, EDGETYPE updateDir, EDGETYPE replaceDir, NodeWritable other, boolean applyDelete){
         if(applyDelete)
-            edges[deleteDir].remove(toDelete);
-        switch (replaceDir) {
-            case DirectionFlag.DIR_FF:
-            case DirectionFlag.DIR_FR:
-                if (other.inDegree() != 1)
-                    throw new IllegalStateException("In update, expected other node's indegree to be 1!" + this + other);
-                edges[updateDir].unionUpdate(other.edges[DirectionFlag.DIR_RF]);
-                edges[updateDir].unionUpdate(other.edges[DirectionFlag.DIR_RR]);
-                break;
-            case DirectionFlag.DIR_RF:
-            case DirectionFlag.DIR_RR:
-                if (other.outDegree() != 1)
-                    throw new IllegalStateException("In update, expected other node's outdegree to be 1!" + this + other);
-                edges[updateDir].unionUpdate(other.edges[DirectionFlag.DIR_FF]);
-                edges[updateDir].unionUpdate(other.edges[DirectionFlag.DIR_FR]);
-                break;
-        }
+            edges[deleteDir.get()].remove(toDelete);
+        edges[updateDir.get()].unionUpdate(other.edges[replaceDir.get()]);
     }
     
     /**
      * merge my edge list (both kmers and readIDs) with those of `other`.  Assumes that `other` is doing the flipping, if any.
      */
-    public void mergeEdges(byte dir, NodeWritable other) {
-        switch (dir & DirectionFlag.DIR_MASK) {
-            case DirectionFlag.DIR_FF:
+    public void mergeEdges(EDGETYPE edgeType, NodeWritable other) {
+        switch (edgeType) {
+            case FF:
                 if (outDegree() > 1)
                     throw new IllegalArgumentException("Illegal FF merge attempted! My outgoing degree is " + outDegree() + " in " + toString());
                 if (other.inDegree() > 1)
                     throw new IllegalArgumentException("Illegal FF merge attempted! Other incoming degree is " + other.inDegree() + " in " + other.toString());
-                edges[DirectionFlag.DIR_FF].setAsCopy(other.edges[DirectionFlag.DIR_FF]);
-                edges[DirectionFlag.DIR_FR].setAsCopy(other.edges[DirectionFlag.DIR_FR]);
+                edges[EDGETYPE.FF.get()].setAsCopy(other.edges[EDGETYPE.FF.get()]);
+                edges[EDGETYPE.FR.get()].setAsCopy(other.edges[EDGETYPE.FR.get()]);
                 break;
-            case DirectionFlag.DIR_FR:
+            case FR:
                 if (outDegree() > 1)
                     throw new IllegalArgumentException("Illegal FR merge attempted! My outgoing degree is " + outDegree() + " in " + toString());
                 if (other.outDegree() > 1)
                     throw new IllegalArgumentException("Illegal FR merge attempted! Other outgoing degree is " + other.outDegree() + " in " + other.toString());
-                edges[DirectionFlag.DIR_FF].setAsCopy(other.edges[DirectionFlag.DIR_RF]);
-                edges[DirectionFlag.DIR_FR].setAsCopy(other.edges[DirectionFlag.DIR_RR]);
+                edges[EDGETYPE.FF.get()].setAsCopy(other.edges[EDGETYPE.RF.get()]);
+                edges[EDGETYPE.FR.get()].setAsCopy(other.edges[EDGETYPE.RR.get()]);
                 break;
-            case DirectionFlag.DIR_RF:
+            case RF:
                 if (inDegree() > 1)
                     throw new IllegalArgumentException("Illegal RF merge attempted! My incoming degree is " + inDegree() + " in " + toString());
                 if (other.inDegree() > 1)
                     throw new IllegalArgumentException("Illegal RF merge attempted! Other incoming degree is " + other.inDegree() + " in " + other.toString());
-                edges[DirectionFlag.DIR_RF].setAsCopy(other.edges[DirectionFlag.DIR_FF]);
-                edges[DirectionFlag.DIR_RR].setAsCopy(other.edges[DirectionFlag.DIR_FR]);
+                edges[EDGETYPE.RF.get()].setAsCopy(other.edges[EDGETYPE.FF.get()]);
+                edges[EDGETYPE.RR.get()].setAsCopy(other.edges[EDGETYPE.FR.get()]);
                 break;
-            case DirectionFlag.DIR_RR:
+            case RR:
                 if (inDegree() > 1)
                     throw new IllegalArgumentException("Illegal RR merge attempted! My incoming degree is " + inDegree() + " in " + toString());
                 if (other.outDegree() > 1)
                     throw new IllegalArgumentException("Illegal RR merge attempted! Other outgoing degree is " + other.outDegree() + " in " + other.toString());
-                edges[DirectionFlag.DIR_RF].setAsCopy(other.edges[DirectionFlag.DIR_RF]);
-                edges[DirectionFlag.DIR_RR].setAsCopy(other.edges[DirectionFlag.DIR_RR]);
+                edges[EDGETYPE.RF.get()].setAsCopy(other.edges[EDGETYPE.RF.get()]);
+                edges[EDGETYPE.RR.get()].setAsCopy(other.edges[EDGETYPE.RR.get()]);
                 break;
         }
     }
 
     private void addEdges(boolean flip, NodeWritable other) {
         if (!flip) {
-            for (byte d : DirectionFlag.values) {
-                edges[d].unionUpdate(other.edges[d]);
+            for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+                edges[e.get()].unionUpdate(other.edges[e.get()]);
             }
         } else {
-            edges[DirectionFlag.DIR_FF].unionUpdate(other.edges[DirectionFlag.DIR_RF]);
-            edges[DirectionFlag.DIR_FR].unionUpdate(other.edges[DirectionFlag.DIR_RR]);
-            edges[DirectionFlag.DIR_RF].unionUpdate(other.edges[DirectionFlag.DIR_FF]);
-            edges[DirectionFlag.DIR_RR].unionUpdate(other.edges[DirectionFlag.DIR_FR]);
+            edges[EDGETYPE.FF.get()].unionUpdate(other.edges[EDGETYPE.RF.get()]);
+            edges[EDGETYPE.FR.get()].unionUpdate(other.edges[EDGETYPE.RR.get()]);
+            edges[EDGETYPE.RF.get()].unionUpdate(other.edges[EDGETYPE.FF.get()]);
+            edges[EDGETYPE.RR.get()].unionUpdate(other.edges[EDGETYPE.FR.get()]);
         }
     }
 
-    private void mergeStartAndEndReadIDs(byte dir, NodeWritable other) {
+    private void mergeStartAndEndReadIDs(EDGETYPE edgeType, NodeWritable other) {
         int K = KmerBytesWritable.lettersInKmer;
         int otherLength = other.internalKmer.lettersInKmer;
         int thisLength = internalKmer.lettersInKmer;
         int newOtherOffset, newThisOffset;
-        switch (dir & DirectionFlag.DIR_MASK) {
-            case DirectionFlag.DIR_FF:
+        switch (edgeType) {
+            case FF:
                 newOtherOffset = thisLength - K + 1;
                 // stream theirs in with my offset
                 for (PositionWritable p : other.startReads) {
@@ -695,7 +734,7 @@
                     endReads.append(p.getMateId(), p.getReadId(), newOtherOffset + p.getPosId());
                 }
                 break;
-            case DirectionFlag.DIR_FR:
+            case FR:
                 newOtherOffset = thisLength - K + 1 + otherLength - K;
                 // stream theirs in, offset and flipped
                 for (PositionWritable p : other.startReads) {
@@ -705,7 +744,7 @@
                     startReads.append(p.getMateId(), p.getReadId(), newOtherOffset + p.getPosId());
                 }
                 break;
-            case DirectionFlag.DIR_RF:
+            case RF:
                 newThisOffset = otherLength - K + 1;
                 newOtherOffset = otherLength - K;
                 // shift my offsets (other is prepended)
@@ -723,7 +762,7 @@
                     startReads.append(p.getMateId(), p.getReadId(), newOtherOffset + p.getPosId());
                 }
                 break;
-            case DirectionFlag.DIR_RR:
+            case RR:
                 newThisOffset = otherLength - K + 1;
                 // shift my offsets (other is prepended)
                 for (PositionWritable p : startReads) {
@@ -743,24 +782,26 @@
     }
     
     /**
-     * Debug helper function to find the edge associated with the given kmer
+     * Debug helper function to find the edge associated with the given kmer.
+     * 
+     * Note: may be very slow-- does a linear scan of all edges!
      */
-    public Map.Entry<Byte, EdgeWritable> findEdge(final VKmerBytesWritable kmer) {
-        for (byte dir : DirectionFlag.values) {
-            for (EdgeWritable e : edges[dir]) {
+    public Map.Entry<EDGETYPE, EdgeWritable> findEdge(final VKmerBytesWritable kmer) {
+        for (EDGETYPE dir : EDGETYPE.values()) {
+            for (EdgeWritable e : edges[dir.get()]) {
                 if (e.getKey().equals(kmer))
-                    return new AbstractMap.SimpleEntry<Byte, EdgeWritable>(dir, e);
+                    return new AbstractMap.SimpleEntry<EDGETYPE, EdgeWritable>(dir, e);
             }
         }
         return null;
     }
 
     public int inDegree() {
-        return edges[DirectionFlag.DIR_RR].getCountOfPosition() + edges[DirectionFlag.DIR_RF].getCountOfPosition();
+        return edges[EDGETYPE.RR.get()].getCountOfPosition() + edges[EDGETYPE.RF.get()].getCountOfPosition();
     }
 
     public int outDegree() {
-        return edges[DirectionFlag.DIR_FF].getCountOfPosition() + edges[DirectionFlag.DIR_FR].getCountOfPosition();
+        return edges[EDGETYPE.FF.get()].getCountOfPosition() + edges[EDGETYPE.FR.get()].getCountOfPosition();
     }
     
     public int getDegree(DIR direction){
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/VKmerBytesWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/VKmerBytesWritable.java
index ea561ed..74bbaa0 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/VKmerBytesWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/VKmerBytesWritable.java
@@ -27,7 +27,7 @@
 
 import edu.uci.ics.genomix.data.KmerUtil;
 import edu.uci.ics.genomix.data.Marshal;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 
 
 /**
@@ -653,27 +653,27 @@
         mergeWithRRKmer(kmerSize, new VKmerBytesWritable(kmer.toString()));
     }
 
-    public void mergeWithKmerInDir(byte dir, int initialKmerSize, VKmerBytesWritable kmer) {
-        switch (dir & DirectionFlag.DIR_MASK) {
-            case DirectionFlag.DIR_FF:
+    public void mergeWithKmerInDir(EDGETYPE edgeType, int initialKmerSize, VKmerBytesWritable kmer) {
+        switch (edgeType) {
+            case FF:
                 mergeWithFFKmer(initialKmerSize, kmer);
                 break;
-            case DirectionFlag.DIR_FR:
+            case FR:
                 mergeWithFRKmer(initialKmerSize, kmer);
                 break;
-            case DirectionFlag.DIR_RF:
+            case RF:
                 mergeWithRFKmer(initialKmerSize, kmer);
                 break;
-            case DirectionFlag.DIR_RR:
+            case RR:
                 mergeWithRRKmer(initialKmerSize, kmer);
                 break;
             default:
-                throw new RuntimeException("Direction not recognized: " + dir);
+                throw new RuntimeException("Direction not recognized: " + edgeType);
         }
     }
-    public void mergeWithKmerInDir(byte dir, int initialKmerSize, KmerBytesWritable kmer) {
+    public void mergeWithKmerInDir(EDGETYPE edgeType, int initialKmerSize, KmerBytesWritable kmer) {
         // TODO make this more efficient
-        mergeWithKmerInDir(dir, initialKmerSize, new VKmerBytesWritable(kmer.toString()));
+        mergeWithKmerInDir(edgeType, initialKmerSize, new VKmerBytesWritable(kmer.toString()));
     }
 
     public KmerBytesWritable asFixedLengthKmer() {
diff --git a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeListWritableTest.java b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeListWritableTest.java
index bb15cb1..318e58e 100644
--- a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeListWritableTest.java
+++ b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeListWritableTest.java
@@ -1,22 +1,28 @@
 package edu.uci.ics.genomix.data.test;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.List;
 
 import junit.framework.Assert;
 
 import org.junit.Test;
 
-import edu.uci.ics.genomix.data.KmerUtil;
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 
 public class EdgeListWritableTest {
 
@@ -45,18 +51,18 @@
         for (long i = numelements * 2 / 3; i < numelements; i++) {
             plist3.appendReadId(i);
         }
-        n1.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k2, plist1));
-        Assert.assertEquals(numelements / 3, n1.getEdgeList(DirectionFlag.DIR_RF).get(0).getReadIDs()
+        n1.getEdgeList(EDGETYPE.FF).add(new EdgeWritable(k2, plist1));
+        Assert.assertEquals(numelements / 3, n1.getEdgeList(EDGETYPE.RF).get(0).getReadIDs()
                 .getCountOfPosition());
-        n1.getEdgeList(DirectionFlag.DIR_RF).unionUpdate(
+        n1.getEdgeList(EDGETYPE.RF).unionUpdate(
                 new EdgeListWritable(Arrays.asList(new EdgeWritable(k2, plist2))));
-        Assert.assertEquals(numelements * 2 / 3 + numoverlap, n1.getEdgeList(DirectionFlag.DIR_RF).get(0).getReadIDs()
+        Assert.assertEquals(numelements * 2 / 3 + numoverlap, n1.getEdgeList(EDGETYPE.RF).get(0).getReadIDs()
                 .getCountOfPosition());
-        n1.getEdgeList(DirectionFlag.DIR_RF).unionUpdate(
+        n1.getEdgeList(EDGETYPE.RF).unionUpdate(
                 new EdgeListWritable(Arrays.asList(new EdgeWritable(k2, plist3))));
-        Assert.assertEquals(numelements, n1.getEdgeList(DirectionFlag.DIR_RF).get(0).getReadIDs().getCountOfPosition());
+        Assert.assertEquals(numelements, n1.getEdgeList(EDGETYPE.RF).get(0).getReadIDs().getCountOfPosition());
 
-        long[] allReadIDs = n1.getEdgeList(DirectionFlag.DIR_RF).get(0).readIDArray();
+        long[] allReadIDs = n1.getEdgeList(EDGETYPE.RF).get(0).readIDArray();
         // make sure all readids are accounted for...
         for (long i = 0; i < numelements; i++) {
             boolean found = false;
@@ -69,4 +75,235 @@
             Assert.assertTrue("Didn't find element " + i, found);
         }
     }
+    
+    @Test
+    public void TestConstructor() throws IOException {
+        String kmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable kSample = new VKmerBytesWritable(kmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 89432;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i);
+        }
+        sample.setAsCopy(kSample, positionsSample);
+        ArrayList<EdgeWritable> sampleList = new ArrayList<EdgeWritable>();
+        sampleList.add(sample);
+        EdgeListWritable toTest = new EdgeListWritable(sampleList);
+        //begin test
+        Assert.assertEquals(numelements, toTest.get(0).getReadIDs().getCountOfPosition());
+        Assert.assertEquals(kmerSample, toTest.get(0).getKey().toString());
+        for(long i = 0; i < numelements; i++) {
+            Assert.assertEquals(i, toTest.get(0).getReadIDs().getPosition((int)i).getReadId());
+        }
+        //finish test
+    }
+    
+    @Test
+    public void TestSetAsCopy() throws IOException {
+        String oldkmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable oldKSample = new VKmerBytesWritable(oldkmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 89432;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i);
+        }
+        sample.setAsCopy(oldKSample, positionsSample);
+        ArrayList<EdgeWritable> sampleList = new ArrayList<EdgeWritable>();
+        sampleList.add(sample);
+        EdgeListWritable source = new EdgeListWritable(sampleList);
+        //begin test
+        EdgeListWritable target = new EdgeListWritable();
+        target.setAsCopy(source);
+        String newKmerSample = "GCTAGACTAC";
+        VKmerBytesWritable newKSample = new VKmerBytesWritable(newKmerSample);
+        source.get(0).setKey(newKSample);
+        Assert.assertEquals(oldkmerSample, target.get(0).getKey().toString());
+        //finish test
+    }
+    
+    @Test
+    public void TestAdd() throws IOException {
+        String oldkmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable oldKSample = new VKmerBytesWritable(oldkmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 89432;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i);
+        }
+        sample.setAsCopy(oldKSample, positionsSample);
+        EdgeListWritable toTest = new EdgeListWritable();
+        //begin test
+        toTest.add(sample);
+        sample.getReadIDs().resetPosition(100, 999999);
+        String oldReadId = "(100-0_0)";
+        Assert.assertEquals(oldReadId,toTest.get(0).getReadIDs().getPosition(100).toString());
+    }
+    
+    @Test
+    public void Testset() throws IOException {
+        String oldkmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable oldKSample = new VKmerBytesWritable(oldkmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 89432;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i);
+        }
+        sample.setAsCopy(oldKSample, positionsSample);
+        EdgeListWritable toTest = new EdgeListWritable();
+        toTest.add(sample);
+        String newkmerSample = "ATGCATGCGCTACCCCCCCCTAGCTAGACTACG";
+        VKmerBytesWritable newSample = new VKmerBytesWritable(newkmerSample);
+        sample.setKey(newSample);
+        //begin test
+        toTest.set(0, sample);
+        Assert.assertEquals(newkmerSample, toTest.get(0).getKey().toString());
+    }
+    
+    @Test
+    public void TestgetEdge() throws IOException {
+        String oldkmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable oldKSample = new VKmerBytesWritable(oldkmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 89432;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i);
+        }
+        sample.setAsCopy(oldKSample, positionsSample);
+        EdgeListWritable toTest = new EdgeListWritable();
+        toTest.add(sample);
+        String oldReadId = "(100-0_0)";
+        Assert.assertEquals(oldReadId, toTest.getEdge(oldKSample).getReadIDs().getPosition(100).toString());
+    }
+    
+    @Test
+    public void TestByteStreamReadWrite() throws IOException {
+        String oldkmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable oldKSample = new VKmerBytesWritable(oldkmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 898852;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i);
+        }
+        sample.setAsCopy(oldKSample, positionsSample);
+        ArrayList<EdgeWritable> sampleList = new ArrayList<EdgeWritable>();
+        sampleList.add(sample);
+        EdgeListWritable toTest = new EdgeListWritable(sampleList);
+        //begin test
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(toTest.getLength());
+        DataOutputStream out = new DataOutputStream(baos);
+        toTest.write(out);
+        InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
+        DataInputStream in = new DataInputStream(inputStream);
+        EdgeListWritable toTest2 = new EdgeListWritable();
+        toTest2.readFields(in);
+        String oldReadId = "(123-0_0)";
+        Assert.assertEquals(oldReadId, toTest2.getEdge(oldKSample).getReadIDs().getPosition(123).toString());
+    }
+    
+    @Test
+    public void TestCompareTo() throws IOException {
+        String oldkmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable oldKSample = new VKmerBytesWritable(oldkmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 898852;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i);
+        }
+        sample.setAsCopy(oldKSample, positionsSample);
+        ArrayList<EdgeWritable> sampleList = new ArrayList<EdgeWritable>();
+        sampleList.add(sample);
+        EdgeListWritable toTest = new EdgeListWritable(sampleList);
+        //begin test
+        
+        String newkmerSample = "TTTTTTGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable newKSample = new VKmerBytesWritable(newkmerSample);
+        EdgeWritable sample2 = new EdgeWritable();
+        PositionListWritable newpositionsSample = new PositionListWritable();
+        long numnewelements = 999;
+        for (long i = 0; i < numnewelements; i++) {
+            newpositionsSample.appendReadId(i);
+        }
+        sample2.setAsCopy(newKSample, newpositionsSample);
+        ArrayList<EdgeWritable> sampleList2 = new ArrayList<EdgeWritable>();
+        sampleList2.add(sample2);
+        EdgeListWritable toTest2 = new EdgeListWritable(sampleList2);
+        Assert.assertEquals(new String("should true"), false, toTest.compareTo(toTest2) < 0 ? false : true);
+    }
+    
+    @Test
+    public void TestRemoveSubEdge() throws IOException {
+        String oldkmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable oldKSample = new VKmerBytesWritable(oldkmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 898852;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i);
+        }
+        sample.setAsCopy(oldKSample, positionsSample);
+        ArrayList<EdgeWritable> sampleList = new ArrayList<EdgeWritable>();
+        sampleList.add(sample);
+        EdgeListWritable toTest = new EdgeListWritable(sampleList);
+        //begin test
+        PositionListWritable positionsSample2 = new PositionListWritable();
+        long removeElements = 99;
+        for (long i = 0; i < removeElements; i++) {
+            positionsSample2.appendReadId(i * i * 2);
+        }
+        sample.setAsCopy(oldKSample, positionsSample2);
+        toTest.removeSubEdge(sample);
+        boolean flag = false;
+        
+        for(long i = 0 ; i < removeElements; i++) {
+            PositionWritable forCompare  = new PositionWritable((byte)0, i*i*2, 0);
+            if(toTest.get(0).getReadIDs().getPosition((int) i) == forCompare){
+                flag = true;
+                break;
+            }
+        }
+        Assert.assertFalse(flag);
+    }
+    
+    @Test
+    public void TestUnionUpdate() throws IOException {
+        String kmerSample = "ATGCATGCGCTAGCTAGCTAGACTACGATGCATGCTAGCTAATCGATCGATCGAT";
+        VKmerBytesWritable KSample = new VKmerBytesWritable(kmerSample);
+        EdgeWritable sample = new EdgeWritable();
+        PositionListWritable positionsSample = new PositionListWritable();
+        long numelements = 100;
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i % 50);
+        }
+        sample.setAsCopy(KSample, positionsSample);
+        EdgeWritable sample2 = new EdgeWritable();
+        for (long i = 0; i < numelements; i++) {
+            positionsSample.appendReadId(i % 30);
+        }
+        sample2.setAsCopy(KSample, positionsSample);
+        ArrayList<EdgeWritable> sampleList = new ArrayList<EdgeWritable>();
+        sampleList.add(sample);
+        ArrayList<EdgeWritable> sampleList2 = new ArrayList<EdgeWritable>();
+        sampleList2.add(sample2);
+        EdgeListWritable toTest = new EdgeListWritable(sampleList);
+        EdgeListWritable toTest2 = new EdgeListWritable(sampleList2);
+        toTest.unionUpdate(toTest2);
+        PositionListWritable targetSample = new PositionListWritable();
+        numelements = 50;
+        for (long i = 0; i < 50; i++) {
+            targetSample.appendReadId(i);
+        }
+        EdgeWritable targetEdge = new EdgeWritable();
+        targetEdge.setAsCopy(KSample, targetSample);
+        ArrayList<EdgeWritable> targeList = new ArrayList<EdgeWritable>();
+        targeList.add(targetEdge);
+        EdgeListWritable toTarget = new EdgeListWritable(targeList);
+        Assert.assertEquals(true, toTarget.equals(toTest));
+    }
 }
diff --git a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/NodeWritableTest.java b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/NodeWritableTest.java
index 538a1fe..97f7fbd 100644
--- a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/NodeWritableTest.java
+++ b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/NodeWritableTest.java
@@ -8,15 +8,13 @@
 
 import org.junit.Test;
 
-import edu.uci.ics.genomix.data.KmerUtil;
-import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 
 public class NodeWritableTest {
 
@@ -50,8 +48,8 @@
         n1.setInternalKmer(k1);
         n1.setAvgCoverage(10);
         n1.getStartReads().append(read1);
-        n1.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k2, plist1));
-        Assert.assertEquals("(50-0_0)", n1.getEdgeList(DirectionFlag.DIR_RF).get(0).getReadIDs().getPosition(0)
+        n1.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k2, plist1));
+        Assert.assertEquals("(50-0_0)", n1.getEdgeList(EDGETYPE.RF).get(0).getReadIDs().getPosition(0)
                 .toString());
         Assert.assertEquals(10f, n1.getAvgCoverage());
 
@@ -60,16 +58,16 @@
         n2.setAvgCoverage(20);
         n2.getStartReads().append(read2);
         Assert.assertEquals(1, n2.getStartReads().getCountOfPosition());
-        n2.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k1, plist1));
-        n2.getEdgeList(DirectionFlag.DIR_FF).add(new EdgeWritable(k3, plist3));
+        n2.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k1, plist1));
+        n2.getEdgeList(EDGETYPE.FF).add(new EdgeWritable(k3, plist3));
         Assert.assertEquals(20f, n2.getAvgCoverage());
 
         NodeWritable n3 = new NodeWritable();
         n3.setInternalKmer(k3);
         n3.setAvgCoverage(30);
         n3.getEndReads().append(read3);
-        n3.getEdgeList(DirectionFlag.DIR_RR).add(new EdgeWritable(k2, plist3));
-        Assert.assertEquals("(100-0_0)", n3.getEdgeList(DirectionFlag.DIR_RR).get(0).getReadIDs().getPosition(0)
+        n3.getEdgeList(EDGETYPE.RR).add(new EdgeWritable(k2, plist3));
+        Assert.assertEquals("(100-0_0)", n3.getEdgeList(EDGETYPE.RR).get(0).getReadIDs().getPosition(0)
                 .toString());
         Assert.assertEquals(30f, n3.getAvgCoverage());
 
@@ -96,7 +94,7 @@
         //      Assert.assertEquals("ATCTAG", k2.toString());
         //      k2.mergeWithFFKmer(5, k3);
         //      Assert.assertEquals("ATCTAGC", k2.toString());
-        n2.mergeWithNode(DirectionFlag.DIR_RF, n1);
+        n2.mergeWithNode(EDGETYPE.RF, n1);
         Assert.assertEquals("ATCTAG", n2.getInternalKmer().toString());
         Assert.assertEquals(15f, n2.getAvgCoverage());
         Assert.assertEquals(1, n2.getEndReads().getCountOfPosition());
@@ -105,9 +103,9 @@
         Assert.assertEquals("(75-1_1)", n2.getStartReads().getPosition(0).toString());
         Assert.assertEquals(0, n2.inDegree());
         Assert.assertEquals(1, n2.outDegree());
-        Assert.assertEquals(k3, n2.getEdgeList(DirectionFlag.DIR_FF).get(0).getKey());
+        Assert.assertEquals(k3, n2.getEdgeList(EDGETYPE.FF).get(0).getKey());
 
-        n2.mergeWithNode(DirectionFlag.DIR_FF, n3);
+        n2.mergeWithNode(EDGETYPE.FF, n3);
         Assert.assertEquals("ATCTAGC", n2.getInternalKmer().toString());
         Assert.assertEquals(20f, n2.getAvgCoverage());
         Assert.assertEquals(2, n2.getEndReads().getCountOfPosition());
@@ -150,21 +148,21 @@
         n1.setInternalKmer(k1);
         n1.setAvgCoverage(10);
         n1.getStartReads().append(read1);
-        n1.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k2, plist1));
+        n1.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k2, plist1));
         NodeWritable n1_2 = new NodeWritable();  // duplicate node which should end up union'ed in
         n1_2.setInternalKmer(k1);
         n1_2.setAvgCoverage(10);
         n1_2.getStartReads().append(read1);
-        n1_2.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k3, plist3));
-        n1_2.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k2, plist2));
+        n1_2.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k3, plist3));
+        n1_2.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k2, plist2));
         
         // take the union of the edges (a la graphbuilding)
-        n1.getEdgeList(DirectionFlag.DIR_RF).unionUpdate(n1_2.getEdgeList(DirectionFlag.DIR_RF));
+        n1.getEdgeList(EDGETYPE.RF).unionUpdate(n1_2.getEdgeList(EDGETYPE.RF));
         
         // the union-update may change the ordering of the original list (what a pain!)
-        Iterator<EdgeWritable> rf_edges = n1.getEdgeList(DirectionFlag.DIR_RF).iterator();
+        Iterator<EdgeWritable> rf_edges = n1.getEdgeList(EDGETYPE.RF).iterator();
         int k2_index = 0, k3_index = 0;
-        for (int i=0; i < n1.getEdgeList(DirectionFlag.DIR_RF).getCountOfPosition(); i++) {
+        for (int i=0; i < n1.getEdgeList(EDGETYPE.RF).getCountOfPosition(); i++) {
             VKmerBytesWritable curKmer = rf_edges.next().getKey();
             if (curKmer.equals(k2))
                 k2_index = i;
@@ -172,15 +170,15 @@
                 k3_index = i;
         }
         
-        Assert.assertEquals(2, n1.getEdgeList(DirectionFlag.DIR_RF).getCountOfPosition()); // only k2 and k3 in list
-        Assert.assertEquals(k2, n1.getEdgeList(DirectionFlag.DIR_RF).get(k2_index).getKey());
-        Assert.assertEquals(k3, n1.getEdgeList(DirectionFlag.DIR_RF).get(k3_index).getKey());
-        Assert.assertEquals(3, n1.getEdgeList(DirectionFlag.DIR_RF).get(k2_index).getReadIDs().getCountOfPosition()); // k2 has r1,r2,r3
-        Assert.assertEquals(1, n1.getEdgeList(DirectionFlag.DIR_RF).get(k3_index).getReadIDs().getCountOfPosition()); // k3 has r3 
+        Assert.assertEquals(2, n1.getEdgeList(EDGETYPE.RF).getCountOfPosition()); // only k2 and k3 in list
+        Assert.assertEquals(k2, n1.getEdgeList(EDGETYPE.RF).get(k2_index).getKey());
+        Assert.assertEquals(k3, n1.getEdgeList(EDGETYPE.RF).get(k3_index).getKey());
+        Assert.assertEquals(3, n1.getEdgeList(EDGETYPE.RF).get(k2_index).getReadIDs().getCountOfPosition()); // k2 has r1,r2,r3
+        Assert.assertEquals(1, n1.getEdgeList(EDGETYPE.RF).get(k3_index).getReadIDs().getCountOfPosition()); // k3 has r3 
         
-        long[] k2_readids = n1.getEdgeList(DirectionFlag.DIR_RF).get(k2_index).readIDArray();
+        long[] k2_readids = n1.getEdgeList(EDGETYPE.RF).get(k2_index).readIDArray();
         Assert.assertEquals(3, k2_readids.length);
-        long[] k3_readids = n1.getEdgeList(DirectionFlag.DIR_RF).get(k3_index).readIDArray();
+        long[] k3_readids = n1.getEdgeList(EDGETYPE.RF).get(k3_index).readIDArray();
         Assert.assertEquals(1, k3_readids.length);
         
         boolean[] found = {false, false, false};
diff --git a/genomix/genomix-driver/src/main/java/edu/uci/ics/genomix/driver/GenomixDriver.java b/genomix/genomix-driver/src/main/java/edu/uci/ics/genomix/driver/GenomixDriver.java
index 9d3c591..831cc17 100644
--- a/genomix/genomix-driver/src/main/java/edu/uci/ics/genomix/driver/GenomixDriver.java
+++ b/genomix/genomix-driver/src/main/java/edu/uci/ics/genomix/driver/GenomixDriver.java
@@ -64,11 +64,11 @@
     private String prevOutput;
     private String curOutput;
     private int stepNum;
-    private List<PregelixJob> pregelixJobs;
+    private List<PregelixJob> pregelixJobs; // TODO add sanity checks to pipeline order
     private boolean followingBuild = false; // need to adapt the graph immediately after building
-    private boolean runLocal;
-    private int numCoresPerMachine;
-    private int numMachines;
+    private boolean runLocal = false;
+    private int numCoresPerMachine; // TODO remove ?
+    private int numMachines; // TODO remove ?
 
     private GenomixClusterManager manager;
     private edu.uci.ics.genomix.hyracks.graph.driver.Driver hyracksDriver;
@@ -78,12 +78,14 @@
         LOG.info("Building Graph using Hyracks...");
         manager.startCluster(ClusterType.HYRACKS);
         GenomixJobConf.tick("buildGraphWithHyracks");
+        // TODO move this to parser
         conf.set(GenomixJobConf.OUTPUT_FORMAT, Boolean.parseBoolean(conf.get(GenomixJobConf.HYRACKS_BUILD_OUTPUT_TEXT)) ? GenomixJobConf.OUTPUT_FORMAT_TEXT : GenomixJobConf.OUTPUT_FORMAT_BINARY);
         conf.set(GenomixJobConf.GROUPBY_TYPE, GenomixJobConf.GROUPBY_TYPE_PRECLUSTER);
+        
         String hyracksIP = runLocal ? GenomixClusterManager.LOCAL_IP : conf.get(GenomixJobConf.IP_ADDRESS);
         int hyracksPort = runLocal ? GenomixClusterManager.LOCAL_HYRACKS_CLIENT_PORT : Integer.parseInt(conf.get(GenomixJobConf.PORT));
         hyracksDriver = new edu.uci.ics.genomix.hyracks.graph.driver.Driver(hyracksIP, hyracksPort, numCoresPerMachine);
-        hyracksDriver.runJob(conf, Plan.BUILD_UNMERGED_GRAPH, Boolean.parseBoolean(conf.get(GenomixJobConf.PROFILE)));
+        hyracksDriver.runJob(conf, Plan.BUILD_UNMERGED_GRAPH, Boolean.parseBoolean(conf.get(GenomixJobConf.PROFILE))); // TODO fix name of plan
         followingBuild = true;
         manager.stopCluster(ClusterType.HYRACKS);
         LOG.info("Building the graph took " + GenomixJobConf.tock("buildGraphWithHyracks") + "ms");
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
index c928c84..7733999 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
@@ -11,7 +11,6 @@
 import org.apache.hadoop.mapred.SequenceFileOutputFormat;
 import org.apache.hadoop.mapred.TextInputFormat;
 import org.apache.hadoop.mapred.TextOutputFormat;
-import org.apache.hadoop.mapred.lib.NLineInputFormat;
 import org.kohsuke.args4j.CmdLineParser;
 import org.kohsuke.args4j.Option;
 
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java
index 849f8cf..759419a 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java
@@ -7,7 +7,6 @@
 
 import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.Text;
-import org.apache.hadoop.mapred.InputFormat;
 import org.apache.hadoop.mapred.JobConf;
 import org.apache.hadoop.mapred.MapReduceBase;
 import org.apache.hadoop.mapred.Mapper;
@@ -18,11 +17,11 @@
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 
 @SuppressWarnings("deprecation")
 public class GenomixMapper extends MapReduceBase implements
@@ -202,14 +201,14 @@
     				    edgeForPreKmer.setKey(preForwardKmer);
     				    edgeForPreKmer.setReadIDs(nodeIdList);
     				    edgeListForPreKmer.add(edgeForPreKmer);
-    				    outputNode.setEdgeList(DirectionFlag.DIR_RR, edgeListForPreKmer);
+    				    outputNode.setEdgeList(EDGETYPE.RR, edgeListForPreKmer);
     					break;
     				case REVERSE:
                         edgeListForPreKmer.reset();
                         edgeForPreKmer.setKey(preReverseKmer);
                         edgeForPreKmer.setReadIDs(nodeIdList);
                         edgeListForPreKmer.add(edgeForPreKmer);
-    				    outputNode.setEdgeList(DirectionFlag.DIR_RF, edgeListForPreKmer);
+    				    outputNode.setEdgeList(EDGETYPE.RF, edgeListForPreKmer);
     					break;
     			}
     			break;
@@ -220,14 +219,14 @@
                         edgeForPreKmer.setKey(preForwardKmer);
                         edgeForPreKmer.setReadIDs(nodeIdList);
                         edgeListForPreKmer.add(edgeForPreKmer);
-    				    outputNode.setEdgeList(DirectionFlag.DIR_FR, edgeListForPreKmer);
+    				    outputNode.setEdgeList(EDGETYPE.FR, edgeListForPreKmer);
     					break;
     				case REVERSE:
     				    edgeListForPreKmer.reset();
                         edgeForPreKmer.setKey(preReverseKmer);
                         edgeForPreKmer.setReadIDs(nodeIdList);
                         edgeListForPreKmer.add(edgeForPreKmer);
-    				    outputNode.setEdgeList(DirectionFlag.DIR_FF, edgeListForPreKmer);
+    				    outputNode.setEdgeList(EDGETYPE.FF, edgeListForPreKmer);
     					break;
     			}
     			break;
@@ -243,14 +242,14 @@
     				    edgeForNextKmer.setKey(nextForwardKmer);
     				    edgeForNextKmer.setReadIDs(nodeIdList);
     				    edgeListForNextKmer.add(edgeForNextKmer);
-    					outputNode.setEdgeList(DirectionFlag.DIR_FF, edgeListForNextKmer);
+    					outputNode.setEdgeList(EDGETYPE.FF, edgeListForNextKmer);
     					break;
     				case REVERSE:
     				    edgeListForNextKmer.reset();
                         edgeForNextKmer.setKey(nextReverseKmer);
                         edgeForNextKmer.setReadIDs(nodeIdList);
                         edgeListForNextKmer.add(edgeForNextKmer);
-    					outputNode.setEdgeList(DirectionFlag.DIR_FR, edgeListForNextKmer);
+    					outputNode.setEdgeList(EDGETYPE.FR, edgeListForNextKmer);
     					break;
     			}
     			break;
@@ -262,14 +261,14 @@
                         edgeForNextKmer.setReadIDs(nodeIdList);
                         edgeListForNextKmer.add(edgeForNextKmer);
     				    new EdgeListWritable(Arrays.asList(new EdgeWritable(nextForwardKmer, nodeIdList)));
-    					outputNode.setEdgeList(DirectionFlag.DIR_RF, edgeListForNextKmer);
+    					outputNode.setEdgeList(EDGETYPE.RF, edgeListForNextKmer);
     					break;
     				case REVERSE:
     				    edgeListForNextKmer.reset();
                         edgeForNextKmer.setKey(nextReverseKmer);
                         edgeForNextKmer.setReadIDs(nodeIdList);
                         edgeListForNextKmer.add(edgeForNextKmer);
-    					outputNode.setEdgeList(DirectionFlag.DIR_RR, edgeListForNextKmer);
+    					outputNode.setEdgeList(EDGETYPE.RR, edgeListForNextKmer);
     					break;
     			}
     			break;
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixReducer.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixReducer.java
index 6bc4549..a1c21ee 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixReducer.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixReducer.java
@@ -1,6 +1,7 @@
 package edu.uci.ics.genomix.hadoop.contrailgraphbuilding;
 
 import java.io.IOException;
+import java.util.EnumSet;
 import java.util.Iterator;
 
 import org.apache.hadoop.mapred.JobConf;
@@ -10,7 +11,7 @@
 import org.apache.hadoop.mapred.Reporter;
 
 import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 
 @SuppressWarnings("deprecation")
@@ -38,8 +39,8 @@
 		
 		while (values.hasNext()) {
 		    tmpNode.setAsCopy(values.next());
-		    for (byte d: DirectionFlag.values) {
-		        outputNode.getEdgeList(d).unionUpdate(tmpNode.getEdgeList(d));
+		    for (EDGETYPE e: EnumSet.allOf(EDGETYPE.class)) {
+		        outputNode.getEdgeList(e).unionUpdate(tmpNode.getEdgeList(e));
 		    }
 		    outputNode.getStartReads().unionUpdate(tmpNode.getStartReads());
 		    outputNode.getEndReads().unionUpdate(tmpNode.getEndReads());
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java
index 84a5361..90b66ee 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java
@@ -12,8 +12,8 @@
 
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 
 public class GenerateGraphViz {
 
@@ -74,25 +74,25 @@
     public static String convertEdgeToGraph(String outputNode, NodeWritable value) {
         String outputEdge = "";
         Iterator<EdgeWritable> edgeIterator;
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next(); 
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphbuilding/checkingtool/ResultsCheckingMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphbuilding/checkingtool/ResultsCheckingMapper.java
index 3b5738f..e4a00fd 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphbuilding/checkingtool/ResultsCheckingMapper.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphbuilding/checkingtool/ResultsCheckingMapper.java
@@ -25,7 +25,6 @@
 import org.apache.hadoop.mapred.Reporter;
 
 import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 
 @SuppressWarnings("deprecation")
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/ReadsKeyValueParserFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/ReadsKeyValueParserFactory.java
index 0b22295..10d18ac 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/ReadsKeyValueParserFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/ReadsKeyValueParserFactory.java
@@ -31,9 +31,9 @@
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 import edu.uci.ics.hyracks.api.comm.IFrameWriter;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -251,27 +251,27 @@
                     NodeWritable nextNode, PositionListWritable readIdList, EdgeWritable tempEdge) {
                 if (curKmerDir == KmerDir.FORWARD && nextKmerDir == KmerDir.FORWARD) {
                     tempEdge.setAsCopy(nextForwardKmer, readIdList);
-                    curNode.getEdgeList(DirectionFlag.DIR_FF).add(tempEdge);
+                    curNode.getEdgeList(EDGETYPE.FF).add(tempEdge);
                     tempEdge.setAsCopy(curForwardKmer, readIdList);
-                    nextNode.getEdgeList(DirectionFlag.DIR_RR).add(tempEdge);
+                    nextNode.getEdgeList(EDGETYPE.RR).add(tempEdge);
                 }
                 if (curKmerDir == KmerDir.FORWARD && nextKmerDir == KmerDir.REVERSE) {
                     tempEdge.setAsCopy(nextReverseKmer, readIdList);
-                    curNode.getEdgeList(DirectionFlag.DIR_FR).add(tempEdge);
+                    curNode.getEdgeList(EDGETYPE.FR).add(tempEdge);
                     tempEdge.setAsCopy(curForwardKmer, readIdList);
-                    nextNode.getEdgeList(DirectionFlag.DIR_FR).add(tempEdge);
+                    nextNode.getEdgeList(EDGETYPE.FR).add(tempEdge);
                 }
                 if (curKmerDir == KmerDir.REVERSE && nextKmerDir == KmerDir.FORWARD) {
                     tempEdge.setAsCopy(nextForwardKmer, readIdList);
-                    curNode.getEdgeList(DirectionFlag.DIR_RF).add(tempEdge);
+                    curNode.getEdgeList(EDGETYPE.RF).add(tempEdge);
                     tempEdge.setAsCopy(curReverseKmer, readIdList);
-                    nextNode.getEdgeList(DirectionFlag.DIR_RF).add(tempEdge);
+                    nextNode.getEdgeList(EDGETYPE.RF).add(tempEdge);
                 }
                 if (curKmerDir == KmerDir.REVERSE && nextKmerDir == KmerDir.REVERSE) {
                     tempEdge.setAsCopy(nextReverseKmer, readIdList);
-                    curNode.getEdgeList(DirectionFlag.DIR_RR).add(tempEdge);
+                    curNode.getEdgeList(EDGETYPE.RR).add(tempEdge);
                     tempEdge.setAsCopy(curReverseKmer, readIdList);
-                    nextNode.getEdgeList(DirectionFlag.DIR_FF).add(tempEdge);
+                    nextNode.getEdgeList(EDGETYPE.FF).add(tempEdge);
                 }
             }
 
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/AggregateKmerAggregateFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/AggregateKmerAggregateFactory.java
index a74f3b8..3825d48 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/AggregateKmerAggregateFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/AggregateKmerAggregateFactory.java
@@ -17,12 +17,13 @@
 
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.EnumSet;
 import java.util.Iterator;
 
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.hyracks.api.comm.IFrameTupleAccessor;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
@@ -98,8 +99,8 @@
 //                        localUniNode.foundMe = true;
 //                    }
 //                }
-                for (byte d: DirectionFlag.values) {
-                    localUniNode.getEdgeList(d).unionUpdate((readNode.getEdgeList(d)));
+                for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+                    localUniNode.getEdgeList(e).unionUpdate((readNode.getEdgeList(e)));
                 }
                 localUniNode.getStartReads().appendList(readNode.getStartReads());
                 localUniNode.getEndReads().appendList(readNode.getEndReads());
@@ -115,8 +116,8 @@
 
 //                readKmer.setAsCopy(accessor.getBuffer().array(), getOffSet(accessor, tIndex, 0));
                 readNode.setAsReference(accessor.getBuffer().array(), getOffSet(accessor, tIndex, 1));
-                for (byte d: DirectionFlag.values) {
-                    localUniNode.getEdgeList(d).unionUpdate(readNode.getEdgeList(d));
+                for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+                    localUniNode.getEdgeList(e).unionUpdate(readNode.getEdgeList(e));
                 }
                 localUniNode.getStartReads().appendList(readNode.getStartReads());
                 localUniNode.getEndReads().appendList(readNode.getEndReads());
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/MergeKmerAggregateFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/MergeKmerAggregateFactory.java
index a3a7e1a..8abe8d8 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/MergeKmerAggregateFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/MergeKmerAggregateFactory.java
@@ -17,6 +17,7 @@
 
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.EnumSet;
 import java.util.logging.Logger;
 
 import org.apache.commons.logging.Log;
@@ -24,7 +25,7 @@
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.hyracks.api.comm.IFrameTupleAccessor;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
@@ -85,8 +86,8 @@
 //                    }
 //                }
                 
-                for (byte d : DirectionFlag.values) {
-                    localUniNode.getEdgeList(d).unionUpdate(readNode.getEdgeList(d));
+                for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+                    localUniNode.getEdgeList(e).unionUpdate(readNode.getEdgeList(e));
                 }
                 localUniNode.getStartReads().unionUpdate(readNode.getStartReads());
                 localUniNode.getEndReads().unionUpdate(readNode.getEndReads());
@@ -124,8 +125,8 @@
 //                    }
 //                }
                 
-                for (byte d : DirectionFlag.values) {
-                    localUniNode.getEdgeList(d).unionUpdate(readNode.getEdgeList(d));
+                for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+                    localUniNode.getEdgeList(e).unionUpdate(readNode.getEdgeList(e));
                 }
                 localUniNode.getStartReads().unionUpdate(readNode.getStartReads());
                 localUniNode.getEndReads().unionUpdate(readNode.getEndReads());
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/util/GenerateGraphViz.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/util/GenerateGraphViz.java
index b90e30f..ff7f7fa 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/util/GenerateGraphViz.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/util/GenerateGraphViz.java
@@ -12,8 +12,8 @@
 
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 
 public class GenerateGraphViz {
 
@@ -74,25 +74,25 @@
     public static String convertEdgeToGraph(String outputNode, NodeWritable value) {
         String outputEdge = "";
         Iterator<EdgeWritable> edgeIterator;
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next(); 
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
diff --git a/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hadoop/graph/test/GenerateGraphViz.java b/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hadoop/graph/test/GenerateGraphViz.java
index 43bb8ff..85c0ec6 100644
--- a/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hadoop/graph/test/GenerateGraphViz.java
+++ b/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hadoop/graph/test/GenerateGraphViz.java
@@ -13,7 +13,7 @@
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 
 public class GenerateGraphViz {
 
@@ -74,25 +74,25 @@
     public static String convertEdgeToGraph(String outputNode, NodeWritable value) {
         String outputEdge = "";
         Iterator<EdgeWritable> edgeIterator;
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next(); 
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/.statistics.crc
similarity index 100%
rename from genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc
rename to genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/.statistics.crc
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-0.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-0.crc
index bf60a71..de75c33 100644
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-0.crc
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-0.crc
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-1.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-1.crc
index 744fbef..7120be2 100644
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-1.crc
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-1.crc
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-0 b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-0
index 7934715..89795c2 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-0
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-0
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-1 b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-1
index fc82ad0..0ca2113 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-1
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-1
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz.svg b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz.svg
new file mode 100644
index 0000000..a9f1169
--- /dev/null
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz.svg
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.26.3 (20100126.1600)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="620pt" height="286pt"
+ viewBox="0.00 0.00 620.00 286.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph1" class="graph" transform="scale(1 1) rotate(0) translate(4 282)">
+<title>G</title>
+<polygon fill="white" stroke="white" points="-4,5 -4,-282 617,-282 617,5 -4,5"/>
+<!-- GAA -->
+<g id="node1" class="node"><title>GAA</title>
+<polygon fill="none" stroke="black" points="0,-75 0,-205 56,-205 56,-75 0,-75"/>
+<text text-anchor="middle" x="28" y="-188.4" font-family="Times Roman,serif" font-size="14.00">GAA</text>
+<polyline fill="none" stroke="black" points="0,-179 56,-179 "/>
+<text text-anchor="middle" x="28" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="0,-153 56,-153 "/>
+<text text-anchor="middle" x="28" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="0,-127 56,-127 "/>
+<text text-anchor="middle" x="28" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="0,-101 56,-101 "/>
+<text text-anchor="middle" x="28" y="-84.4" font-family="Times Roman,serif" font-size="14.00">GAA</text>
+</g>
+<!-- AGA -->
+<g id="node3" class="node"><title>AGA</title>
+<polygon fill="none" stroke="black" points="140,-75 140,-205 196,-205 196,-75 140,-75"/>
+<text text-anchor="middle" x="168" y="-188.4" font-family="Times Roman,serif" font-size="14.00">AGA</text>
+<polyline fill="none" stroke="black" points="140,-179 196,-179 "/>
+<text text-anchor="middle" x="168" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="140,-153 196,-153 "/>
+<text text-anchor="middle" x="168" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="140,-127 196,-127 "/>
+<text text-anchor="middle" x="168" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="140,-101 196,-101 "/>
+<text text-anchor="middle" x="168" y="-84.4" font-family="Times Roman,serif" font-size="14.00">AGA</text>
+</g>
+<!-- GAA&#45;&gt;AGA -->
+<g id="edge2" class="edge"><title>GAA&#45;&gt;AGA</title>
+<path fill="none" stroke="red" d="M56.3311,-140C77.3945,-140 106.372,-140 129.53,-140"/>
+<polygon fill="red" stroke="red" points="129.711,-143.5 139.711,-140 129.711,-136.5 129.711,-143.5"/>
+<text text-anchor="middle" x="98" y="-145.4" font-family="Times Roman,serif" font-size="14.00">RR: [1]</text>
+</g>
+<!-- AGA&#45;&gt;GAA -->
+<g id="edge4" class="edge"><title>AGA&#45;&gt;GAA</title>
+<path fill="none" stroke="black" d="M139.511,-123.987C133.868,-121.508 127.871,-119.332 122,-118 101.195,-113.281 94.8048,-113.281 74,-118 71.3399,-118.603 68.6538,-119.38 65.9864,-120.28"/>
+<polygon fill="black" stroke="black" points="64.5325,-117.09 56.4893,-123.987 67.0775,-123.611 64.5325,-117.09"/>
+<text text-anchor="middle" x="98" y="-123.4" font-family="Times Roman,serif" font-size="14.00">FF: [1]</text>
+</g>
+<!-- CTA -->
+<g id="node6" class="node"><title>CTA</title>
+<polygon fill="none" stroke="black" points="278,-75 278,-205 334,-205 334,-75 278,-75"/>
+<text text-anchor="middle" x="306" y="-188.4" font-family="Times Roman,serif" font-size="14.00">CTA</text>
+<polyline fill="none" stroke="black" points="278,-179 334,-179 "/>
+<text text-anchor="middle" x="306" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="278,-153 334,-153 "/>
+<text text-anchor="middle" x="306" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="278,-127 334,-127 "/>
+<text text-anchor="middle" x="306" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="278,-101 334,-101 "/>
+<text text-anchor="middle" x="306" y="-84.4" font-family="Times Roman,serif" font-size="14.00">CTA</text>
+</g>
+<!-- AGA&#45;&gt;CTA -->
+<g id="edge6" class="edge"><title>AGA&#45;&gt;CTA</title>
+<path fill="none" stroke="green" d="M196.259,-140C216.818,-140 244.894,-140 267.501,-140"/>
+<polygon fill="green" stroke="green" points="267.778,-143.5 277.778,-140 267.778,-136.5 267.778,-143.5"/>
+<text text-anchor="middle" x="237" y="-145.4" font-family="Times Roman,serif" font-size="14.00">RF: [1]</text>
+</g>
+<!-- CTA&#45;&gt;AGA -->
+<g id="edge20" class="edge"><title>CTA&#45;&gt;AGA</title>
+<path fill="none" stroke="green" d="M277.511,-123.987C271.868,-121.508 265.871,-119.332 260,-118 240.062,-113.478 233.938,-113.478 214,-118 211.34,-118.603 208.654,-119.38 205.986,-120.28"/>
+<polygon fill="green" stroke="green" points="204.532,-117.09 196.489,-123.987 207.078,-123.611 204.532,-117.09"/>
+<text text-anchor="middle" x="237" y="-123.4" font-family="Times Roman,serif" font-size="14.00">RF: [1]</text>
+</g>
+<!-- ATA -->
+<g id="node7" class="node"><title>ATA</title>
+<polygon fill="none" stroke="black" points="416,-148 416,-278 472,-278 472,-148 416,-148"/>
+<text text-anchor="middle" x="444" y="-261.4" font-family="Times Roman,serif" font-size="14.00">ATA</text>
+<polyline fill="none" stroke="black" points="416,-252 472,-252 "/>
+<text text-anchor="middle" x="444" y="-235.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="416,-226 472,-226 "/>
+<text text-anchor="middle" x="444" y="-209.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="416,-200 472,-200 "/>
+<text text-anchor="middle" x="444" y="-183.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="416,-174 472,-174 "/>
+<text text-anchor="middle" x="444" y="-157.4" font-family="Times Roman,serif" font-size="14.00">ATA</text>
+</g>
+<!-- CTA&#45;&gt;ATA -->
+<g id="edge16" class="edge"><title>CTA&#45;&gt;ATA</title>
+<path fill="none" stroke="blue" d="M334.238,-175.156C339.685,-180.371 345.68,-185.245 352,-189 368.218,-198.635 388.29,-204.451 405.543,-207.937"/>
+<polygon fill="blue" stroke="blue" points="405.396,-211.467 415.862,-209.819 406.653,-204.581 405.396,-211.467"/>
+<text text-anchor="middle" x="375" y="-212.4" font-family="Times Roman,serif" font-size="14.00">FR: [1]</text>
+</g>
+<!-- AGC -->
+<g id="node11" class="node"><title>AGC</title>
+<polygon fill="none" stroke="black" points="416,-0 416,-130 472,-130 472,-0 416,-0"/>
+<text text-anchor="middle" x="444" y="-113.4" font-family="Times Roman,serif" font-size="14.00">AGC</text>
+<polyline fill="none" stroke="black" points="416,-104 472,-104 "/>
+<text text-anchor="middle" x="444" y="-87.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="416,-78 472,-78 "/>
+<text text-anchor="middle" x="444" y="-61.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="416,-52 472,-52 "/>
+<text text-anchor="middle" x="444" y="-35.4" font-family="Times Roman,serif" font-size="14.00">0.0</text>
+<polyline fill="none" stroke="black" points="416,-26 472,-26 "/>
+<text text-anchor="middle" x="444" y="-9.4" font-family="Times Roman,serif" font-size="14.00"> </text>
+</g>
+<!-- CTA&#45;&gt;AGC -->
+<g id="edge18" class="edge"><title>CTA&#45;&gt;AGC</title>
+<path fill="none" stroke="blue" d="M334.075,-128.859C352.667,-121.079 377.341,-109.974 398,-98 401.162,-96.1672 404.376,-94.1705 407.561,-92.0962"/>
+<polygon fill="blue" stroke="blue" points="409.539,-94.9835 415.864,-86.4835 405.619,-89.1841 409.539,-94.9835"/>
+<text text-anchor="middle" x="375" y="-126.4" font-family="Times Roman,serif" font-size="14.00">FR: [0]</text>
+</g>
+<!-- ATA&#45;&gt;CTA -->
+<g id="edge8" class="edge"><title>ATA&#45;&gt;CTA</title>
+<path fill="none" stroke="blue" d="M415.758,-183.923C410.185,-179.17 404.149,-174.624 398,-171 381.37,-161.201 361.207,-153.965 344.001,-148.96"/>
+<polygon fill="blue" stroke="blue" points="344.832,-145.559 334.261,-146.269 342.967,-152.306 344.832,-145.559"/>
+<text text-anchor="middle" x="375" y="-176.4" font-family="Times Roman,serif" font-size="14.00">FR: [1]</text>
+</g>
+<!-- AAT -->
+<g id="node10" class="node"><title>AAT</title>
+<polygon fill="grey" stroke="black" points="556,-147 556,-277 612,-277 612,-147 556,-147"/>
+<text text-anchor="middle" x="584" y="-260.4" font-family="Times Roman,serif" font-size="14.00">AAT</text>
+<polyline fill="none" stroke="black" points="556,-251 612,-251 "/>
+<text text-anchor="middle" x="584" y="-234.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[1]</text>
+<polyline fill="none" stroke="black" points="556,-225 612,-225 "/>
+<text text-anchor="middle" x="584" y="-208.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="556,-199 612,-199 "/>
+<text text-anchor="middle" x="584" y="-182.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="556,-173 612,-173 "/>
+<text text-anchor="middle" x="584" y="-156.4" font-family="Times Roman,serif" font-size="14.00">AAT</text>
+</g>
+<!-- ATA&#45;&gt;AAT -->
+<g id="edge10" class="edge"><title>ATA&#45;&gt;AAT</title>
+<path fill="none" stroke="red" d="M472.331,-212.798C493.395,-212.647 522.372,-212.44 545.53,-212.275"/>
+<polygon fill="red" stroke="red" points="545.736,-215.773 555.711,-212.202 545.686,-208.774 545.736,-215.773"/>
+<text text-anchor="middle" x="514" y="-218.4" font-family="Times Roman,serif" font-size="14.00">RR: [1]</text>
+</g>
+<!-- AAT&#45;&gt;ATA -->
+<g id="edge14" class="edge"><title>AAT&#45;&gt;ATA</title>
+<path fill="none" stroke="black" d="M555.947,-196.92C550.165,-194.468 544.005,-192.306 538,-191 517.154,-186.467 510.805,-186.281 490,-191 487.34,-191.603 484.654,-192.38 481.986,-193.28"/>
+<polygon fill="black" stroke="black" points="480.532,-190.09 472.489,-196.987 483.078,-196.611 480.532,-190.09"/>
+<text text-anchor="middle" x="514" y="-196.4" font-family="Times Roman,serif" font-size="14.00">FF: [1]</text>
+</g>
+<!-- AGC&#45;&gt;CTA -->
+<g id="edge12" class="edge"><title>AGC&#45;&gt;CTA</title>
+<path fill="none" stroke="blue" d="M415.595,-64.3145C396.401,-65.0709 371.165,-68.5339 352,-80 348.325,-82.1986 344.84,-84.8113 341.556,-87.6969"/>
+<polygon fill="blue" stroke="blue" points="338.945,-85.3548 334.262,-94.8585 343.85,-90.3495 338.945,-85.3548"/>
+<text text-anchor="middle" x="375" y="-85.4" font-family="Times Roman,serif" font-size="14.00">FR: [0]</text>
+</g>
+</g>
+</svg>
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz/result.ps b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz/result.ps
deleted file mode 100644
index bc35149..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz/result.ps
+++ /dev/null
@@ -1,718 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: graphviz version 2.26.3 (20100126.1600)
-%%Title: G
-%%Pages: (atend)
-%%BoundingBox: (atend)
-%%EndComments
-save
-%%BeginProlog
-/DotDict 200 dict def
-DotDict begin
-
-/setupLatin1 {
-mark
-/EncodingVector 256 array def
- EncodingVector 0
-
-ISOLatin1Encoding 0 255 getinterval putinterval
-EncodingVector 45 /hyphen put
-
-% Set up ISO Latin 1 character encoding
-/starnetISO {
-        dup dup findfont dup length dict begin
-        { 1 index /FID ne { def }{ pop pop } ifelse
-        } forall
-        /Encoding EncodingVector def
-        currentdict end definefont
-} def
-/Times-Roman starnetISO def
-/Times-Italic starnetISO def
-/Times-Bold starnetISO def
-/Times-BoldItalic starnetISO def
-/Helvetica starnetISO def
-/Helvetica-Oblique starnetISO def
-/Helvetica-Bold starnetISO def
-/Helvetica-BoldOblique starnetISO def
-/Courier starnetISO def
-/Courier-Oblique starnetISO def
-/Courier-Bold starnetISO def
-/Courier-BoldOblique starnetISO def
-cleartomark
-} bind def
-
-%%BeginResource: procset graphviz 0 0
-/coord-font-family /Times-Roman def
-/default-font-family /Times-Roman def
-/coordfont coord-font-family findfont 8 scalefont def
-
-/InvScaleFactor 1.0 def
-/set_scale {
-       dup 1 exch div /InvScaleFactor exch def
-       scale
-} bind def
-
-% styles
-/solid { [] 0 setdash } bind def
-/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
-/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
-/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
-/bold { 2 setlinewidth } bind def
-/filled { } bind def
-/unfilled { } bind def
-/rounded { } bind def
-/diagonals { } bind def
-
-% hooks for setting color 
-/nodecolor { sethsbcolor } bind def
-/edgecolor { sethsbcolor } bind def
-/graphcolor { sethsbcolor } bind def
-/nopcolor {pop pop pop} bind def
-
-/beginpage {	% i j npages
-	/npages exch def
-	/j exch def
-	/i exch def
-	/str 10 string def
-	npages 1 gt {
-		gsave
-			coordfont setfont
-			0 0 moveto
-			(\() show i str cvs show (,) show j str cvs show (\)) show
-		grestore
-	} if
-} bind def
-
-/set_font {
-	findfont exch
-	scalefont setfont
-} def
-
-% draw text fitted to its expected width
-/alignedtext {			% width text
-	/text exch def
-	/width exch def
-	gsave
-		width 0 gt {
-			[] 0 setdash
-			text stringwidth pop width exch sub text length div 0 text ashow
-		} if
-	grestore
-} def
-
-/boxprim {				% xcorner ycorner xsize ysize
-		4 2 roll
-		moveto
-		2 copy
-		exch 0 rlineto
-		0 exch rlineto
-		pop neg 0 rlineto
-		closepath
-} bind def
-
-/ellipse_path {
-	/ry exch def
-	/rx exch def
-	/y exch def
-	/x exch def
-	matrix currentmatrix
-	newpath
-	x y translate
-	rx ry scale
-	0 0 1 0 360 arc
-	setmatrix
-} bind def
-
-/endpage { showpage } bind def
-/showpage { } def
-
-/layercolorseq
-	[	% layer color sequence - darkest to lightest
-		[0 0 0]
-		[.2 .8 .8]
-		[.4 .8 .8]
-		[.6 .8 .8]
-		[.8 .8 .8]
-	]
-def
-
-/layerlen layercolorseq length def
-
-/setlayer {/maxlayer exch def /curlayer exch def
-	layercolorseq curlayer 1 sub layerlen mod get
-	aload pop sethsbcolor
-	/nodecolor {nopcolor} def
-	/edgecolor {nopcolor} def
-	/graphcolor {nopcolor} def
-} bind def
-
-/onlayer { curlayer ne {invis} if } def
-
-/onlayers {
-	/myupper exch def
-	/mylower exch def
-	curlayer mylower lt
-	curlayer myupper gt
-	or
-	{invis} if
-} def
-
-/curlayer 0 def
-
-%%EndResource
-%%EndProlog
-%%BeginSetup
-14 default-font-family set_font
-1 setmiterlimit
-% /arrowlength 10 def
-% /arrowwidth 5 def
-
-% make sure pdfmark is harmless for PS-interpreters other than Distiller
-/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
-% make '<<' and '>>' safe on PS Level 1 devices
-/languagelevel where {pop languagelevel}{1} ifelse
-2 lt {
-    userdict (<<) cvn ([) cvn load put
-    userdict (>>) cvn ([) cvn load put
-} if
-
-%%EndSetup
-setupLatin1
-%%Page: 1 1
-%%PageBoundingBox: 36 36 656 322
-%%PageOrientation: Portrait
-0 0 1 beginpage
-gsave
-36 36 620 286 boxprim clip newpath
-1 1 set_scale 0 rotate 40 41 translate
-% GAA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 75 moveto
-0 205 lineto
-56 205 lineto
-56 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12 188.4 moveto 32 (GAA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 179 moveto
-56 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-14 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 153 moveto
-56 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 127 moveto
-56 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-16.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 101 moveto
-56 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12 84.4 moveto 32 (GAA) alignedtext
-grestore
-% AGA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 75 moveto
-140 205 lineto
-196 205 lineto
-196 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-152.5 188.4 moveto 31 (AGA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 179 moveto
-196 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-154 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 153 moveto
-196 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-148 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 127 moveto
-196 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-156.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 101 moveto
-196 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-152.5 84.4 moveto 31 (AGA) alignedtext
-grestore
-% GAA->AGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 56.33 140 moveto
-77.39 140 106.37 140 129.53 140 curveto
-stroke
-0 1 1 edgecolor
-newpath 129.71 143.5 moveto
-139.71 140 lineto
-129.71 136.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 129.71 143.5 moveto
-139.71 140 lineto
-129.71 136.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-74 145.4 moveto 48 (RR: [1]) alignedtext
-grestore
-% AGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 139.51 123.99 moveto
-133.87 121.51 127.87 119.33 122 118 curveto
-101.2 113.28 94.8 113.28 74 118 curveto
-71.34 118.6 68.65 119.38 65.99 120.28 curveto
-stroke
-0 0 0 edgecolor
-newpath 64.53 117.09 moveto
-56.49 123.99 lineto
-67.08 123.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 64.53 117.09 moveto
-56.49 123.99 lineto
-67.08 123.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-75.5 123.4 moveto 45 (FF: [1]) alignedtext
-grestore
-% CTA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 75 moveto
-278 205 lineto
-334 205 lineto
-334 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 188.4 moveto 28 (CTA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 179 moveto
-334 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 153 moveto
-334 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-286 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 127 moveto
-334 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-294.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 101 moveto
-334 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 84.4 moveto 28 (CTA) alignedtext
-grestore
-% AGA->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 196.26 140 moveto
-216.82 140 244.89 140 267.5 140 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 267.78 143.5 moveto
-277.78 140 lineto
-267.78 136.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 267.78 143.5 moveto
-277.78 140 lineto
-267.78 136.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-214 145.4 moveto 46 (RF: [1]) alignedtext
-grestore
-% CTA->AGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 277.51 123.99 moveto
-271.87 121.51 265.87 119.33 260 118 curveto
-240.06 113.48 233.94 113.48 214 118 curveto
-211.34 118.6 208.65 119.38 205.99 120.28 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 204.53 117.09 moveto
-196.49 123.99 lineto
-207.08 123.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 204.53 117.09 moveto
-196.49 123.99 lineto
-207.08 123.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-214 123.4 moveto 46 (RF: [1]) alignedtext
-grestore
-% ATA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 148 moveto
-416 278 lineto
-472 278 lineto
-472 148 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 261.4 moveto 28 (ATA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 252 moveto
-472 252 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 235.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 226 moveto
-472 226 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-424 209.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 200 moveto
-472 200 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-432.5 183.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 174 moveto
-472 174 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 157.4 moveto 28 (ATA) alignedtext
-grestore
-% CTA->ATA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 334.24 175.16 moveto
-339.69 180.37 345.68 185.25 352 189 curveto
-368.22 198.64 388.29 204.45 405.54 207.94 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 405.4 211.47 moveto
-415.86 209.82 lineto
-406.65 204.58 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 405.4 211.47 moveto
-415.86 209.82 lineto
-406.65 204.58 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 212.4 moveto 46 (FR: [1]) alignedtext
-grestore
-% AGC
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 0 moveto
-416 130 lineto
-472 130 lineto
-472 0 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-428.5 113.4 moveto 31 (AGC) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 104 moveto
-472 104 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 87.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 78 moveto
-472 78 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-424 61.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 52 moveto
-472 52 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-432.5 35.4 moveto 23 (0.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 26 moveto
-472 26 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-441.5 9.4 moveto 5 ( ) alignedtext
-grestore
-% CTA->AGC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 334.07 128.86 moveto
-352.67 121.08 377.34 109.97 398 98 curveto
-401.16 96.17 404.38 94.17 407.56 92.1 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 409.54 94.98 moveto
-415.86 86.48 lineto
-405.62 89.18 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 409.54 94.98 moveto
-415.86 86.48 lineto
-405.62 89.18 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 126.4 moveto 46 (FR: [0]) alignedtext
-grestore
-% ATA->CTA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 415.76 183.92 moveto
-410.19 179.17 404.15 174.62 398 171 curveto
-381.37 161.2 361.21 153.96 344 148.96 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 344.83 145.56 moveto
-334.26 146.27 lineto
-342.97 152.31 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 344.83 145.56 moveto
-334.26 146.27 lineto
-342.97 152.31 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 176.4 moveto 46 (FR: [1]) alignedtext
-grestore
-% AAT
-gsave
-0 0 0.75294 nodecolor
-newpath 556 147 moveto
-556 277 lineto
-612 277 lineto
-612 147 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 147 moveto
-556 277 lineto
-612 277 lineto
-612 147 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-569.5 260.4 moveto 29 (AAT) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 251 moveto
-612 251 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-565.5 234.4 moveto 37 (5':[1]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 225 moveto
-612 225 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-564 208.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 199 moveto
-612 199 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-572.5 182.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 173 moveto
-612 173 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-569.5 156.4 moveto 29 (AAT) alignedtext
-grestore
-% ATA->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 472.33 212.8 moveto
-493.39 212.65 522.37 212.44 545.53 212.27 curveto
-stroke
-0 1 1 edgecolor
-newpath 545.74 215.77 moveto
-555.71 212.2 lineto
-545.69 208.77 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 545.74 215.77 moveto
-555.71 212.2 lineto
-545.69 208.77 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-490 218.4 moveto 48 (RR: [1]) alignedtext
-grestore
-% AAT->ATA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 555.95 196.92 moveto
-550.17 194.47 544 192.31 538 191 curveto
-517.15 186.47 510.8 186.28 490 191 curveto
-487.34 191.6 484.65 192.38 481.99 193.28 curveto
-stroke
-0 0 0 edgecolor
-newpath 480.53 190.09 moveto
-472.49 196.99 lineto
-483.08 196.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 480.53 190.09 moveto
-472.49 196.99 lineto
-483.08 196.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-491.5 196.4 moveto 45 (FF: [1]) alignedtext
-grestore
-% AGC->CTA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 415.59 64.31 moveto
-396.4 65.07 371.16 68.53 352 80 curveto
-348.33 82.2 344.84 84.81 341.56 87.7 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 338.95 85.35 moveto
-334.26 94.86 lineto
-343.85 90.35 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 338.95 85.35 moveto
-334.26 94.86 lineto
-343.85 90.35 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 85.4 moveto 46 (FR: [0]) alignedtext
-grestore
-endpage
-showpage
-grestore
-%%PageTrailer
-%%EndPage: 1
-%%Trailer
-%%Pages: 1
-%%BoundingBox: 36 36 656 322
-end
-restore
-%%EOF
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/statistics
old mode 100644
new mode 100755
similarity index 100%
copy from genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc
copy to genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/statistics
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/txt b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/txt
index 2b549e1..16d0f51 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/txt
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/txt
@@ -1,6 +1,6 @@
-GAA	{[]	[]	[]	[{AGA:[1]}]	{5':[], ~5':[]}	GAA	1.0x}
-AGA	{[{GAA:[1]}]	[]	[{CTA:[1]}]	[]	{5':[], ~5':[]}	AGA	1.0x}
-ATA	{[]	[{CTA:[1]}]	[]	[{AAT:[1]}]	{5':[], ~5':[]}	ATA	1.0x}
-AGC	{[]	[{CTA:[0]}]	[]	[]	{5':[], ~5':[]}		0.0x}
-AAT	{[{ATA:[1]}]	[]	[]	[]	{5':[(1-0_0)], ~5':[]}	AAT	1.0x}
-CTA	{[]	[{ATA:[1]},{AGC:[0]}]	[{AGA:[1]}]	[]	{5':[], ~5':[]}	CTA	1.0x}
+GAA	{[]	[]	[]	[{AGA:[1]}]	{5':[], ~5':[]}	GAA	1.0x}	IS_NON
+AGA	{[{GAA:[1]}]	[]	[{CTA:[1]}]	[]	{5':[], ~5':[]}	AGA	1.0x}	IS_NON
+ATA	{[]	[{CTA:[1]}]	[]	[{AAT:[1]}]	{5':[], ~5':[]}	ATA	1.0x}	IS_NON
+AGC	{[]	[{CTA:[0]}]	[]	[]	{5':[], ~5':[]}		0.0x}	IS_NON
+AAT	{[{ATA:[1]}]	[]	[]	[]	{5':[(1-0_0)], ~5':[]}	AAT	1.0x}	IS_NON
+CTA	{[]	[{ATA:[1]},{AGC:[0]}]	[{AGA:[1]}]	[]	{5':[], ~5':[]}	CTA	1.0x}	IS_NON
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/.statistics.crc
similarity index 100%
copy from genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc
copy to genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/.statistics.crc
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-0.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-0.crc
index dbb171a..9a96e5d 100644
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-0.crc
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-0.crc
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-1.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-1.crc
index 5973fb2..c78e320 100644
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-1.crc
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-1.crc
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-0 b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-0
index 8bf8a00..d561373 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-0
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-0
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-1 b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-1
index 88d597c..82ca566 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-1
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-1
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz.svg b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz.svg
new file mode 100644
index 0000000..724495a
--- /dev/null
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz.svg
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.26.3 (20100126.1600)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="620pt" height="286pt"
+ viewBox="0.00 0.00 620.00 286.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph1" class="graph" transform="scale(1 1) rotate(0) translate(4 282)">
+<title>G</title>
+<polygon fill="white" stroke="white" points="-4,5 -4,-282 617,-282 617,5 -4,5"/>
+<!-- GAA -->
+<g id="node1" class="node"><title>GAA</title>
+<polygon fill="none" stroke="black" points="0,-75 0,-205 56,-205 56,-75 0,-75"/>
+<text text-anchor="middle" x="28" y="-188.4" font-family="Times Roman,serif" font-size="14.00">GAA</text>
+<polyline fill="none" stroke="black" points="0,-179 56,-179 "/>
+<text text-anchor="middle" x="28" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="0,-153 56,-153 "/>
+<text text-anchor="middle" x="28" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="0,-127 56,-127 "/>
+<text text-anchor="middle" x="28" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="0,-101 56,-101 "/>
+<text text-anchor="middle" x="28" y="-84.4" font-family="Times Roman,serif" font-size="14.00">GAA</text>
+</g>
+<!-- AGA -->
+<g id="node3" class="node"><title>AGA</title>
+<polygon fill="none" stroke="black" points="140,-75 140,-205 196,-205 196,-75 140,-75"/>
+<text text-anchor="middle" x="168" y="-188.4" font-family="Times Roman,serif" font-size="14.00">AGA</text>
+<polyline fill="none" stroke="black" points="140,-179 196,-179 "/>
+<text text-anchor="middle" x="168" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="140,-153 196,-153 "/>
+<text text-anchor="middle" x="168" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="140,-127 196,-127 "/>
+<text text-anchor="middle" x="168" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="140,-101 196,-101 "/>
+<text text-anchor="middle" x="168" y="-84.4" font-family="Times Roman,serif" font-size="14.00">AGA</text>
+</g>
+<!-- GAA&#45;&gt;AGA -->
+<g id="edge2" class="edge"><title>GAA&#45;&gt;AGA</title>
+<path fill="none" stroke="red" d="M56.3311,-140C77.3945,-140 106.372,-140 129.53,-140"/>
+<polygon fill="red" stroke="red" points="129.711,-143.5 139.711,-140 129.711,-136.5 129.711,-143.5"/>
+<text text-anchor="middle" x="98" y="-145.4" font-family="Times Roman,serif" font-size="14.00">RR: [1]</text>
+</g>
+<!-- AGA&#45;&gt;GAA -->
+<g id="edge4" class="edge"><title>AGA&#45;&gt;GAA</title>
+<path fill="none" stroke="black" d="M139.511,-123.987C133.868,-121.508 127.871,-119.332 122,-118 101.195,-113.281 94.8048,-113.281 74,-118 71.3399,-118.603 68.6538,-119.38 65.9864,-120.28"/>
+<polygon fill="black" stroke="black" points="64.5325,-117.09 56.4893,-123.987 67.0775,-123.611 64.5325,-117.09"/>
+<text text-anchor="middle" x="98" y="-123.4" font-family="Times Roman,serif" font-size="14.00">FF: [1]</text>
+</g>
+<!-- CTA -->
+<g id="node6" class="node"><title>CTA</title>
+<polygon fill="none" stroke="black" points="278,-75 278,-205 334,-205 334,-75 278,-75"/>
+<text text-anchor="middle" x="306" y="-188.4" font-family="Times Roman,serif" font-size="14.00">CTA</text>
+<polyline fill="none" stroke="black" points="278,-179 334,-179 "/>
+<text text-anchor="middle" x="306" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="278,-153 334,-153 "/>
+<text text-anchor="middle" x="306" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="278,-127 334,-127 "/>
+<text text-anchor="middle" x="306" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="278,-101 334,-101 "/>
+<text text-anchor="middle" x="306" y="-84.4" font-family="Times Roman,serif" font-size="14.00">CTA</text>
+</g>
+<!-- AGA&#45;&gt;CTA -->
+<g id="edge6" class="edge"><title>AGA&#45;&gt;CTA</title>
+<path fill="none" stroke="green" d="M196.259,-140C216.818,-140 244.894,-140 267.501,-140"/>
+<polygon fill="green" stroke="green" points="267.778,-143.5 277.778,-140 267.778,-136.5 267.778,-143.5"/>
+<text text-anchor="middle" x="237" y="-145.4" font-family="Times Roman,serif" font-size="14.00">RF: [1]</text>
+</g>
+<!-- CTA&#45;&gt;AGA -->
+<g id="edge18" class="edge"><title>CTA&#45;&gt;AGA</title>
+<path fill="none" stroke="green" d="M277.511,-123.987C271.868,-121.508 265.871,-119.332 260,-118 240.062,-113.478 233.938,-113.478 214,-118 211.34,-118.603 208.654,-119.38 205.986,-120.28"/>
+<polygon fill="green" stroke="green" points="204.532,-117.09 196.489,-123.987 207.078,-123.611 204.532,-117.09"/>
+<text text-anchor="middle" x="237" y="-123.4" font-family="Times Roman,serif" font-size="14.00">RF: [1]</text>
+</g>
+<!-- ATA -->
+<g id="node7" class="node"><title>ATA</title>
+<polygon fill="none" stroke="black" points="416,-148 416,-278 472,-278 472,-148 416,-148"/>
+<text text-anchor="middle" x="444" y="-261.4" font-family="Times Roman,serif" font-size="14.00">ATA</text>
+<polyline fill="none" stroke="black" points="416,-252 472,-252 "/>
+<text text-anchor="middle" x="444" y="-235.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="416,-226 472,-226 "/>
+<text text-anchor="middle" x="444" y="-209.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="416,-200 472,-200 "/>
+<text text-anchor="middle" x="444" y="-183.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="416,-174 472,-174 "/>
+<text text-anchor="middle" x="444" y="-157.4" font-family="Times Roman,serif" font-size="14.00">ATA</text>
+</g>
+<!-- CTA&#45;&gt;ATA -->
+<g id="edge16" class="edge"><title>CTA&#45;&gt;ATA</title>
+<path fill="none" stroke="blue" d="M334.238,-175.156C339.685,-180.371 345.68,-185.245 352,-189 368.218,-198.635 388.29,-204.451 405.543,-207.937"/>
+<polygon fill="blue" stroke="blue" points="405.396,-211.467 415.862,-209.819 406.653,-204.581 405.396,-211.467"/>
+<text text-anchor="middle" x="375" y="-212.4" font-family="Times Roman,serif" font-size="14.00">FR: [1]</text>
+</g>
+<!-- AGC -->
+<g id="node11" class="node"><title>AGC</title>
+<polygon fill="none" stroke="black" points="416,-0 416,-130 472,-130 472,-0 416,-0"/>
+<text text-anchor="middle" x="444" y="-113.4" font-family="Times Roman,serif" font-size="14.00">AGC</text>
+<polyline fill="none" stroke="black" points="416,-104 472,-104 "/>
+<text text-anchor="middle" x="444" y="-87.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="416,-78 472,-78 "/>
+<text text-anchor="middle" x="444" y="-61.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="416,-52 472,-52 "/>
+<text text-anchor="middle" x="444" y="-35.4" font-family="Times Roman,serif" font-size="14.00">0.0</text>
+<polyline fill="none" stroke="black" points="416,-26 472,-26 "/>
+<text text-anchor="middle" x="444" y="-9.4" font-family="Times Roman,serif" font-size="14.00"> </text>
+</g>
+<!-- CTA&#45;&gt;AGC -->
+<g id="edge20" class="edge"><title>CTA&#45;&gt;AGC</title>
+<path fill="none" stroke="green" d="M334.075,-128.859C352.667,-121.079 377.341,-109.974 398,-98 401.162,-96.1672 404.376,-94.1705 407.561,-92.0962"/>
+<polygon fill="green" stroke="green" points="409.539,-94.9835 415.864,-86.4835 405.619,-89.1841 409.539,-94.9835"/>
+<text text-anchor="middle" x="375" y="-126.4" font-family="Times Roman,serif" font-size="14.00">RF: [0]</text>
+</g>
+<!-- ATA&#45;&gt;CTA -->
+<g id="edge8" class="edge"><title>ATA&#45;&gt;CTA</title>
+<path fill="none" stroke="blue" d="M415.758,-183.923C410.185,-179.17 404.149,-174.624 398,-171 381.37,-161.201 361.207,-153.965 344.001,-148.96"/>
+<polygon fill="blue" stroke="blue" points="344.832,-145.559 334.261,-146.269 342.967,-152.306 344.832,-145.559"/>
+<text text-anchor="middle" x="375" y="-176.4" font-family="Times Roman,serif" font-size="14.00">FR: [1]</text>
+</g>
+<!-- AAT -->
+<g id="node10" class="node"><title>AAT</title>
+<polygon fill="grey" stroke="black" points="556,-147 556,-277 612,-277 612,-147 556,-147"/>
+<text text-anchor="middle" x="584" y="-260.4" font-family="Times Roman,serif" font-size="14.00">AAT</text>
+<polyline fill="none" stroke="black" points="556,-251 612,-251 "/>
+<text text-anchor="middle" x="584" y="-234.4" font-family="Times Roman,serif" font-size="14.00">5&#39;:[1]</text>
+<polyline fill="none" stroke="black" points="556,-225 612,-225 "/>
+<text text-anchor="middle" x="584" y="-208.4" font-family="Times Roman,serif" font-size="14.00">~5&#39;:[]</text>
+<polyline fill="none" stroke="black" points="556,-199 612,-199 "/>
+<text text-anchor="middle" x="584" y="-182.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="556,-173 612,-173 "/>
+<text text-anchor="middle" x="584" y="-156.4" font-family="Times Roman,serif" font-size="14.00">AAT</text>
+</g>
+<!-- ATA&#45;&gt;AAT -->
+<g id="edge10" class="edge"><title>ATA&#45;&gt;AAT</title>
+<path fill="none" stroke="red" d="M472.331,-212.798C493.395,-212.647 522.372,-212.44 545.53,-212.275"/>
+<polygon fill="red" stroke="red" points="545.736,-215.773 555.711,-212.202 545.686,-208.774 545.736,-215.773"/>
+<text text-anchor="middle" x="514" y="-218.4" font-family="Times Roman,serif" font-size="14.00">RR: [1]</text>
+</g>
+<!-- AAT&#45;&gt;ATA -->
+<g id="edge14" class="edge"><title>AAT&#45;&gt;ATA</title>
+<path fill="none" stroke="black" d="M555.947,-196.92C550.165,-194.468 544.005,-192.306 538,-191 517.154,-186.467 510.805,-186.281 490,-191 487.34,-191.603 484.654,-192.38 481.986,-193.28"/>
+<polygon fill="black" stroke="black" points="480.532,-190.09 472.489,-196.987 483.078,-196.611 480.532,-190.09"/>
+<text text-anchor="middle" x="514" y="-196.4" font-family="Times Roman,serif" font-size="14.00">FF: [1]</text>
+</g>
+<!-- AGC&#45;&gt;CTA -->
+<g id="edge12" class="edge"><title>AGC&#45;&gt;CTA</title>
+<path fill="none" stroke="green" d="M415.595,-64.3145C396.401,-65.0709 371.165,-68.5339 352,-80 348.325,-82.1986 344.84,-84.8113 341.556,-87.6969"/>
+<polygon fill="green" stroke="green" points="338.945,-85.3548 334.262,-94.8585 343.85,-90.3495 338.945,-85.3548"/>
+<text text-anchor="middle" x="375" y="-85.4" font-family="Times Roman,serif" font-size="14.00">RF: [0]</text>
+</g>
+</g>
+</svg>
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz/result.ps b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz/result.ps
deleted file mode 100644
index 6dd0251..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz/result.ps
+++ /dev/null
@@ -1,718 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: graphviz version 2.26.3 (20100126.1600)
-%%Title: G
-%%Pages: (atend)
-%%BoundingBox: (atend)
-%%EndComments
-save
-%%BeginProlog
-/DotDict 200 dict def
-DotDict begin
-
-/setupLatin1 {
-mark
-/EncodingVector 256 array def
- EncodingVector 0
-
-ISOLatin1Encoding 0 255 getinterval putinterval
-EncodingVector 45 /hyphen put
-
-% Set up ISO Latin 1 character encoding
-/starnetISO {
-        dup dup findfont dup length dict begin
-        { 1 index /FID ne { def }{ pop pop } ifelse
-        } forall
-        /Encoding EncodingVector def
-        currentdict end definefont
-} def
-/Times-Roman starnetISO def
-/Times-Italic starnetISO def
-/Times-Bold starnetISO def
-/Times-BoldItalic starnetISO def
-/Helvetica starnetISO def
-/Helvetica-Oblique starnetISO def
-/Helvetica-Bold starnetISO def
-/Helvetica-BoldOblique starnetISO def
-/Courier starnetISO def
-/Courier-Oblique starnetISO def
-/Courier-Bold starnetISO def
-/Courier-BoldOblique starnetISO def
-cleartomark
-} bind def
-
-%%BeginResource: procset graphviz 0 0
-/coord-font-family /Times-Roman def
-/default-font-family /Times-Roman def
-/coordfont coord-font-family findfont 8 scalefont def
-
-/InvScaleFactor 1.0 def
-/set_scale {
-       dup 1 exch div /InvScaleFactor exch def
-       scale
-} bind def
-
-% styles
-/solid { [] 0 setdash } bind def
-/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
-/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
-/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
-/bold { 2 setlinewidth } bind def
-/filled { } bind def
-/unfilled { } bind def
-/rounded { } bind def
-/diagonals { } bind def
-
-% hooks for setting color 
-/nodecolor { sethsbcolor } bind def
-/edgecolor { sethsbcolor } bind def
-/graphcolor { sethsbcolor } bind def
-/nopcolor {pop pop pop} bind def
-
-/beginpage {	% i j npages
-	/npages exch def
-	/j exch def
-	/i exch def
-	/str 10 string def
-	npages 1 gt {
-		gsave
-			coordfont setfont
-			0 0 moveto
-			(\() show i str cvs show (,) show j str cvs show (\)) show
-		grestore
-	} if
-} bind def
-
-/set_font {
-	findfont exch
-	scalefont setfont
-} def
-
-% draw text fitted to its expected width
-/alignedtext {			% width text
-	/text exch def
-	/width exch def
-	gsave
-		width 0 gt {
-			[] 0 setdash
-			text stringwidth pop width exch sub text length div 0 text ashow
-		} if
-	grestore
-} def
-
-/boxprim {				% xcorner ycorner xsize ysize
-		4 2 roll
-		moveto
-		2 copy
-		exch 0 rlineto
-		0 exch rlineto
-		pop neg 0 rlineto
-		closepath
-} bind def
-
-/ellipse_path {
-	/ry exch def
-	/rx exch def
-	/y exch def
-	/x exch def
-	matrix currentmatrix
-	newpath
-	x y translate
-	rx ry scale
-	0 0 1 0 360 arc
-	setmatrix
-} bind def
-
-/endpage { showpage } bind def
-/showpage { } def
-
-/layercolorseq
-	[	% layer color sequence - darkest to lightest
-		[0 0 0]
-		[.2 .8 .8]
-		[.4 .8 .8]
-		[.6 .8 .8]
-		[.8 .8 .8]
-	]
-def
-
-/layerlen layercolorseq length def
-
-/setlayer {/maxlayer exch def /curlayer exch def
-	layercolorseq curlayer 1 sub layerlen mod get
-	aload pop sethsbcolor
-	/nodecolor {nopcolor} def
-	/edgecolor {nopcolor} def
-	/graphcolor {nopcolor} def
-} bind def
-
-/onlayer { curlayer ne {invis} if } def
-
-/onlayers {
-	/myupper exch def
-	/mylower exch def
-	curlayer mylower lt
-	curlayer myupper gt
-	or
-	{invis} if
-} def
-
-/curlayer 0 def
-
-%%EndResource
-%%EndProlog
-%%BeginSetup
-14 default-font-family set_font
-1 setmiterlimit
-% /arrowlength 10 def
-% /arrowwidth 5 def
-
-% make sure pdfmark is harmless for PS-interpreters other than Distiller
-/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
-% make '<<' and '>>' safe on PS Level 1 devices
-/languagelevel where {pop languagelevel}{1} ifelse
-2 lt {
-    userdict (<<) cvn ([) cvn load put
-    userdict (>>) cvn ([) cvn load put
-} if
-
-%%EndSetup
-setupLatin1
-%%Page: 1 1
-%%PageBoundingBox: 36 36 656 322
-%%PageOrientation: Portrait
-0 0 1 beginpage
-gsave
-36 36 620 286 boxprim clip newpath
-1 1 set_scale 0 rotate 40 41 translate
-% GAA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 75 moveto
-0 205 lineto
-56 205 lineto
-56 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12 188.4 moveto 32 (GAA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 179 moveto
-56 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-14 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 153 moveto
-56 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 127 moveto
-56 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-16.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 101 moveto
-56 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12 84.4 moveto 32 (GAA) alignedtext
-grestore
-% AGA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 75 moveto
-140 205 lineto
-196 205 lineto
-196 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-152.5 188.4 moveto 31 (AGA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 179 moveto
-196 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-154 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 153 moveto
-196 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-148 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 127 moveto
-196 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-156.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 101 moveto
-196 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-152.5 84.4 moveto 31 (AGA) alignedtext
-grestore
-% GAA->AGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 56.33 140 moveto
-77.39 140 106.37 140 129.53 140 curveto
-stroke
-0 1 1 edgecolor
-newpath 129.71 143.5 moveto
-139.71 140 lineto
-129.71 136.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 129.71 143.5 moveto
-139.71 140 lineto
-129.71 136.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-74 145.4 moveto 48 (RR: [1]) alignedtext
-grestore
-% AGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 139.51 123.99 moveto
-133.87 121.51 127.87 119.33 122 118 curveto
-101.2 113.28 94.8 113.28 74 118 curveto
-71.34 118.6 68.65 119.38 65.99 120.28 curveto
-stroke
-0 0 0 edgecolor
-newpath 64.53 117.09 moveto
-56.49 123.99 lineto
-67.08 123.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 64.53 117.09 moveto
-56.49 123.99 lineto
-67.08 123.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-75.5 123.4 moveto 45 (FF: [1]) alignedtext
-grestore
-% CTA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 75 moveto
-278 205 lineto
-334 205 lineto
-334 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 188.4 moveto 28 (CTA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 179 moveto
-334 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 153 moveto
-334 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-286 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 127 moveto
-334 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-294.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 101 moveto
-334 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 84.4 moveto 28 (CTA) alignedtext
-grestore
-% AGA->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 196.26 140 moveto
-216.82 140 244.89 140 267.5 140 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 267.78 143.5 moveto
-277.78 140 lineto
-267.78 136.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 267.78 143.5 moveto
-277.78 140 lineto
-267.78 136.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-214 145.4 moveto 46 (RF: [1]) alignedtext
-grestore
-% CTA->AGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 277.51 123.99 moveto
-271.87 121.51 265.87 119.33 260 118 curveto
-240.06 113.48 233.94 113.48 214 118 curveto
-211.34 118.6 208.65 119.38 205.99 120.28 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 204.53 117.09 moveto
-196.49 123.99 lineto
-207.08 123.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 204.53 117.09 moveto
-196.49 123.99 lineto
-207.08 123.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-214 123.4 moveto 46 (RF: [1]) alignedtext
-grestore
-% ATA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 148 moveto
-416 278 lineto
-472 278 lineto
-472 148 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 261.4 moveto 28 (ATA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 252 moveto
-472 252 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 235.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 226 moveto
-472 226 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-424 209.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 200 moveto
-472 200 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-432.5 183.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 174 moveto
-472 174 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 157.4 moveto 28 (ATA) alignedtext
-grestore
-% CTA->ATA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 334.24 175.16 moveto
-339.69 180.37 345.68 185.25 352 189 curveto
-368.22 198.64 388.29 204.45 405.54 207.94 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 405.4 211.47 moveto
-415.86 209.82 lineto
-406.65 204.58 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 405.4 211.47 moveto
-415.86 209.82 lineto
-406.65 204.58 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 212.4 moveto 46 (FR: [1]) alignedtext
-grestore
-% AGC
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 0 moveto
-416 130 lineto
-472 130 lineto
-472 0 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-428.5 113.4 moveto 31 (AGC) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 104 moveto
-472 104 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 87.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 78 moveto
-472 78 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-424 61.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 52 moveto
-472 52 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-432.5 35.4 moveto 23 (0.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 26 moveto
-472 26 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-441.5 9.4 moveto 5 ( ) alignedtext
-grestore
-% CTA->AGC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 334.07 128.86 moveto
-352.67 121.08 377.34 109.97 398 98 curveto
-401.16 96.17 404.38 94.17 407.56 92.1 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 409.54 94.98 moveto
-415.86 86.48 lineto
-405.62 89.18 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 409.54 94.98 moveto
-415.86 86.48 lineto
-405.62 89.18 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 126.4 moveto 46 (RF: [0]) alignedtext
-grestore
-% ATA->CTA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 415.76 183.92 moveto
-410.19 179.17 404.15 174.62 398 171 curveto
-381.37 161.2 361.21 153.96 344 148.96 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 344.83 145.56 moveto
-334.26 146.27 lineto
-342.97 152.31 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 344.83 145.56 moveto
-334.26 146.27 lineto
-342.97 152.31 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 176.4 moveto 46 (FR: [1]) alignedtext
-grestore
-% AAT
-gsave
-0 0 0.75294 nodecolor
-newpath 556 147 moveto
-556 277 lineto
-612 277 lineto
-612 147 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 147 moveto
-556 277 lineto
-612 277 lineto
-612 147 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-569.5 260.4 moveto 29 (AAT) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 251 moveto
-612 251 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-565.5 234.4 moveto 37 (5':[1]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 225 moveto
-612 225 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-564 208.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 199 moveto
-612 199 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-572.5 182.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 173 moveto
-612 173 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-569.5 156.4 moveto 29 (AAT) alignedtext
-grestore
-% ATA->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 472.33 212.8 moveto
-493.39 212.65 522.37 212.44 545.53 212.27 curveto
-stroke
-0 1 1 edgecolor
-newpath 545.74 215.77 moveto
-555.71 212.2 lineto
-545.69 208.77 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 545.74 215.77 moveto
-555.71 212.2 lineto
-545.69 208.77 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-490 218.4 moveto 48 (RR: [1]) alignedtext
-grestore
-% AAT->ATA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 555.95 196.92 moveto
-550.17 194.47 544 192.31 538 191 curveto
-517.15 186.47 510.8 186.28 490 191 curveto
-487.34 191.6 484.65 192.38 481.99 193.28 curveto
-stroke
-0 0 0 edgecolor
-newpath 480.53 190.09 moveto
-472.49 196.99 lineto
-483.08 196.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 480.53 190.09 moveto
-472.49 196.99 lineto
-483.08 196.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-491.5 196.4 moveto 45 (FF: [1]) alignedtext
-grestore
-% AGC->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 415.59 64.31 moveto
-396.4 65.07 371.16 68.53 352 80 curveto
-348.33 82.2 344.84 84.81 341.56 87.7 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 338.95 85.35 moveto
-334.26 94.86 lineto
-343.85 90.35 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 338.95 85.35 moveto
-334.26 94.86 lineto
-343.85 90.35 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 85.4 moveto 46 (RF: [0]) alignedtext
-grestore
-endpage
-showpage
-grestore
-%%PageTrailer
-%%EndPage: 1
-%%Trailer
-%%Pages: 1
-%%BoundingBox: 36 36 656 322
-end
-restore
-%%EOF
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/statistics
old mode 100644
new mode 100755
similarity index 100%
copy from genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc
copy to genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/statistics
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/txt b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/txt
index bd88d08..c61fe5f 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/txt
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/txt
@@ -1,6 +1,6 @@
-GAA	{[]	[]	[]	[{AGA:[1]}]	{5':[], ~5':[]}	GAA	1.0x}
-AGA	{[{GAA:[1]}]	[]	[{CTA:[1]}]	[]	{5':[], ~5':[]}	AGA	1.0x}
-ATA	{[]	[{CTA:[1]}]	[]	[{AAT:[1]}]	{5':[], ~5':[]}	ATA	1.0x}
-AGC	{[]	[]	[{CTA:[0]}]	[]	{5':[], ~5':[]}		0.0x}
-AAT	{[{ATA:[1]}]	[]	[]	[]	{5':[(1-0_0)], ~5':[]}	AAT	1.0x}
-CTA	{[]	[{ATA:[1]}]	[{AGA:[1]},{AGC:[0]}]	[]	{5':[], ~5':[]}	CTA	1.0x}
+GAA	{[]	[]	[]	[{AGA:[1]}]	{5':[], ~5':[]}	GAA	1.0x}	IS_NON
+AGA	{[{GAA:[1]}]	[]	[{CTA:[1]}]	[]	{5':[], ~5':[]}	AGA	1.0x}	IS_NON
+ATA	{[]	[{CTA:[1]}]	[]	[{AAT:[1]}]	{5':[], ~5':[]}	ATA	1.0x}	IS_NON
+AGC	{[]	[]	[{CTA:[0]}]	[]	{5':[], ~5':[]}		0.0x}	IS_NON
+AAT	{[{ATA:[1]}]	[]	[]	[]	{5':[(1-0_0)], ~5':[]}	AAT	1.0x}	IS_NON
+CTA	{[]	[{ATA:[1]}]	[{AGA:[1]},{AGC:[0]}]	[]	{5':[], ~5':[]}	CTA	1.0x}	IS_NON
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-0.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-0.crc
deleted file mode 100644
index f00c109..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-0.crc
+++ /dev/null
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-1.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-1.crc
deleted file mode 100644
index 6697cda..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-1.crc
+++ /dev/null
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-0 b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-0
deleted file mode 100755
index 49d9115..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-0
+++ /dev/null
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-1 b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-1
deleted file mode 100755
index 0426e00..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-1
+++ /dev/null
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/graphviz/result.ps b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/graphviz/result.ps
deleted file mode 100644
index 197adb8..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/graphviz/result.ps
+++ /dev/null
@@ -1,5081 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: graphviz version 2.26.3 (20100126.1600)
-%%Title: G
-%%Pages: (atend)
-%%BoundingBox: (atend)
-%%EndComments
-save
-%%BeginProlog
-/DotDict 200 dict def
-DotDict begin
-
-/setupLatin1 {
-mark
-/EncodingVector 256 array def
- EncodingVector 0
-
-ISOLatin1Encoding 0 255 getinterval putinterval
-EncodingVector 45 /hyphen put
-
-% Set up ISO Latin 1 character encoding
-/starnetISO {
-        dup dup findfont dup length dict begin
-        { 1 index /FID ne { def }{ pop pop } ifelse
-        } forall
-        /Encoding EncodingVector def
-        currentdict end definefont
-} def
-/Times-Roman starnetISO def
-/Times-Italic starnetISO def
-/Times-Bold starnetISO def
-/Times-BoldItalic starnetISO def
-/Helvetica starnetISO def
-/Helvetica-Oblique starnetISO def
-/Helvetica-Bold starnetISO def
-/Helvetica-BoldOblique starnetISO def
-/Courier starnetISO def
-/Courier-Oblique starnetISO def
-/Courier-Bold starnetISO def
-/Courier-BoldOblique starnetISO def
-cleartomark
-} bind def
-
-%%BeginResource: procset graphviz 0 0
-/coord-font-family /Times-Roman def
-/default-font-family /Times-Roman def
-/coordfont coord-font-family findfont 8 scalefont def
-
-/InvScaleFactor 1.0 def
-/set_scale {
-       dup 1 exch div /InvScaleFactor exch def
-       scale
-} bind def
-
-% styles
-/solid { [] 0 setdash } bind def
-/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
-/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
-/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
-/bold { 2 setlinewidth } bind def
-/filled { } bind def
-/unfilled { } bind def
-/rounded { } bind def
-/diagonals { } bind def
-
-% hooks for setting color 
-/nodecolor { sethsbcolor } bind def
-/edgecolor { sethsbcolor } bind def
-/graphcolor { sethsbcolor } bind def
-/nopcolor {pop pop pop} bind def
-
-/beginpage {	% i j npages
-	/npages exch def
-	/j exch def
-	/i exch def
-	/str 10 string def
-	npages 1 gt {
-		gsave
-			coordfont setfont
-			0 0 moveto
-			(\() show i str cvs show (,) show j str cvs show (\)) show
-		grestore
-	} if
-} bind def
-
-/set_font {
-	findfont exch
-	scalefont setfont
-} def
-
-% draw text fitted to its expected width
-/alignedtext {			% width text
-	/text exch def
-	/width exch def
-	gsave
-		width 0 gt {
-			[] 0 setdash
-			text stringwidth pop width exch sub text length div 0 text ashow
-		} if
-	grestore
-} def
-
-/boxprim {				% xcorner ycorner xsize ysize
-		4 2 roll
-		moveto
-		2 copy
-		exch 0 rlineto
-		0 exch rlineto
-		pop neg 0 rlineto
-		closepath
-} bind def
-
-/ellipse_path {
-	/ry exch def
-	/rx exch def
-	/y exch def
-	/x exch def
-	matrix currentmatrix
-	newpath
-	x y translate
-	rx ry scale
-	0 0 1 0 360 arc
-	setmatrix
-} bind def
-
-/endpage { showpage } bind def
-/showpage { } def
-
-/layercolorseq
-	[	% layer color sequence - darkest to lightest
-		[0 0 0]
-		[.2 .8 .8]
-		[.4 .8 .8]
-		[.6 .8 .8]
-		[.8 .8 .8]
-	]
-def
-
-/layerlen layercolorseq length def
-
-/setlayer {/maxlayer exch def /curlayer exch def
-	layercolorseq curlayer 1 sub layerlen mod get
-	aload pop sethsbcolor
-	/nodecolor {nopcolor} def
-	/edgecolor {nopcolor} def
-	/graphcolor {nopcolor} def
-} bind def
-
-/onlayer { curlayer ne {invis} if } def
-
-/onlayers {
-	/myupper exch def
-	/mylower exch def
-	curlayer mylower lt
-	curlayer myupper gt
-	or
-	{invis} if
-} def
-
-/curlayer 0 def
-
-%%EndResource
-%%EndProlog
-%%BeginSetup
-14 default-font-family set_font
-1 setmiterlimit
-% /arrowlength 10 def
-% /arrowwidth 5 def
-
-% make sure pdfmark is harmless for PS-interpreters other than Distiller
-/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
-% make '<<' and '>>' safe on PS Level 1 devices
-/languagelevel where {pop languagelevel}{1} ifelse
-2 lt {
-    userdict (<<) cvn ([) cvn load put
-    userdict (>>) cvn ([) cvn load put
-} if
-
-%%EndSetup
-setupLatin1
-%%Page: 1 1
-%%PageBoundingBox: 36 36 12234 2334
-%%PageOrientation: Portrait
-0 0 1 beginpage
-gsave
-36 36 12198 2298 boxprim clip newpath
-1 1 set_scale 0 rotate 40 41 translate
-% AAA
-gsave
-0 0 0.75294 nodecolor
-newpath 0 608.57 moveto
-0 738.57 lineto
-132 738.57 lineto
-132 608.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 608.57 moveto
-0 738.57 lineto
-132 738.57 lineto
-132 608.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-50.5 721.97 moveto 31 (AAA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 712.57 moveto
-132 712.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-52 695.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 686.57 moveto
-132 686.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8 669.97 moveto 116 (~5':[49,54,1,67]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 660.57 moveto
-132 660.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-50 643.97 moveto 32 (25.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 634.57 moveto
-132 634.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-50.5 617.97 moveto 31 (AAA) alignedtext
-grestore
-% AAA->AAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 44.84 738.64 moveto
-47.87 749.27 54.92 756.57 66 756.57 curveto
-73.44 756.57 79.07 753.28 82.88 747.89 curveto
-stroke
-0 0 0 edgecolor
-newpath 86.14 749.19 moveto
-87.16 738.64 lineto
-79.79 746.25 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 86.14 749.19 moveto
-87.16 738.64 lineto
-79.79 746.25 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-39 761.97 moveto 54 (FF: [93]) alignedtext
-grestore
-% AAA->AAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 20.29 738.66 moveto
-21.22 758.77 36.45 774.57 66 774.57 curveto
-90.47 774.57 105.12 763.74 109.96 748.59 curveto
-stroke
-0 1 1 edgecolor
-newpath 113.42 749.11 moveto
-111.71 738.66 lineto
-106.53 747.9 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 113.42 749.11 moveto
-111.71 738.66 lineto
-106.53 747.9 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-37.5 779.97 moveto 57 (RR: [93]) alignedtext
-grestore
-% AAT
-gsave
-0 0 0.75294 nodecolor
-newpath 490.5 918.57 moveto
-490.5 1048.57 lineto
-687.5 1048.57 lineto
-687.5 918.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 918.57 moveto
-490.5 1048.57 lineto
-687.5 1048.57 lineto
-687.5 918.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-574.5 1031.97 moveto 29 (AAT) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 1022.57 moveto
-687.5 1022.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-498.5 1005.97 moveto 181 (5':[21,89,18,74,82,95,16]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 996.57 moveto
-687.5 996.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-560 979.97 moveto 58 (~5':[33]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 970.57 moveto
-687.5 970.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-573 953.97 moveto 32 (48.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 944.57 moveto
-687.5 944.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-574.5 927.97 moveto 29 (AAT) alignedtext
-grestore
-% AAA->AAT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 132.34 698.48 moveto
-215.68 731.4 361.18 794.34 472 871.57 curveto
-488.75 883.25 505.41 897.31 520.69 911.47 curveto
-stroke
-0 0 0 edgecolor
-newpath 518.39 914.11 moveto
-528.07 918.42 lineto
-523.19 909.01 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 518.39 914.11 moveto
-528.07 918.42 lineto
-523.19 909.01 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-151.5 876.97 moveto 319 (FF: [2,4,9,14,27,30,41,49,64,75,81,83,94,97]) alignedtext
-grestore
-% AAG
-gsave
-0 0 0.75294 nodecolor
-newpath 4402 590.57 moveto
-4402 720.57 lineto
-4588 720.57 lineto
-4588 590.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 590.57 moveto
-4402 720.57 lineto
-4588 720.57 lineto
-4588 590.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4479 703.97 moveto 32 (AAG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 694.57 moveto
-4588 694.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4454 677.97 moveto 82 (5':[50,62,6]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 668.57 moveto
-4588 668.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4410 651.97 moveto 170 (~5':[25,97,46,71,94,80]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 642.57 moveto
-4588 642.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4479 625.97 moveto 32 (39.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 616.57 moveto
-4588 616.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4479 599.97 moveto 32 (AAG) alignedtext
-grestore
-% AAA->AAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 132.14 616.05 moveto
-137.94 612.76 143.93 609.86 150 607.57 curveto
-332.86 538.68 393.6 583.57 589 583.57 curveto
-589 583.57 589 583.57 1305 583.57 curveto
-1639.25 583.57 2473.84 633.74 2808 641.57 curveto
-3407.57 655.63 4127.3 656.15 4391.38 655.8 curveto
-stroke
-0 0 0 edgecolor
-newpath 4391.72 659.3 moveto
-4401.71 655.79 lineto
-4391.71 652.3 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 4391.72 659.3 moveto
-4401.71 655.79 lineto
-4391.71 652.3 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2150 627.97 moveto 166 (FF: [81,83,89,93,94,97]) alignedtext
-grestore
-% TAA
-gsave
-0 0 0.75294 nodecolor
-newpath 8922 1248.57 moveto
-8922 1378.57 lineto
-9018 1378.57 lineto
-9018 1248.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1248.57 moveto
-8922 1378.57 lineto
-9018 1378.57 lineto
-9018 1248.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8955.5 1361.97 moveto 29 (TAA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1352.57 moveto
-9018 1352.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8947 1335.97 moveto 46 (5':[47]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1326.57 moveto
-9018 1326.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8930 1309.97 moveto 80 (~5':[12,75]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1300.57 moveto
-9018 1300.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8954 1283.97 moveto 32 (25.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1274.57 moveto
-9018 1274.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8955.5 1257.97 moveto 29 (TAA) alignedtext
-grestore
-% AAA->TAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 67.29 738.64 moveto
-73.21 1023.49 99.74 2148.82 150 2203.57 curveto
-283.25 2348.73 391.95 2265.57 589 2265.57 curveto
-589 2265.57 589 2265.57 6390 2265.57 curveto
-7280.72 2265.57 7598.06 2409.49 8372 1968.57 curveto
-8619.76 1827.42 8658.07 1748.79 8838 1527.57 curveto
-8873.36 1484.1 8906.45 1430.42 8930.65 1387.69 curveto
-stroke
-0 1 1 edgecolor
-newpath 8933.83 1389.18 moveto
-8935.68 1378.75 lineto
-8927.73 1385.75 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 8933.83 1389.18 moveto
-8935.68 1378.75 lineto
-8927.73 1385.75 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4061 2270.97 moveto 192 (RR: [49,81,83,89,93,94,97]) alignedtext
-grestore
-% GAA
-gsave
-0 0 0.75294 nodecolor
-newpath 3076.5 427.57 moveto
-3076.5 557.57 lineto
-3217.5 557.57 lineto
-3217.5 427.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 427.57 moveto
-3076.5 557.57 lineto
-3217.5 557.57 lineto
-3217.5 427.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3131 540.97 moveto 32 (GAA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 531.57 moveto
-3217.5 531.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3113 514.97 moveto 68 (5':[53,36]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 505.57 moveto
-3217.5 505.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3084.5 488.97 moveto 125 (~5':[70,91,38,63]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 479.57 moveto
-3217.5 479.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3131 462.97 moveto 32 (52.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 453.57 moveto
-3217.5 453.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3131 436.97 moveto 32 (GAA) alignedtext
-grestore
-% AAA->GAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 75.47 608.57 moveto
-85.75 562.46 106.89 503.05 150 469.57 curveto
-305.64 348.72 391.95 407.57 589 407.57 curveto
-589 407.57 589 407.57 2730 407.57 curveto
-2849.04 407.57 2983.42 441.24 3066.68 466.2 curveto
-stroke
-0 1 1 edgecolor
-newpath 3065.73 469.57 moveto
-3076.32 469.12 lineto
-3067.76 462.87 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3065.73 469.57 moveto
-3076.32 469.12 lineto
-3067.76 462.87 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1448.5 412.97 moveto 381 (RR: [1,2,4,9,14,27,30,41,49,54,64,67,75,81,83,94,97]) alignedtext
-grestore
-% AAT->AAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 490.15 987.94 moveto
-392.69 986.93 244.95 970.43 150 889.57 curveto
-108.46 854.2 87.36 795.69 76.7 748.49 curveto
-stroke
-0 1 1 edgecolor
-newpath 80.1 747.64 moveto
-74.58 738.6 lineto
-73.25 749.11 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 80.1 747.64 moveto
-74.58 738.6 lineto
-73.25 749.11 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-150 991.97 moveto 322 (RR: [2,4,9,14,27,30,41,49,64,75,81,83,94,97]) alignedtext
-grestore
-% AAT->TAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 687.55 989.51 moveto
-788.74 995.08 950.8 1002.57 1091 1002.57 curveto
-1091 1002.57 1091 1002.57 1989 1002.57 curveto
-2136.53 1002.57 2546.57 933.38 2652 1036.57 curveto
-2691.33 1075.07 2629.76 1246.02 2670 1283.57 curveto
-2757.65 1365.37 4708.11 1291.35 4828 1291.57 curveto
-5009.33 1291.91 5054.67 1291.63 5236 1291.57 curveto
-5323.11 1291.54 8298.41 1336.18 8372 1289.57 curveto
-8387.79 1279.57 8374.21 1261.57 8390 1251.57 curveto
-8475.8 1197.28 8783.05 1266.08 8912.18 1298.45 curveto
-stroke
-0 1 1 edgecolor
-newpath 8911.35 1301.85 moveto
-8921.91 1300.9 lineto
-8913.07 1295.06 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 8911.35 1301.85 moveto
-8921.91 1300.9 lineto
-8913.07 1295.06 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4415 1307.97 moveto 160 (RR: [7,11,37,40,56,85]) alignedtext
-grestore
-% AAT->GAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 615.68 918.37 moveto
-635.02 879.33 665 832.09 706 804.57 curveto
-984.86 617.41 1116.91 717.87 1448 661.57 curveto
-1625.16 631.45 1669.5 623.27 1848 602.57 curveto
-2086.26 574.94 2820.45 517.66 3066.04 498.77 curveto
-stroke
-0 1 1 edgecolor
-newpath 3066.61 502.23 moveto
-3076.31 497.98 lineto
-3066.07 495.25 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3066.61 502.23 moveto
-3076.31 497.98 lineto
-3066.07 495.25 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1848 607.97 moveto 282 (RR: [13,15,17,23,33,45,48,59,77,96,98]) alignedtext
-grestore
-% ATC
-gsave
-0 0 0.75294 nodecolor
-newpath 7916.5 1050.57 moveto
-7916.5 1180.57 lineto
-8003.5 1180.57 lineto
-8003.5 1050.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1050.57 moveto
-7916.5 1180.57 lineto
-8003.5 1180.57 lineto
-8003.5 1050.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7946 1163.97 moveto 28 (ATC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1154.57 moveto
-8003.5 1154.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7946 1137.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1128.57 moveto
-8003.5 1128.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7924.5 1111.97 moveto 71 (~5':[7,19]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1102.57 moveto
-8003.5 1102.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7944 1085.97 moveto 32 (37.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1076.57 moveto
-8003.5 1076.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7946 1059.97 moveto 28 (ATC) alignedtext
-grestore
-% AAT->ATC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 687.95 961.2 moveto
-788.78 940.39 949.95 912.57 1091 912.57 curveto
-1091 912.57 1091 912.57 3350 912.57 curveto
-4188.25 912.57 4397.81 918.48 5236 928.57 curveto
-5748.91 934.75 5877.05 946.57 6390 946.57 curveto
-6390 946.57 6390 946.57 7332 946.57 curveto
-7551.75 946.57 7800.34 1044.25 7906.91 1091.09 curveto
-stroke
-0 0 0 edgecolor
-newpath 7905.61 1094.34 moveto
-7916.17 1095.19 lineto
-7908.44 1087.94 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 7905.61 1094.34 moveto
-7916.17 1095.19 lineto
-7908.44 1087.94 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3521.5 918.97 moveto 351 (FF: [7,9,11,16,18,27,30,37,40,41,56,64,74,82,85]) alignedtext
-grestore
-% ATA
-gsave
-0 0 0.75294 nodecolor
-newpath 8454 1260.57 moveto
-8454 1390.57 lineto
-8564 1390.57 lineto
-8564 1260.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1260.57 moveto
-8454 1390.57 lineto
-8564 1390.57 lineto
-8564 1260.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8495 1373.97 moveto 28 (ATA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1364.57 moveto
-8564 1364.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8486 1347.97 moveto 46 (5':[79]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1338.57 moveto
-8564 1338.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8462 1321.97 moveto 94 (~5':[35,2,44]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1312.57 moveto
-8564 1312.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8493 1295.97 moveto 32 (31.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1286.57 moveto
-8564 1286.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8495 1269.97 moveto 28 (ATA) alignedtext
-grestore
-% AAT->ATA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 687.64 1036.09 moveto
-693.77 1038.48 699.92 1040.67 706 1042.57 curveto
-1315.94 1233.22 1523.08 1041.51 2130 1241.57 curveto
-2228.97 1274.2 2235.17 1327.26 2336 1353.57 curveto
-2502.44 1397.01 5259.99 1392.57 5432 1392.57 curveto
-5432 1392.57 5432 1392.57 7032 1392.57 curveto
-7628 1392.57 7777.62 1384.59 8372 1340.57 curveto
-8395.38 1338.84 8420.94 1336.24 8443.58 1333.68 curveto
-stroke
-0 0 0 edgecolor
-newpath 8444.22 1337.13 moveto
-8453.75 1332.52 lineto
-8443.42 1330.18 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 8444.22 1337.13 moveto
-8453.75 1332.52 lineto
-8443.42 1330.18 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3932 1395.97 moveto 450 (FF: [2,14,22,28,29,34,49,55,57,68,73,75,79,81,83,89,94,95,97]) alignedtext
-grestore
-% CAA
-gsave
-0 0 0.75294 nodecolor
-newpath 12082.5 1016.57 moveto
-12082.5 1146.57 lineto
-12189.5 1146.57 lineto
-12189.5 1016.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1016.57 moveto
-12082.5 1146.57 lineto
-12189.5 1146.57 lineto
-12189.5 1016.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12120.5 1129.97 moveto 31 (CAA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1120.57 moveto
-12189.5 1120.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12090.5 1103.97 moveto 91 (5':[34,57,22]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1094.57 moveto
-12189.5 1094.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12116 1077.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1068.57 moveto
-12189.5 1068.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12124.5 1051.97 moveto 23 (8.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1042.57 moveto
-12189.5 1042.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12116 1025.97 moveto 40 (ACAA) alignedtext
-grestore
-% AAT->CAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 595.44 918.26 moveto
-605.99 848.76 633.69 741.18 706 684.57 curveto
-831.66 586.2 1975.68 538.19 2130 497.57 curveto
-2217.16 474.63 2239.41 465.69 2318 421.57 curveto
-2554.56 288.77 2554.54 154.29 2808 57.57 curveto
-3033.98 -28.66 3108.13 8.57 3350 8.57 curveto
-3350 8.57 3350 8.57 11823 8.57 curveto
-12031.16 8.57 12110.25 762.19 12130.41 1006.27 curveto
-stroke
-0 1 1 edgecolor
-newpath 12126.94 1006.79 moveto
-12131.24 1016.47 lineto
-12133.92 1006.22 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 12126.94 1006.79 moveto
-12131.24 1016.47 lineto
-12133.92 1006.22 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6925 13.97 moveto 214 (RR: [22,29,34,55,57,68,73,79]) alignedtext
-grestore
-% ATG
-gsave
-0 0 0.75294 nodecolor
-newpath 1020.5 1515.57 moveto
-1020.5 1645.57 lineto
-1161.5 1645.57 lineto
-1161.5 1515.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1515.57 moveto
-1020.5 1645.57 lineto
-1161.5 1645.57 lineto
-1161.5 1515.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1076 1628.97 moveto 30 (ATG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1619.57 moveto
-1161.5 1619.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1077 1602.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1593.57 moveto
-1161.5 1593.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1028.5 1576.97 moveto 125 (~5':[45,77,13,98]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1567.57 moveto
-1161.5 1567.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1075 1550.97 moveto 32 (11.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1541.57 moveto
-1161.5 1541.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1071 1524.97 moveto 40 (ATGC) alignedtext
-grestore
-% AAT->ATG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 598.49 1048.66 moveto
-611.44 1113.87 640.97 1212.53 706 1269.57 curveto
-808.27 1359.29 900.78 1256.67 1002 1347.57 curveto
-1047.08 1388.06 1069.47 1453.89 1080.5 1505.27 curveto
-stroke
-0 0 0 edgecolor
-newpath 1077.13 1506.25 moveto
-1082.56 1515.34 lineto
-1083.99 1504.85 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 1077.13 1506.25 moveto
-1082.56 1515.34 lineto
-1083.99 1504.85 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-708 1352.97 moveto 292 (FF: [5,13,15,17,21,23,45,48,59,77,96,98]) alignedtext
-grestore
-% AAG->AAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 4401.79 667.91 moveto
-4395.78 668.53 4389.81 669.09 4384 669.57 curveto
-4079.47 694.94 4002.59 697.57 3697 697.57 curveto
-1989 697.57 1989 697.57 1989 697.57 curveto
-1550.3 697.57 1440.67 690.04 1002 684.57 curveto
-682.59 680.59 301.87 676.24 142.29 674.43 curveto
-stroke
-0 1 1 edgecolor
-newpath 142.14 670.93 moveto
-132.1 674.32 lineto
-142.06 677.93 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 142.14 670.93 moveto
-132.1 674.32 lineto
-142.06 677.93 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2148.5 702.97 moveto 169 (RR: [81,83,89,93,94,97]) alignedtext
-grestore
-% AAG->TAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 4588.17 706.15 moveto
-4594.14 708.8 4600.12 711.3 4606 713.57 curveto
-4701.13 750.31 4728.07 751.21 4828 771.57 curveto
-5510.86 910.7 5693.11 908.57 6390 908.57 curveto
-6390 908.57 6390 908.57 8232 908.57 curveto
-8527.22 908.57 8595.27 1012.53 8838 1180.57 curveto
-8865.76 1199.79 8892.7 1225.28 8914.93 1248.8 curveto
-stroke
-0 1 1 edgecolor
-newpath 8912.59 1251.43 moveto
-8921.97 1256.36 lineto
-8917.71 1246.66 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 8912.59 1251.43 moveto
-8921.97 1256.36 lineto
-8917.71 1246.66 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6936 913.97 moveto 192 (RR: [38,39,47,52,71,88,91]) alignedtext
-grestore
-% AAG->GAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 4401.76 643.59 moveto
-4395.75 642.89 4389.79 642.21 4384 641.57 curveto
-3874.6 585.5 3730.89 666.68 3236 533.57 curveto
-3233.06 532.78 3230.09 531.9 3227.11 530.94 curveto
-stroke
-0 1 1 edgecolor
-newpath 3228.21 527.62 moveto
-3217.61 527.66 lineto
-3225.92 534.23 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3228.21 527.62 moveto
-3217.61 527.66 lineto
-3225.92 534.23 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3482 623.97 moveto 430 (RR: [8,25,32,36,42,46,47,52,53,62,66,71,76,78,80,84,86,87]) alignedtext
-grestore
-% AGA
-gsave
-0 0 0.75294 nodecolor
-newpath 3649 285.57 moveto
-3649 415.57 lineto
-3745 415.57 lineto
-3745 285.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 285.57 moveto
-3649 415.57 lineto
-3745 415.57 lineto
-3745 285.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3681.5 398.97 moveto 31 (AGA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 389.57 moveto
-3745 389.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3663 372.97 moveto 68 (5':[99,29]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 363.57 moveto
-3745 363.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3657 346.97 moveto 80 (~5':[14,83]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 337.57 moveto
-3745 337.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3681 320.97 moveto 32 (22.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 311.57 moveto
-3745 311.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3681.5 294.97 moveto 31 (AGA) alignedtext
-grestore
-% AAG->AGA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 4458.31 590.49 moveto
-4439.52 562.79 4414.2 532.55 4384 513.57 curveto
-4209.14 403.7 4130.53 463.94 3930 414.57 curveto
-3870.11 399.83 3802.15 380.91 3755.15 367.47 curveto
-stroke
-0 0 0 edgecolor
-newpath 3756.02 364.08 moveto
-3745.45 364.69 lineto
-3754.09 370.81 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3756.02 364.08 moveto
-3745.45 364.69 lineto
-3754.09 370.81 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4107.5 518.97 moveto 99 (FF: [79,83,89]) alignedtext
-grestore
-% AGG
-gsave
-0 0 0.75294 nodecolor
-newpath 10135 1642.57 moveto
-10135 1772.57 lineto
-10209 1772.57 lineto
-10209 1642.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1642.57 moveto
-10135 1772.57 lineto
-10209 1772.57 lineto
-10209 1642.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10155.5 1755.97 moveto 33 (AGG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1746.57 moveto
-10209 1746.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10158 1729.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1720.57 moveto
-10209 1720.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10143 1703.97 moveto 58 (~5':[52]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1694.57 moveto
-10209 1694.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10156 1677.97 moveto 32 (18.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1668.57 moveto
-10209 1668.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10155.5 1651.97 moveto 33 (AGG) alignedtext
-grestore
-% AAG->AGG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 4502.35 720.8 moveto
-4529.57 927.22 4644.04 1552.57 5032 1552.57 curveto
-5032 1552.57 5032 1552.57 6390 1552.57 curveto
-7029.14 1552.57 7189.01 1551.9 7828 1565.57 curveto
-8183.68 1573.18 8272.48 1579.54 8628 1592.57 curveto
-8790.91 1598.54 9940.06 1596.93 10094 1650.57 curveto
-10105.38 1654.54 10116.52 1660.77 10126.66 1667.68 curveto
-stroke
-0 0 0 edgecolor
-newpath 10124.76 1670.63 moveto
-10134.92 1673.62 lineto
-10128.84 1664.94 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10124.76 1670.63 moveto
-10134.92 1673.62 lineto
-10128.84 1664.94 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7495.5 1570.97 moveto 247 (FF: [6,32,36,47,52,53,62,76,84,87]) alignedtext
-grestore
-% AGC
-gsave
-0 0 0.75294 nodecolor
-newpath 10112.5 816.57 moveto
-10112.5 946.57 lineto
-10231.5 946.57 lineto
-10231.5 816.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 816.57 moveto
-10112.5 946.57 lineto
-10231.5 946.57 lineto
-10231.5 816.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10156.5 929.97 moveto 31 (AGC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 920.57 moveto
-10231.5 920.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10138 903.97 moveto 68 (5':[10,24]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 894.57 moveto
-10231.5 894.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10120.5 877.97 moveto 103 (~5':[88,61,66]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 868.57 moveto
-10231.5 868.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10156 851.97 moveto 32 (59.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 842.57 moveto
-10231.5 842.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10156.5 825.97 moveto 31 (AGC) alignedtext
-grestore
-% AAG->AGC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 4588.1 623.7 moveto
-4654.18 602.67 4745.45 576.83 4828 564.57 curveto
-4965.66 544.14 7192.83 494.57 7332 494.57 curveto
-7332 494.57 7332 494.57 8232 494.57 curveto
-8517.34 494.57 8576.23 589.48 8856 645.57 curveto
-9399.64 754.58 9598.93 549.91 10094 799.57 curveto
-10099.76 802.48 10105.32 805.98 10110.64 809.89 curveto
-stroke
-0 0 0 edgecolor
-newpath 10108.79 812.88 moveto
-10118.8 816.33 lineto
-10113.12 807.39 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10108.79 812.88 moveto
-10118.8 816.33 lineto
-10113.12 807.39 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7491 499.97 moveto 256 (FF: [32,38,39,47,52,62,71,84,88,91]) alignedtext
-grestore
-% ACT
-gsave
-0 0 0.75294 nodecolor
-newpath 4984 632.57 moveto
-4984 762.57 lineto
-5080 762.57 lineto
-5080 632.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 632.57 moveto
-4984 762.57 lineto
-5080 762.57 lineto
-5080 632.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5017.5 745.97 moveto 29 (ACT) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 736.57 moveto
-5080 736.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5018 719.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 710.57 moveto
-5080 710.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4992 693.97 moveto 80 (~5':[26,92]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 684.57 moveto
-5080 684.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5016 667.97 moveto 32 (18.5) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 658.57 moveto
-5080 658.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5012.5 641.97 moveto 39 (CACT) alignedtext
-grestore
-% AAG->ACT
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 4588.24 651.97 moveto
-4651.05 650.58 4735.67 650.69 4810 657.57 curveto
-4866.19 662.77 4929.47 674.79 4974.04 684.31 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 4973.31 687.73 moveto
-4983.83 686.42 lineto
-4974.79 680.89 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 4973.31 687.73 moveto
-4983.83 686.42 lineto
-4974.79 680.89 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4606 662.97 moveto 204 (FR: [8,31,42,50,66,69,78,86]) alignedtext
-grestore
-% TAA->AAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 8921.99 1357.94 moveto
-8898.2 1377.94 8868.15 1400.43 8838 1415.57 curveto
-8522.9 1573.85 8423.24 1580.86 8074 1629.57 curveto
-7703.37 1681.27 6764.22 1628.57 6390 1628.57 curveto
-2933 1628.57 2933 1628.57 2933 1628.57 curveto
-2385.55 1628.57 2208.47 1636.1 2148 1692.57 curveto
-2120.09 1718.63 2149.67 1743.85 2130 1776.57 curveto
-1983.08 2020.96 1924.16 2189.57 1639 2189.57 curveto
-589 2189.57 589 2189.57 589 2189.57 curveto
-280.68 2189.57 114.38 1054.81 75.14 748.82 curveto
-stroke
-0 0 0 edgecolor
-newpath 78.59 748.19 moveto
-73.86 738.71 lineto
-71.65 749.08 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 78.59 748.19 moveto
-73.86 738.71 lineto
-71.65 749.08 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4062.5 1633.97 moveto 189 (FF: [49,81,83,89,93,94,97]) alignedtext
-grestore
-% TAA->AAT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 8921.88 1336.71 moveto
-8856.95 1366.52 8736.86 1416.74 8628 1435.57 curveto
-8540.63 1450.69 7120.67 1430.57 7032 1430.57 curveto
-4495 1430.57 4495 1430.57 4495 1430.57 curveto
-3535.14 1430.57 3290.62 1476.7 2336 1376.57 curveto
-1604.58 1299.86 1365.23 1417.58 706 1091.57 curveto
-687.47 1082.41 669.79 1069.39 654.04 1055.54 curveto
-stroke
-0 0 0 edgecolor
-newpath 656.23 1052.8 moveto
-646.46 1048.69 lineto
-651.53 1058 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 656.23 1052.8 moveto
-646.46 1048.69 lineto
-651.53 1058 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4416.5 1435.97 moveto 157 (FF: [7,11,37,40,56,85]) alignedtext
-grestore
-% TAA->AAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 8921.7 1267.98 moveto
-8898.3 1248.91 8868.66 1228.82 8838 1218.57 curveto
-8740.04 1185.82 8165.66 1179.29 8092 1208.57 curveto
-8081.77 1212.64 8084.23 1221.51 8074 1225.57 curveto
-7979.84 1263.01 7947.23 1230.04 7846 1225.57 curveto
-7276.34 1200.44 7136.79 1152.86 6568 1112.57 curveto
-6276.32 1091.91 5538.37 1110.68 5254 1042.57 curveto
-4947.68 969.21 4870.31 926.9 4606 755.57 curveto
-4593.23 747.3 4580.49 737.56 4568.43 727.48 curveto
-stroke
-0 0 0 edgecolor
-newpath 4570.49 724.63 moveto
-4560.61 720.81 lineto
-4565.95 729.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 4570.49 724.63 moveto
-4560.61 720.81 lineto
-4565.95 729.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6937.5 1184.97 moveto 189 (FF: [38,39,47,52,71,88,91]) alignedtext
-grestore
-% TAA->ATA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 8921.77 1309.04 moveto
-8896.8 1306.91 8865.79 1304.62 8838 1303.57 curveto
-8752.73 1300.35 8731.06 1296.79 8646 1303.57 curveto
-8622.36 1305.46 8596.65 1309.15 8573.95 1312.97 curveto
-stroke
-0 1 1 edgecolor
-newpath 8573.34 1309.52 moveto
-8564.09 1314.67 lineto
-8574.54 1316.42 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 8573.34 1309.52 moveto
-8564.09 1314.67 lineto
-8574.54 1316.42 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8646 1308.97 moveto 192 (RR: [49,75,81,83,89,94,97]) alignedtext
-grestore
-% ACC
-gsave
-0 0 0.75294 nodecolor
-newpath 9501 1342.57 moveto
-9501 1472.57 lineto
-9621 1472.57 lineto
-9621 1342.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1342.57 moveto
-9501 1472.57 lineto
-9621 1472.57 lineto
-9621 1342.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9546 1455.97 moveto 30 (ACC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1446.57 moveto
-9621 1446.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9509 1429.97 moveto 104 (5':[23,15,48,5]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1420.57 moveto
-9621 1420.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9541 1403.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1394.57 moveto
-9621 1394.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9549.5 1377.97 moveto 23 (8.5) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1368.57 moveto
-9621 1368.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9542 1351.97 moveto 38 (TACC) alignedtext
-grestore
-% TAA->ACC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 9018.18 1338.91 moveto
-9042.63 1350.57 9073.18 1363.4 9102 1370.57 curveto
-9236.64 1404.1 9399.7 1409.17 9490.75 1408.96 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 9490.96 1412.46 moveto
-9500.95 1408.92 lineto
-9490.93 1405.46 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 9490.96 1412.46 moveto
-9500.95 1408.92 lineto
-9490.93 1405.46 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9146 1410.97 moveto 172 (RF: [5,7,11,21,37,40,56]) alignedtext
-grestore
-% CTA
-gsave
-0 0 0.75294 nodecolor
-newpath 9513 1158.57 moveto
-9513 1288.57 lineto
-9609 1288.57 lineto
-9609 1158.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1158.57 moveto
-9513 1288.57 lineto
-9609 1288.57 lineto
-9609 1158.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9547 1271.97 moveto 28 (CTA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1262.57 moveto
-9609 1262.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9533.5 1245.97 moveto 55 (5':[100]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1236.57 moveto
-9609 1236.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9521 1219.97 moveto 80 (~5':[43,85]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1210.57 moveto
-9609 1210.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9545 1193.97 moveto 32 (28.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1184.57 moveto
-9609 1184.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9547 1167.97 moveto 28 (CTA) alignedtext
-grestore
-% TAA->CTA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 9018.28 1281.3 moveto
-9042.37 1266.97 9072.59 1251.57 9102 1243.57 curveto
-9241.74 1205.56 9414.14 1211.41 9502.59 1218.02 curveto
-stroke
-0 1 1 edgecolor
-newpath 9502.45 1221.52 moveto
-9512.69 1218.81 lineto
-9502.99 1214.54 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 9502.45 1221.52 moveto
-9512.69 1218.81 lineto
-9502.99 1214.54 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9102.5 1248.97 moveto 259 (RR: [12,16,38,39,61,71,82,88,91,93]) alignedtext
-grestore
-% GAA->AAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3076.18 490.11 moveto
-2993.22 487.45 2851.65 483.57 2730 483.57 curveto
-589 483.57 589 483.57 589 483.57 curveto
-390.18 483.57 320.28 466.94 150 569.57 curveto
-136.63 577.63 124.49 588.64 113.85 600.48 curveto
-stroke
-0 0 0 edgecolor
-newpath 110.94 598.5 moveto
-107.08 608.36 lineto
-116.25 603.06 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 110.94 598.5 moveto
-107.08 608.36 lineto
-116.25 603.06 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1450 488.97 moveto 378 (FF: [1,2,4,9,14,27,30,41,49,54,64,67,75,81,83,94,97]) alignedtext
-grestore
-% GAA->AAT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3076.46 542.85 moveto
-3070.39 545.83 3064.2 548.46 3058 550.57 curveto
-2865.96 615.86 2349.02 594.51 2148 621.57 curveto
-1824.61 665.11 1005.38 768.79 706 898.57 curveto
-696.57 902.66 687.17 907.61 678.03 913.05 curveto
-stroke
-0 0 0 edgecolor
-newpath 676.02 910.17 moveto
-669.34 918.39 lineto
-679.69 916.13 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 676.02 910.17 moveto
-669.34 918.39 lineto
-679.69 916.13 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1849.5 666.97 moveto 279 (FF: [13,15,17,23,33,45,48,59,77,96,98]) alignedtext
-grestore
-% GAA->AAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3217.81 506.86 moveto
-3223.95 507.87 3230.07 508.79 3236 509.57 curveto
-3743.21 576.34 3893.95 446.69 4384 593.57 curveto
-4386.78 594.4 4389.56 595.31 4392.34 596.29 curveto
-stroke
-0 0 0 edgecolor
-newpath 4391.19 599.6 moveto
-4401.78 599.86 lineto
-4393.66 593.05 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 4391.19 599.6 moveto
-4401.78 599.86 lineto
-4393.66 593.05 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3483.5 535.97 moveto 427 (FF: [8,25,32,36,42,46,47,52,53,62,66,71,76,78,80,84,86,87]) alignedtext
-grestore
-% TCA
-gsave
-0 0 0.75294 nodecolor
-newpath 7272 603.57 moveto
-7272 733.57 lineto
-7392 733.57 lineto
-7392 603.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 603.57 moveto
-7272 733.57 lineto
-7392 733.57 lineto
-7392 603.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7318 716.97 moveto 28 (TCA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 707.57 moveto
-7392 707.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7280 690.97 moveto 104 (5':[69,42,31,8]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 681.57 moveto
-7392 681.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7292 664.97 moveto 80 (~5':[87,90]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 655.57 moveto
-7392 655.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7316 638.97 moveto 32 (35.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 629.57 moveto
-7392 629.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7318 612.97 moveto 28 (TCA) alignedtext
-grestore
-% GAA->TCA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 3217.86 483.16 moveto
-3223.99 482.55 3230.1 482 3236 481.57 curveto
-3745 444.45 3874.14 477.99 4384 455.57 curveto
-4581.56 446.89 4630.35 433.02 4828 426.57 curveto
-5601.18 401.35 5798.24 394.64 6568 471.57 curveto
-6873.64 502.12 6991.21 396.53 7254 555.57 curveto
-7270 565.26 7283.52 579.62 7294.58 594.89 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 7291.91 597.19 moveto
-7300.47 603.44 lineto
-7297.68 593.22 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 7291.91 597.19 moveto
-7300.47 603.44 lineto
-7297.68 593.22 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4934.5 431.97 moveto 195 (RF: [1,4,20,27,30,41,64,67]) alignedtext
-grestore
-% GGA
-gsave
-0 0 0.75294 nodecolor
-newpath 2670 1144.57 moveto
-2670 1274.57 lineto
-2790 1274.57 lineto
-2790 1144.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1144.57 moveto
-2670 1274.57 lineto
-2790 1274.57 lineto
-2790 1144.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2713.5 1257.97 moveto 33 (GGA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1248.57 moveto
-2790 1248.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2678 1231.97 moveto 104 (5':[37,17,81,4]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1222.57 moveto
-2790 1222.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2678.5 1205.97 moveto 103 (~5':[64,30,28]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1196.57 moveto
-2790 1196.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2714 1179.97 moveto 32 (38.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1170.57 moveto
-2790 1170.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2713.5 1153.97 moveto 33 (GGA) alignedtext
-grestore
-% GAA->GGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3109.09 557.76 moveto
-3031.49 691.17 2855.03 994.6 2773.18 1135.33 curveto
-stroke
-0 1 1 edgecolor
-newpath 2769.93 1133.96 moveto
-2767.93 1144.36 lineto
-2775.98 1137.48 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 2769.93 1133.96 moveto
-2767.93 1144.36 lineto
-2775.98 1137.48 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2808 1076.97 moveto 250 (RR: [2,10,14,49,54,63,75,81,94,97]) alignedtext
-grestore
-% CGA
-gsave
-0 0 0.75294 nodecolor
-newpath 11098.5 1019.57 moveto
-11098.5 1149.57 lineto
-11185.5 1149.57 lineto
-11185.5 1019.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1019.57 moveto
-11098.5 1149.57 lineto
-11185.5 1149.57 lineto
-11185.5 1019.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11126.5 1132.97 moveto 31 (CGA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1123.57 moveto
-11185.5 1123.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11108 1106.97 moveto 68 (5':[55,76]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1097.57 moveto
-11185.5 1097.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11106.5 1080.97 moveto 71 (~5':[3,51]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1071.57 moveto
-11185.5 1071.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11126 1054.97 moveto 32 (38.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1045.57 moveto
-11185.5 1045.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11126.5 1028.97 moveto 31 (CGA) alignedtext
-grestore
-% GAA->CGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3165.18 427.43 moveto
-3178.77 390.77 3201.13 347.31 3236 321.57 curveto
-3325.42 255.56 3371.39 287.48 3482 276.57 curveto
-3516.77 273.14 4404.29 261.91 4606 260.57 curveto
-5052.21 257.6 5163.94 248.5 5610 260.57 curveto
-6349.48 280.58 6533.01 317.18 7272 350.57 curveto
-7333.31 353.34 7348.66 353.41 7410 355.57 curveto
-8044.65 377.96 8203.62 375.64 8838 404.57 curveto
-8947.4 409.56 8974.94 408.62 9084 418.57 curveto
-9208.02 429.89 9238.61 436.73 9362 453.57 curveto
-9380.44 456.09 10671.28 640.38 10688 648.57 curveto
-10864.58 735.09 11017.23 915.4 11092.35 1014.89 curveto
-stroke
-0 1 1 edgecolor
-newpath 11089.7 1017.19 moveto
-11098.5 1023.09 lineto
-11095.3 1012.99 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 11089.7 1017.19 moveto
-11098.5 1023.09 lineto
-11095.3 1012.99 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7410.5 374.97 moveto 417 (RR: [13,17,32,33,38,45,47,52,59,62,71,76,77,84,91,96,98]) alignedtext
-grestore
-% GAA->AGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3181.05 427.31 moveto
-3195.17 406.84 3213.57 386.49 3236 374.57 curveto
-3366.13 305.45 3547.13 323.23 3638.81 338.75 curveto
-stroke
-0 1 1 edgecolor
-newpath 3638.28 342.21 moveto
-3648.73 340.48 lineto
-3639.48 335.31 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3638.28 342.21 moveto
-3648.73 340.48 lineto
-3639.48 335.31 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3236 379.97 moveto 228 (RR: [8,25,42,46,66,70,78,80,86]) alignedtext
-grestore
-% TCA->GAA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 7271.81 658.06 moveto
-7102.67 629.09 6608.43 548.25 6194 518.57 curveto
-5593.04 475.54 3649.24 488.5 3228 491.88 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 3227.72 488.38 moveto
-3217.75 491.96 lineto
-3227.77 495.38 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 3227.72 488.38 moveto
-3217.75 491.96 lineto
-3227.77 495.38 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4934.5 496.97 moveto 195 (RF: [1,4,20,27,30,41,64,67]) alignedtext
-grestore
-% CTC
-gsave
-0 0 0.75294 nodecolor
-newpath 10706.5 404.57 moveto
-10706.5 534.57 lineto
-10825.5 534.57 lineto
-10825.5 404.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 404.57 moveto
-10706.5 534.57 lineto
-10825.5 534.57 lineto
-10825.5 404.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10752 517.97 moveto 28 (CTC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 508.57 moveto
-10825.5 508.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10752 491.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 482.57 moveto
-10825.5 482.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10714.5 465.97 moveto 103 (~5':[58,41,27]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 456.57 moveto
-10825.5 456.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750 439.97 moveto 32 (28.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 430.57 moveto
-10825.5 430.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10752 413.97 moveto 28 (CTC) alignedtext
-grestore
-% TCA->CTC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 7392.26 613.2 moveto
-7397.99 609.81 7403.93 606.85 7410 604.57 curveto
-7580.58 540.54 10510.02 541.56 10688 502.57 curveto
-10690.83 501.95 10693.68 501.23 10696.54 500.43 curveto
-stroke
-0 1 1 edgecolor
-newpath 10697.74 503.73 moveto
-10706.26 497.43 lineto
-10695.67 497.04 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 10697.74 503.73 moveto
-10706.26 497.43 lineto
-10695.67 497.04 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8856 552.97 moveto 228 (RR: [6,25,36,46,53,66,70,80,87]) alignedtext
-grestore
-% CAG
-gsave
-0 0 0.75294 nodecolor
-newpath 6641 715.57 moveto
-6641 845.57 lineto
-6737 845.57 lineto
-6737 715.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 715.57 moveto
-6641 845.57 lineto
-6737 845.57 lineto
-6737 715.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6673.5 828.97 moveto 31 (CAG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 819.57 moveto
-6737 819.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6666 802.97 moveto 46 (5':[65]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 793.57 moveto
-6737 793.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6649 776.97 moveto 80 (~5':[72,60]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 767.57 moveto
-6737 767.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6673 750.97 moveto 32 (30.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 741.57 moveto
-6737 741.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6673.5 724.97 moveto 31 (CAG) alignedtext
-grestore
-% TCA->CAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 7271.77 696.35 moveto
-7265.85 698.38 7259.86 700.18 7254 701.57 curveto
-7061.6 747.4 7002.75 687.23 6810 731.57 curveto
-6788.65 736.48 6766.16 744.68 6746.45 752.97 curveto
-stroke
-0 0 0 edgecolor
-newpath 6744.81 749.86 moveto
-6737.01 757.03 lineto
-6747.58 756.29 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 6744.81 749.86 moveto
-6737.01 757.03 lineto
-6747.58 756.29 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6811.5 736.97 moveto 441 (FF: [6,8,19,25,26,31,42,46,50,60,66,69,70,72,78,80,86,90,92]) alignedtext
-grestore
-% TCA->ATC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 7392.08 660.5 moveto
-7508.88 646.15 7760.97 622.18 7828 672.57 curveto
-7886.92 716.87 7929.25 925.71 7948.46 1040.14 curveto
-stroke
-0 1 1 edgecolor
-newpath 7945.05 1040.94 moveto
-7950.14 1050.23 lineto
-7951.95 1039.79 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 7945.05 1040.94 moveto
-7950.14 1050.23 lineto
-7951.95 1039.79 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7534.5 677.97 moveto 169 (RR: [19,26,60,72,90,92]) alignedtext
-grestore
-% TCA->ACT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 7271.96 666.97 moveto
-7265.89 666.82 7259.82 666.69 7254 666.57 curveto
-6949.14 660.44 6872.91 658.79 6568 656.57 curveto
-5983.86 652.31 5837.68 662.97 5254 686.57 curveto
-5198.38 688.82 5134.94 692.03 5090.17 694.4 curveto
-stroke
-0 0 0 edgecolor
-newpath 5089.86 690.91 moveto
-5080.06 694.94 lineto
-5090.23 697.9 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 5089.86 690.91 moveto
-5080.06 694.94 lineto
-5090.23 697.9 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6212.5 661.97 moveto 355 (FF: [1,3,4,8,20,26,27,31,41,42,50,51,67,69,78,86]) alignedtext
-grestore
-% GGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 2734.19 1144.43 moveto
-2744.14 999.68 2771.13 661.24 2808 625.57 curveto
-2848.13 586.75 3008.75 626.88 3058 600.57 curveto
-3074 592.02 3088.24 579.27 3100.38 565.5 curveto
-stroke
-0 0 0 edgecolor
-newpath 3103.14 567.66 moveto
-3106.91 557.76 lineto
-3097.79 563.15 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3103.14 567.66 moveto
-3106.91 557.76 lineto
-3097.79 563.15 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2809.5 630.97 moveto 247 (FF: [2,10,14,49,54,63,75,81,94,97]) alignedtext
-grestore
-% GAC
-gsave
-0 0 0.75294 nodecolor
-newpath 11790.5 1017.57 moveto
-11790.5 1147.57 lineto
-11855.5 1147.57 lineto
-11855.5 1017.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1017.57 moveto
-11790.5 1147.57 lineto
-11855.5 1147.57 lineto
-11855.5 1017.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11807.5 1130.97 moveto 31 (GAC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1121.57 moveto
-11855.5 1121.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11800 1104.97 moveto 46 (5':[59]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1095.57 moveto
-11855.5 1095.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11798.5 1078.97 moveto 49 (~5':[9]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1069.57 moveto
-11855.5 1069.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11807 1052.97 moveto 32 (14.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1043.57 moveto
-11855.5 1043.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11807.5 1026.97 moveto 31 (GAC) alignedtext
-grestore
-% GGA->GAC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 2785.54 1274.89 moveto
-2859.33 1353.93 2997.85 1476.57 3147 1476.57 curveto
-3147 1476.57 3147 1476.57 5432 1476.57 curveto
-6606.23 1476.57 6900.37 1445.26 8074 1482.57 curveto
-8320.56 1490.41 8381.8 1501.1 8628 1516.57 curveto
-8780.01 1526.13 8817.69 1538.57 8970 1538.57 curveto
-8970 1538.57 8970 1538.57 10469 1538.57 curveto
-11013.7 1538.57 11620.22 1203.03 11781.7 1107.61 curveto
-stroke
-0 0 0 edgecolor
-newpath 11783.56 1110.57 moveto
-11790.37 1102.46 lineto
-11779.99 1104.55 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11783.56 1110.57 moveto
-11790.37 1102.46 lineto
-11779.99 1104.55 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7847.5 1487.97 moveto 225 (FF: [9,13,17,18,33,45,74,77,98]) alignedtext
-grestore
-% GGA->CTC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 2734.33 1144.45 moveto
-2744.23 1004.49 2770.59 679.31 2808 575.57 curveto
-2902.74 312.89 2867.76 46.57 3147 46.57 curveto
-3147 46.57 3147 46.57 4157 46.57 curveto
-4692.95 46.57 6032.59 84.52 6568 108.57 curveto
-7136.59 134.11 7277.56 161.84 7846 190.57 curveto
-8519.38 224.61 8689.33 200.56 9362 246.57 curveto
-9954.72 287.12 10134.44 199.86 10688 415.57 curveto
-10691.07 416.77 10694.13 418.11 10697.18 419.56 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10695.74 422.75 moveto
-10706.23 424.22 lineto
-10698.94 416.53 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10695.74 422.75 moveto
-10706.23 424.22 lineto
-10698.94 416.53 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6939 157.97 moveto 186 (FR: [1,3,4,20,35,44,51,67]) alignedtext
-grestore
-% GGA->ATC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 2790.21 1227.01 moveto
-2796.19 1228.37 2802.19 1229.59 2808 1230.57 curveto
-2956.95 1255.66 2995.96 1254.57 3147 1254.57 curveto
-3147 1254.57 3147 1254.57 4157 1254.57 curveto
-4723.71 1254.57 4865.29 1270.57 5432 1270.57 curveto
-5432 1270.57 5432 1270.57 7332 1270.57 curveto
-7553.16 1270.57 7624.18 1316.41 7828 1230.57 curveto
-7858.2 1217.85 7886.37 1195.45 7908.87 1173.78 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 7911.62 1175.99 moveto
-7916.28 1166.47 lineto
-7906.7 1171 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 7911.62 1175.99 moveto
-7916.28 1166.47 lineto
-7906.7 1171 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4948 1274.97 moveto 168 (FR: [11,16,37,56,82,85]) alignedtext
-grestore
-% CCG
-gsave
-0 0 0.75294 nodecolor
-newpath 2179.5 1701.57 moveto
-2179.5 1831.57 lineto
-2286.5 1831.57 lineto
-2286.5 1701.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1701.57 moveto
-2179.5 1831.57 lineto
-2286.5 1831.57 lineto
-2286.5 1701.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2217.5 1814.97 moveto 31 (CCG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1805.57 moveto
-2286.5 1805.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2187.5 1788.97 moveto 91 (5':[68,96,93]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1779.57 moveto
-2286.5 1779.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2193 1762.97 moveto 80 (~5':[56,20]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1753.57 moveto
-2286.5 1753.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2217 1736.97 moveto 32 (45.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1727.57 moveto
-2286.5 1727.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2217.5 1710.97 moveto 31 (CCG) alignedtext
-grestore
-% GGA->CCG
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 2669.89 1271.07 moveto
-2591.11 1352.4 2449.62 1501.06 2336 1634.57 curveto
-2320.1 1653.25 2303.5 1673.95 2288.38 1693.32 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 2285.59 1691.2 moveto
-2282.22 1701.24 lineto
-2291.12 1695.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 2285.59 1691.2 moveto
-2282.22 1701.24 lineto
-2291.12 1695.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2336 1639.97 moveto 316 (RF: [9,11,16,18,30,33,45,56,64,74,77,82,85]) alignedtext
-grestore
-% CCA
-gsave
-0 0 0.75294 nodecolor
-newpath 5869 750.57 moveto
-5869 880.57 lineto
-5953 880.57 lineto
-5953 750.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 750.57 moveto
-5869 880.57 lineto
-5953 880.57 lineto
-5953 750.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5896 863.97 moveto 30 (CCA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 854.57 moveto
-5953 854.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5877 837.97 moveto 68 (5':[78,86]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 828.57 moveto
-5953 828.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5891 811.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 802.57 moveto
-5953 802.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5895 785.97 moveto 32 (20.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 776.57 moveto
-5953 776.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5896 759.97 moveto 30 (CCA) alignedtext
-grestore
-% GGA->CCA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 2790.12 1171.48 moveto
-2796.02 1168.79 2802.03 1166.42 2808 1164.57 curveto
-2925.52 1128.15 3789.35 1088.34 3912 1078.57 curveto
-4212.49 1054.64 4288.39 1056.69 4588 1023.57 curveto
-4595.12 1022.78 5602.94 881.83 5610 880.57 curveto
-5697.82 864.97 5799.03 842.09 5858.86 828.05 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 5859.89 831.41 moveto
-5868.82 825.71 lineto
-5858.29 824.59 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 5859.89 831.41 moveto
-5868.82 825.71 lineto
-5858.29 824.59 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4055 1081.97 moveto 204 (RF: [2,10,14,43,49,54,63,75]) alignedtext
-grestore
-% CCC
-gsave
-0 0 0.75294 nodecolor
-newpath 10712.5 1940.57 moveto
-10712.5 2070.57 lineto
-10819.5 2070.57 lineto
-10819.5 1940.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 1940.57 moveto
-10712.5 2070.57 lineto
-10819.5 2070.57 lineto
-10819.5 1940.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10751 2053.97 moveto 30 (CCC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 2044.57 moveto
-10819.5 2044.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10720.5 2027.97 moveto 91 (5':[84,32,73]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 2018.57 moveto
-10819.5 2018.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10746 2001.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 1992.57 moveto
-10819.5 1992.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750 1975.97 moveto 32 (19.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 1966.57 moveto
-10819.5 1966.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10751 1949.97 moveto 30 (CCC) alignedtext
-grestore
-% GGA->CCC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 2735.49 1274.95 moveto
-2747.11 1405.57 2775.75 1688.84 2808 1718.57 curveto
-2863.53 1769.76 3071.48 1742.57 3147 1742.57 curveto
-3147 1742.57 3147 1742.57 5432 1742.57 curveto
-6241.81 1742.57 6444.49 1737.47 7254 1759.57 curveto
-7509.28 1766.54 7573.09 1770.26 7828 1785.57 curveto
-8982.2 1854.91 10388.91 1973.34 10702.19 2000.09 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10702.18 2003.6 moveto
-10712.44 2000.97 lineto
-10702.78 1996.63 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10702.18 2003.6 moveto
-10712.44 2000.97 lineto
-10702.78 1996.63 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6923.5 1764.97 moveto 217 (RF: [1,3,20,28,35,44,51,67,95]) alignedtext
-grestore
-% CGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 11138.52 1019.41 moveto
-11132.89 949.68 11118.19 837.03 11080 747.57 curveto
-11045.42 666.57 10793.45 291.51 10688 238.57 curveto
-10648.05 218.52 9128.64 110.92 9084 108.57 curveto
-8090.26 56.4 5597.98 33.66 4606 112.57 curveto
-4300.4 136.88 3479.97 88.93 3236 274.57 curveto
-3191.26 308.62 3168.9 369 3157.79 417.59 curveto
-stroke
-0 0 0 edgecolor
-newpath 3154.35 416.94 moveto
-3155.66 427.45 lineto
-3161.2 418.42 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3154.35 416.94 moveto
-3155.66 427.45 lineto
-3161.2 418.42 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7412 76.97 moveto 414 (FF: [13,17,32,33,38,45,47,52,59,62,71,76,77,84,91,96,98]) alignedtext
-grestore
-% CGA->ATC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 11098.3 1074.16 moveto
-11028.5 1058.47 10887.34 1030.57 10766 1030.57 curveto
-8970 1030.57 8970 1030.57 8970 1030.57 curveto
-8603.18 1030.57 8164.05 1086.93 8013.6 1107.87 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 8013.11 1104.4 moveto
-8003.7 1109.25 lineto
-8014.08 1111.33 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 8013.11 1104.4 moveto
-8003.7 1109.25 lineto
-8014.08 1111.33 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9380.5 1035.97 moveto 361 (FR: [9,18,22,28,30,34,35,44,55,57,64,68,73,74,95]) alignedtext
-grestore
-% CGA->CCG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11113.01 1149.59 moveto
-11104.1 1164.25 11093.1 1178.68 11080 1189.57 curveto
-10937.4 1308.13 10863.69 1273.2 10688 1332.57 curveto
-9983.28 1570.7 9820.47 1705.91 9084 1810.57 curveto
-8682.25 1867.67 5837.79 1780.57 5432 1780.57 curveto
-2730 1780.57 2730 1780.57 2730 1780.57 curveto
-2574.42 1780.57 2391.54 1773.63 2296.94 1769.52 curveto
-stroke
-0 1 1 edgecolor
-newpath 2296.82 1766.02 moveto
-2286.67 1769.08 lineto
-2296.51 1773.01 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 2296.82 1766.02 moveto
-2286.67 1769.08 lineto
-2296.51 1773.01 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6832.5 1821.97 moveto 399 (RR: [3,9,18,22,28,30,33,34,35,44,51,57,64,68,73,74,95]) alignedtext
-grestore
-% ACG
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1018.57 moveto
-11460 1148.57 lineto
-11516 1148.57 lineto
-11516 1018.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11472.5 1131.97 moveto 31 (ACG) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1122.57 moveto
-11516 1122.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11474 1105.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1096.57 moveto
-11516 1096.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11468 1079.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1070.57 moveto
-11516 1070.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11476.5 1053.97 moveto 23 (9.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1044.57 moveto
-11516 1044.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11472.5 1027.97 moveto 31 (ACG) alignedtext
-grestore
-% CGA->ACG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11185.83 1066.15 moveto
-11191.84 1064.26 11198.01 1062.65 11204 1061.57 curveto
-11308.11 1042.88 11338.84 1038.17 11442 1061.57 curveto
-11444.66 1062.18 11447.35 1062.95 11450.01 1063.85 curveto
-stroke
-0 1 1 edgecolor
-newpath 11448.92 1067.18 moveto
-11459.51 1067.56 lineto
-11451.47 1060.66 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 11448.92 1067.18 moveto
-11459.51 1067.56 lineto
-11451.47 1060.66 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11204.5 1066.97 moveto 237 (RR: [13,17,18,33,45,59,74,77,98]) alignedtext
-grestore
-% CGC
-gsave
-0 0 0.75294 nodecolor
-newpath 10729 1096.57 moveto
-10729 1226.57 lineto
-10803 1226.57 lineto
-10803 1096.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1096.57 moveto
-10729 1226.57 lineto
-10803 1226.57 lineto
-10803 1096.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750.5 1209.97 moveto 31 (CGC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1200.57 moveto
-10803 1200.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10752 1183.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1174.57 moveto
-10803 1174.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10737 1157.97 moveto 58 (~5':[11]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1148.57 moveto
-10803 1148.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750 1131.97 moveto 32 (14.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1122.57 moveto
-10803 1122.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750.5 1105.97 moveto 31 (CGC) alignedtext
-grestore
-% CGA->CGC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 11098.39 1083.68 moveto
-11039.27 1083.71 10931.07 1088.19 10844 1116.57 curveto
-10833.19 1120.1 10822.23 1125.25 10812.08 1130.82 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10810.33 1127.79 moveto
-10803.39 1135.79 lineto
-10813.81 1133.86 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10810.33 1127.79 moveto
-10803.39 1135.79 lineto
-10813.81 1133.86 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10844.5 1121.97 moveto 235 (RF: [32,38,39,47,52,62,71,84,91]) alignedtext
-grestore
-% AGA->AAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3745.14 356 moveto
-3792.21 361.15 3865.95 368.79 3930 373.57 curveto
-3980.37 377.33 4342.55 367.71 4384 396.57 curveto
-4444.18 438.48 4471.94 520.11 4484.62 580.58 curveto
-stroke
-0 1 1 edgecolor
-newpath 4481.2 581.36 moveto
-4486.6 590.47 lineto
-4488.07 579.98 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 4481.2 581.36 moveto
-4486.6 590.47 lineto
-4488.07 579.98 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4106 401.97 moveto 102 (RR: [79,83,89]) alignedtext
-grestore
-% AGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3648.89 359.75 moveto
-3601.83 368.6 3528.1 382.16 3464 392.57 curveto
-3362.94 408.99 3330.52 386.22 3236 425.57 curveto
-3232.92 426.85 3229.85 428.27 3226.81 429.79 curveto
-stroke
-0 0 0 edgecolor
-newpath 3224.9 426.84 moveto
-3217.75 434.65 lineto
-3228.22 433 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3224.9 426.84 moveto
-3217.75 434.65 lineto
-3228.22 433 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3237.5 430.97 moveto 225 (FF: [8,25,42,46,66,70,78,80,86]) alignedtext
-grestore
-% AGA->GAC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3745.29 308.3 moveto
-3789.86 272.11 3859.61 222.36 3930 199.57 curveto
-4088.98 148.1 5264.89 122.57 5432 122.57 curveto
-5432 122.57 5432 122.57 11488 122.57 curveto
-11615.47 122.57 11685.76 68.71 11772 162.57 curveto
-11800.42 193.5 11816.54 793.11 11821.41 1007.31 curveto
-stroke
-0 0 0 edgecolor
-newpath 11817.91 1007.6 moveto
-11821.64 1017.52 lineto
-11824.91 1007.45 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11817.91 1007.6 moveto
-11821.64 1017.52 lineto
-11824.91 1007.45 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8459.5 127.97 moveto 99 (FF: [29,79,89]) alignedtext
-grestore
-% AGA->CTC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 3745.19 337.19 moveto
-3792 324.82 3865.28 307.1 3930 298.57 curveto
-4179.18 265.74 4243.66 274.57 4495 274.57 curveto
-4495 274.57 4495 274.57 5432 274.57 curveto
-6404.02 274.57 6646.98 260.57 7619 260.57 curveto
-7619 260.57 7619 260.57 10172 260.57 curveto
-10402.98 260.57 10497.53 191.91 10688 322.57 curveto
-10713.15 339.82 10730.82 367.84 10742.9 394.81 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10739.8 396.46 moveto
-10746.95 404.29 lineto
-10746.24 393.72 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10739.8 396.46 moveto
-10746.95 404.29 lineto
-10746.24 393.72 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7519.5 266.97 moveto 199 (FR: [10,43,54,63,65,99,100]) alignedtext
-grestore
-% AGA->CAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3745.48 351.09 moveto
-3880.77 352.74 4260.54 358.86 4384 376.57 curveto
-4585.45 405.47 4628.98 446.06 4828 488.57 curveto
-5438.74 619.04 5593.42 645.61 6212 731.57 curveto
-6362.46 752.48 6540.76 768.48 6630.78 775.94 curveto
-stroke
-0 1 1 edgecolor
-newpath 6630.54 779.43 moveto
-6640.79 776.77 lineto
-6631.11 772.46 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 6630.54 779.43 moveto
-6640.79 776.77 lineto
-6631.11 772.46 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4828 578.97 moveto 408 (RR: [2,8,10,14,25,42,43,46,54,63,65,66,70,78,80,86,100]) alignedtext
-grestore
-% GAC->GGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11813.26 1147.81 moveto
-11787.97 1289.87 11706.29 1614.57 11488 1614.57 curveto
-10469 1614.57 10469 1614.57 10469 1614.57 curveto
-9936.54 1614.57 8606.31 1556.05 8074 1543.57 curveto
-7325.65 1526.04 7138.56 1514.57 6390 1514.57 curveto
-3147 1514.57 3147 1514.57 3147 1514.57 curveto
-2987.47 1514.57 2924.15 1505.93 2808 1396.57 curveto
-2776.61 1367.02 2757.4 1322.91 2745.9 1284.95 curveto
-stroke
-0 1 1 edgecolor
-newpath 2749.15 1283.57 moveto
-2743 1274.94 lineto
-2742.42 1285.52 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 2749.15 1283.57 moveto
-2743 1274.94 lineto
-2742.42 1285.52 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7846 1548.97 moveto 228 (RR: [9,13,17,18,33,45,74,77,98]) alignedtext
-grestore
-% GAC->AGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11813.4 1017.41 moveto
-11780.97 809.68 11667.44 176.57 11488 176.57 curveto
-7619 176.57 7619 176.57 7619 176.57 curveto
-7072.69 176.57 6936.31 198.57 6390 198.57 curveto
-4708 198.57 4708 198.57 4708 198.57 curveto
-4360.79 198.57 4269.38 196.25 3930 269.57 curveto
-3868.52 282.86 3800.88 307.56 3754.4 326.21 curveto
-stroke
-0 1 1 edgecolor
-newpath 3753.06 322.98 moveto
-3745.1 329.97 lineto
-3755.68 329.46 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3753.06 322.98 moveto
-3745.1 329.97 lineto
-3755.68 329.46 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8458 181.97 moveto 102 (RR: [29,79,89]) alignedtext
-grestore
-% GAC->ACG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 11790.29 1082.67 moveto
-11728.01 1082.86 11592.71 1083.26 11526.32 1083.46 curveto
-stroke
-0 0 0 edgecolor
-newpath 11526.26 1079.96 moveto
-11516.27 1083.49 lineto
-11526.28 1086.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11526.26 1079.96 moveto
-11516.27 1083.49 lineto
-11526.28 1086.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11536 1087.97 moveto 234 (FF: [13,17,18,33,45,59,74,77,98]) alignedtext
-grestore
-% GAC->CAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 11855.66 1067.7 moveto
-11861.65 1065.58 11867.93 1063.72 11874 1062.57 curveto
-11956.97 1046.88 11980.26 1051.71 12064 1062.57 curveto
-12066.82 1062.94 12069.7 1063.38 12072.59 1063.89 curveto
-stroke
-0 0 0 edgecolor
-newpath 12071.95 1067.33 moveto
-12082.44 1065.82 lineto
-12073.3 1060.46 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 12071.95 1067.33 moveto
-12082.44 1065.82 lineto
-12073.3 1060.46 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11874.5 1067.97 moveto 189 (FF: [22,29,34,55,57,68,79]) alignedtext
-grestore
-% CTC->TCA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 10706.24 519.17 moveto
-10700.32 522.47 10694.2 525.36 10688 527.57 curveto
-10280.31 673.19 9174.92 618.57 8742 618.57 curveto
-7960 618.57 7960 618.57 7960 618.57 curveto
-7715.39 618.57 7649.64 589.55 7410 638.57 curveto
-7407.36 639.11 7404.69 639.73 7402.01 640.42 curveto
-stroke
-0 0 0 edgecolor
-newpath 7400.98 637.07 moveto
-7392.31 643.16 lineto
-7402.88 643.81 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 7400.98 637.07 moveto
-7392.31 643.16 lineto
-7402.88 643.81 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8857.5 628.97 moveto 225 (FF: [6,25,36,46,53,66,70,80,87]) alignedtext
-grestore
-% CTC->GGA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10706.3 467.13 moveto
-10610.08 462.88 10414.8 452.99 10250 436.57 curveto
-9795.67 391.31 9688.58 298.57 9232 298.57 curveto
-7619 298.57 7619 298.57 7619 298.57 curveto
-6983.64 298.57 6828.47 218.16 6194 184.57 curveto
-5180.89 130.94 4926.45 141.02 3912 128.57 curveto
-3720.9 126.23 3672.08 108.7 3482 128.57 curveto
-3370.86 140.19 3334.39 127.59 3236 180.57 curveto
-3177.13 212.27 2837.66 543.65 2808 603.57 curveto
-2762.61 695.27 2741.33 992.92 2733.61 1134.03 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 2730.09 1134.15 moveto
-2733.05 1144.33 lineto
-2737.08 1134.53 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 2730.09 1134.15 moveto
-2733.05 1144.33 lineto
-2737.08 1134.53 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6939 293.97 moveto 186 (FR: [1,3,4,20,35,44,51,67]) alignedtext
-grestore
-% CTC->AGA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10706.19 424.32 moveto
-10700.23 421 10694.12 418.01 10688 415.57 curveto
-10472.44 329.79 10404.01 336.57 10172 336.57 curveto
-7619 336.57 7619 336.57 7619 336.57 curveto
-6279.89 336.57 5945.08 330.61 4606 339.57 curveto
-4305.55 341.58 4230.42 341.02 3930 345.57 curveto
-3870.45 346.48 3802.35 347.99 3755.22 349.12 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 3755.1 345.62 moveto
-3745.19 349.36 lineto
-3755.27 352.62 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 3755.1 345.62 moveto
-3745.19 349.36 lineto
-3755.27 352.62 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7519.5 341.97 moveto 199 (FR: [10,43,54,63,65,99,100]) alignedtext
-grestore
-% CTC->AGC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10742.48 534.64 moveto
-10729.94 561.4 10712.05 590.7 10688 610.57 curveto
-10530.14 741.01 10410.57 626.48 10250 753.57 curveto
-10231.78 767.99 10216.78 787.92 10204.97 807.77 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10201.87 806.14 moveto
-10199.94 816.56 lineto
-10207.95 809.62 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10201.87 806.14 moveto
-10199.94 816.56 lineto
-10207.95 809.62 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10250 758.97 moveto 438 (RF: [6,10,25,36,43,46,53,54,58,63,65,66,70,76,80,87,99,100]) alignedtext
-grestore
-% CTC->ACT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10706.3 441.52 moveto
-10700.22 439.51 10694.05 437.8 10688 436.57 curveto
-10497.22 397.88 10444.66 435.28 10250 436.57 curveto
-9579.73 441.02 9412.28 456.57 8742 456.57 curveto
-7032 456.57 7032 456.57 7032 456.57 curveto
-6404.95 456.57 6251.75 531.34 5628 595.57 curveto
-5461.71 612.7 5418.18 604.09 5254 635.57 curveto
-5197.55 646.4 5134.56 664.59 5090.14 678.48 curveto
-stroke
-0 1 1 edgecolor
-newpath 5088.87 675.21 moveto
-5080.39 681.55 lineto
-5090.98 681.89 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 5088.87 675.21 moveto
-5080.39 681.55 lineto
-5090.98 681.89 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8116 461.97 moveto 232 (RR: [1,3,4,20,27,35,41,44,51,67]) alignedtext
-grestore
-% CAG->TCA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 6737.09 778.16 moveto
-6872.59 771.35 7248.15 752.25 7254 749.57 curveto
-7259.82 746.9 7265.44 743.59 7270.8 739.84 curveto
-stroke
-0 1 1 edgecolor
-newpath 7273.15 742.44 moveto
-7279 733.61 lineto
-7268.92 736.87 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 7273.15 742.44 moveto
-7279 733.61 lineto
-7268.92 736.87 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6810 778.97 moveto 444 (RR: [6,8,19,25,26,31,42,46,50,60,66,69,70,72,78,80,86,90,92]) alignedtext
-grestore
-% CAG->AGA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 6640.8 758.7 moveto
-6619.01 749.74 6592.65 740.18 6568 734.57 curveto
-6490.59 716.96 6273.42 754.87 6212 704.57 curveto
-6189.8 686.39 6214.37 662.78 6194 642.57 curveto
-5879.98 331 5673.42 438.54 5236 372.57 curveto
-4861.45 316.09 4762.75 356.51 4384 351.57 curveto
-4151.31 348.54 3874.25 349.55 3755.61 350.2 curveto
-stroke
-0 0 0 edgecolor
-newpath 3755.29 346.7 moveto
-3745.31 350.26 lineto
-3755.33 353.7 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3755.29 346.7 moveto
-3745.31 350.26 lineto
-3755.33 353.7 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4829.5 377.97 moveto 405 (FF: [2,8,10,14,25,42,43,46,54,63,65,66,70,78,80,86,100]) alignedtext
-grestore
-% CAG->CCA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 6640.88 789.11 moveto
-6618.75 792.68 6592.12 796.47 6568 798.57 curveto
-6343.91 818.07 6075.34 817.62 5963.68 816.38 curveto
-stroke
-0 1 1 edgecolor
-newpath 5963.42 812.88 moveto
-5953.38 816.26 lineto
-5963.33 819.88 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 5963.42 812.88 moveto
-5953.38 816.26 lineto
-5963.33 819.88 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6283 819.97 moveto 214 (RR: [2,10,14,43,54,63,75,100]) alignedtext
-grestore
-% CAG->AGC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 6737.17 795.26 moveto
-6759.18 801.47 6785.72 808.25 6810 812.57 curveto
-7039.42 853.39 7098.98 861.57 7332 861.57 curveto
-7332 861.57 7332 861.57 9561 861.57 curveto
-9757.06 861.57 9988.33 871.99 10101.89 877.79 curveto
-stroke
-0 0 0 edgecolor
-newpath 10102.01 881.3 moveto
-10112.18 878.31 lineto
-10102.37 874.31 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10102.01 881.3 moveto
-10112.18 878.31 lineto
-10102.37 874.31 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8392 866.97 moveto 234 (FF: [19,26,31,50,60,69,72,90,92]) alignedtext
-grestore
-% ATC->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 7916.24 1113.44 moveto
-7536.09 1095.08 4753.38 964.57 2494 964.57 curveto
-1091 964.57 1091 964.57 1091 964.57 curveto
-955.46 964.57 799.47 971.57 697.82 977.08 curveto
-stroke
-0 1 1 edgecolor
-newpath 697.34 973.6 moveto
-687.55 977.64 lineto
-697.72 980.59 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 697.34 973.6 moveto
-687.55 977.64 lineto
-697.72 980.59 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3520 983.97 moveto 354 (RR: [7,9,11,16,18,27,30,37,40,41,56,64,74,82,85]) alignedtext
-grestore
-% ATC->TCA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 7928.7 1050.24 moveto
-7905.6 1007.4 7870.81 952.5 7828 914.57 curveto
-7698.02 799.4 7504.46 724.27 7401.8 690.02 curveto
-stroke
-0 0 0 edgecolor
-newpath 7402.75 686.65 moveto
-7392.16 686.83 lineto
-7400.55 693.29 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 7402.75 686.65 moveto
-7392.16 686.83 lineto
-7400.55 693.29 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7536 919.97 moveto 166 (FF: [19,26,60,72,90,92]) alignedtext
-grestore
-% ATC->GGA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 7916.23 1127.55 moveto
-7814.52 1154.31 7553.96 1216.57 7332 1216.57 curveto
-3147 1216.57 3147 1216.57 3147 1216.57 curveto
-3025.02 1216.57 2882.99 1213.54 2800.13 1211.47 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 2800.16 1207.97 moveto
-2790.07 1211.21 lineto
-2799.98 1214.97 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 2800.16 1207.97 moveto
-2790.07 1211.21 lineto
-2799.98 1214.97 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4948 1221.97 moveto 168 (FR: [11,16,37,56,82,85]) alignedtext
-grestore
-% ATC->CGA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 8003.66 1114.71 moveto
-8235.24 1110.18 9343.47 1089.1 10250 1082.57 curveto
-10618.88 1079.91 10711.16 1076.62 11080 1082.57 curveto
-11082.68 1082.62 11085.43 1082.67 11088.21 1082.73 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 11088.22 1086.23 moveto
-11098.31 1082.99 lineto
-11088.4 1079.23 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 11088.22 1086.23 moveto
-11098.31 1082.99 lineto
-11088.4 1079.23 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9380.5 1096.97 moveto 361 (FR: [9,18,22,28,30,34,35,44,55,57,64,68,73,74,95]) alignedtext
-grestore
-% ATC->ATC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 7916.47 1146.65 moveto
-7898.48 1172.12 7912.98 1198.57 7960 1198.57 curveto
-8001.51 1198.57 8017.68 1177.96 8008.51 1155.6 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 8011.45 1153.68 moveto
-8003.53 1146.65 lineto
-8005.34 1157.09 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 8011.45 1153.68 moveto
-8003.53 1146.65 lineto
-8005.34 1157.09 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7887.5 1203.97 moveto 145 (RF: [19,60,72,90,92]) alignedtext
-grestore
-% ATC->ATA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 8003.61 1121.98 moveto
-8080.84 1134.48 8245.43 1166.29 8372 1226.57 curveto
-8397.72 1238.82 8423.63 1256.02 8445.9 1272.65 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 8443.84 1275.48 moveto
-8453.93 1278.74 lineto
-8448.07 1269.9 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 8443.84 1275.48 moveto
-8453.93 1278.74 lineto
-8448.07 1269.9 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8092 1231.97 moveto 280 (RF: [22,28,29,34,35,44,55,57,68,73,95]) alignedtext
-grestore
-% CCG->GGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 2237.54 1701.54 moveto
-2247.33 1581.01 2274.73 1329.91 2336 1271.57 curveto
-2422.71 1189.02 2572.02 1189.69 2659.82 1198.83 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 2659.63 1202.33 moveto
-2669.95 1199.95 lineto
-2660.4 1195.38 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 2659.63 1202.33 moveto
-2669.95 1199.95 lineto
-2660.4 1195.38 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2336 1276.97 moveto 316 (RF: [9,11,16,18,30,33,45,56,64,74,77,82,85]) alignedtext
-grestore
-% CCG->CGA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 2280.95 1831.78 moveto
-2296.61 1848.67 2315.35 1865.05 2336 1875.57 curveto
-2493.33 1955.73 2553.43 1926.57 2730 1926.57 curveto
-2730 1926.57 2730 1926.57 5432 1926.57 curveto
-6143.15 1926.57 6320.85 1910.57 7032 1910.57 curveto
-7032 1910.57 7032 1910.57 8232 1910.57 curveto
-8677.37 1910.57 9804.69 1907.11 10232 1781.57 curveto
-10240.78 1778.99 10241.25 1774.24 10250 1771.57 curveto
-10343.44 1743.11 10601.57 1780.08 10688 1734.57 curveto
-10931.42 1606.42 10944.07 1494.73 11080 1255.57 curveto
-11096.97 1225.72 11110.71 1190.38 11120.9 1159.6 curveto
-stroke
-0 0 0 edgecolor
-newpath 11124.33 1160.37 moveto
-11124.08 1149.77 lineto
-11117.67 1158.21 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11124.33 1160.37 moveto
-11124.08 1149.77 lineto
-11117.67 1158.21 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6834 1915.97 moveto 396 (FF: [3,9,18,22,28,30,33,34,35,44,51,57,64,68,73,74,95]) alignedtext
-grestore
-% CCG->CCG
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 2190.67 1831.64 moveto
-2196.73 1842.27 2210.84 1849.57 2233 1849.57 curveto
-2249.27 1849.57 2261.21 1845.63 2268.8 1839.33 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 2271.52 1841.53 moveto
-2275.33 1831.64 lineto
-2266.19 1837 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 2271.52 1841.53 moveto
-2275.33 1831.64 lineto
-2266.19 1837 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2124.5 1854.97 moveto 217 (FR: [5,7,15,21,23,37,40,48,96]) alignedtext
-grestore
-% CCG->CCC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 2253.89 1831.62 moveto
-2269.92 1870.21 2296.16 1916.23 2336 1940.57 curveto
-2410.85 1986.31 2642.28 1964.57 2730 1964.57 curveto
-2730 1964.57 2730 1964.57 5432 1964.57 curveto
-6555.56 1964.57 6836.44 1954.57 7960 1954.57 curveto
-7960 1954.57 7960 1954.57 8742 1954.57 curveto
-9412.46 1954.57 9579.73 1978.54 10250 1994.57 curveto
-10412.7 1998.46 10604.28 2002.37 10701.85 2004.31 curveto
-stroke
-0 1 1 edgecolor
-newpath 10702.07 2007.82 moveto
-10712.14 2004.52 lineto
-10702.21 2000.82 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 10702.07 2007.82 moveto
-10712.14 2004.52 lineto
-10702.21 2000.82 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6586.5 1964.97 moveto 205 (RR: [3,20,28,35,44,51,73,95]) alignedtext
-grestore
-% CCG->ACC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 2286.57 1783.14 moveto
-2302.36 1787.48 2319.75 1791.73 2336 1794.57 curveto
-2509.06 1824.86 2554.31 1826.57 2730 1826.57 curveto
-2730 1826.57 2730 1826.57 5432 1826.57 curveto
-6854.41 1826.57 7239.15 1965.73 8628 1658.57 curveto
-8844.55 1610.68 8887.73 1559.81 9102 1502.57 curveto
-9238.21 1466.19 9400.29 1435.54 9490.83 1419.53 curveto
-stroke
-0 1 1 edgecolor
-newpath 9491.47 1422.97 moveto
-9500.71 1417.79 lineto
-9490.25 1416.08 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 9491.47 1422.97 moveto
-9500.71 1417.79 lineto
-9490.25 1416.08 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5801.5 1843.97 moveto 219 (RR: [5,7,15,21,23,37,40,48,56]) alignedtext
-grestore
-% GCC
-gsave
-0 0 0.75294 nodecolor
-newpath 1597 1586.57 moveto
-1597 1716.57 lineto
-1681 1716.57 lineto
-1681 1586.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1586.57 moveto
-1597 1716.57 lineto
-1681 1716.57 lineto
-1681 1586.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1623.5 1699.97 moveto 31 (GCC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1690.57 moveto
-1681 1690.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1605 1673.97 moveto 68 (5':[40,39]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1664.57 moveto
-1681 1664.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1619 1647.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1638.57 moveto
-1681 1638.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1623 1621.97 moveto 32 (34.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1612.57 moveto
-1681 1612.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1623.5 1595.97 moveto 31 (GCC) alignedtext
-grestore
-% CCG->GCC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 2179.32 1716.88 moveto
-2164.36 1705.68 2147.41 1695.16 2130 1688.57 curveto
-1978.91 1631.41 1783.35 1638.48 1691.29 1646.1 curveto
-stroke
-0 1 1 edgecolor
-newpath 1690.77 1642.63 moveto
-1681.11 1646.98 lineto
-1691.38 1649.6 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 1690.77 1642.63 moveto
-1681.11 1646.98 lineto
-1691.38 1649.6 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1891 1693.97 moveto 196 (RR: [5,7,15,21,23,40,48,96]) alignedtext
-grestore
-% CCG->CGC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 2286.71 1748.46 moveto
-2377.1 1719.65 2565.85 1666.57 2730 1666.57 curveto
-2730 1666.57 2730 1666.57 5432 1666.57 curveto
-6142.22 1666.57 7918.62 1693.17 8628 1658.57 curveto
-8721.64 1654.01 8744.8 1648.77 8838 1638.57 curveto
-9248.45 1593.66 9350.2 1575.06 9760 1524.57 curveto
-9908.44 1506.28 9950.45 1525.55 10094 1483.57 curveto
-10342.84 1410.8 10613.91 1254.63 10719.9 1190.24 curveto
-stroke
-0 0 0 edgecolor
-newpath 10722.03 1193.04 moveto
-10728.74 1184.84 lineto
-10718.38 1187.06 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10722.03 1193.04 moveto
-10728.74 1184.84 lineto
-10718.38 1187.06 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6617 1678.97 moveto 144 (FF: [11,16,82,85,93]) alignedtext
-grestore
-% CCA->GGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 5868.85 832.68 moveto
-5811.28 855.42 5704.41 895.42 5610 918.57 curveto
-5446.7 958.62 5402.32 950.89 5236 975.57 curveto
-4857.55 1031.73 4764.5 1058.61 4384 1098.57 curveto
-3685.87 1171.89 3507.85 1148.08 2808 1202.57 curveto
-2805.45 1202.77 2802.85 1202.98 2800.23 1203.19 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 2799.71 1199.72 moveto
-2790.03 1204.04 lineto
-2800.29 1206.7 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 2799.71 1199.72 moveto
-2790.03 1204.04 lineto
-2800.29 1206.7 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4055 1143.97 moveto 204 (RF: [2,10,14,43,49,54,63,75]) alignedtext
-grestore
-% CCA->CAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 5953.24 809.1 moveto
-6011.35 800.55 6119.3 785.94 6212 780.57 curveto
-6362.7 771.84 6540.63 775.54 6630.61 778.4 curveto
-stroke
-0 0 0 edgecolor
-newpath 6630.77 781.91 moveto
-6640.88 778.73 lineto
-6631 774.91 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 6630.77 781.91 moveto
-6640.88 778.73 lineto
-6631 774.91 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6284.5 785.97 moveto 211 (FF: [2,10,14,43,54,63,75,100]) alignedtext
-grestore
-% CCA->GCC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 5868.58 815.2 moveto
-5569.88 812.67 3778.9 799.3 3236 837.57 curveto
-2833.46 865.95 2729.4 867.66 2336 957.57 curveto
-2113.49 1008.43 2013.87 960.78 1848 1117.57 curveto
-1715.79 1242.54 1665.84 1461.19 1648.07 1576.1 curveto
-stroke
-0 1 1 edgecolor
-newpath 1644.58 1575.81 moveto
-1646.55 1586.22 lineto
-1651.5 1576.85 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 1644.58 1575.81 moveto
-1646.55 1586.22 lineto
-1651.5 1576.85 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3254 842.97 moveto 192 (RR: [19,26,31,50,69,90,92]) alignedtext
-grestore
-% CCA->ACT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 5868.7 809.96 moveto
-5810.52 802.4 5702.48 788.93 5610 780.57 curveto
-5452.09 766.3 5410.42 783.5 5254 757.57 curveto
-5197.43 748.2 5134.45 730.45 5090.06 716.68 curveto
-stroke
-0 0 0 edgecolor
-newpath 5090.91 713.28 moveto
-5080.32 713.63 lineto
-5088.82 719.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 5090.91 713.28 moveto
-5080.32 713.63 lineto
-5088.82 719.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5254.5 785.97 moveto 355 (FF: [1,3,4,8,20,26,27,31,41,42,50,51,67,69,78,86]) alignedtext
-grestore
-% CCC->GGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10712.1 1968.93 moveto
-10704.27 1964.86 10696.11 1961.23 10688 1958.57 curveto
-9903.38 1701.66 9661.84 1844.59 8838 1790.57 curveto
-7326.98 1691.5 6946.26 1704.57 5432 1704.57 curveto
-3147 1704.57 3147 1704.57 3147 1704.57 curveto
-2977.24 1704.57 2912.87 1662.07 2808 1528.57 curveto
-2778.59 1491.13 2754.35 1366.74 2741.06 1284.81 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 2744.49 1284.11 moveto
-2739.45 1274.79 lineto
-2737.58 1285.22 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 2744.49 1284.11 moveto
-2739.45 1274.79 lineto
-2737.58 1285.22 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6923.5 1717.97 moveto 217 (RF: [1,3,20,28,35,44,51,67,95]) alignedtext
-grestore
-% CCC->CCG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 10712.25 2031.1 moveto
-10704.26 2034.07 10696.02 2036.7 10688 2038.57 curveto
-10464.28 2090.75 10401.72 2068.57 10172 2068.57 curveto
-8970 2068.57 8970 2068.57 8970 2068.57 curveto
-8571.61 2068.57 8472.29 2051.37 8074 2042.57 curveto
-6899.93 2016.65 6606.36 2002.57 5432 2002.57 curveto
-2730 2002.57 2730 2002.57 2730 2002.57 curveto
-2554.56 2002.57 2481.81 2076.13 2336 1978.57 curveto
-2289.47 1947.44 2263.25 1889.02 2248.93 1841.39 curveto
-stroke
-0 0 0 edgecolor
-newpath 2252.27 1840.34 moveto
-2246.14 1831.71 lineto
-2245.55 1842.28 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 2252.27 1840.34 moveto
-2246.14 1831.71 lineto
-2245.55 1842.28 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6588 2017.97 moveto 202 (FF: [3,20,28,35,44,51,73,95]) alignedtext
-grestore
-% CCC->GCC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10712.49 2055.02 moveto
-10704.66 2060.55 10696.4 2065.62 10688 2069.57 curveto
-10476.59 2169.15 10405.69 2170.57 10172 2170.57 curveto
-8232 2170.57 8232 2170.57 8232 2170.57 curveto
-7492.39 2170.57 7307.6 2154.8 6568 2149.57 curveto
-6276.01 2147.51 6203 2148.57 5911 2148.57 curveto
-4708 2148.57 4708 2148.57 4708 2148.57 curveto
-2531.46 2148.57 1872.82 2121.28 1848 2104.57 curveto
-1719.59 2018.11 1668.61 1831.56 1649.53 1726.83 curveto
-stroke
-0 1 1 edgecolor
-newpath 1652.97 1726.2 moveto
-1647.78 1716.96 lineto
-1646.08 1727.42 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 1652.97 1726.2 moveto
-1647.78 1716.96 lineto
-1646.08 1727.42 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6310 2154.97 moveto 160 (RR: [6,36,53,70,76,87]) alignedtext
-grestore
-% CCC->AGG
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10758.54 1940.42 moveto
-10749.67 1895.19 10730.3 1837.67 10688 1806.57 curveto
-10609.38 1748.77 10340.11 1813.02 10250 1775.57 curveto
-10238.22 1770.68 10226.97 1763.26 10216.87 1755.11 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10218.91 1752.25 moveto
-10209.02 1748.44 lineto
-10214.38 1757.58 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10218.91 1752.25 moveto
-10209.02 1748.44 lineto
-10214.38 1757.58 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10367 1811.97 moveto 204 (FR: [6,32,36,53,62,76,84,87]) alignedtext
-grestore
-% ATA->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 8453.78 1325.79 moveto
-8239.97 1326.63 7445.94 1329.62 6792 1330.57 curveto
-6734.75 1330.66 2713.13 1354.22 2670 1316.57 curveto
-2627.39 1279.37 2687.77 1234.4 2652 1190.57 curveto
-2526.94 1037.33 2430.8 1040.57 2233 1040.57 curveto
-1091 1040.57 1091 1040.57 1091 1040.57 curveto
-919.56 1040.57 875.01 1045.34 706 1016.57 curveto
-703.17 1016.09 700.31 1015.57 697.44 1015.01 curveto
-stroke
-0 1 1 edgecolor
-newpath 698.11 1011.57 moveto
-687.6 1012.98 lineto
-696.69 1018.43 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 698.11 1011.57 moveto
-687.6 1012.98 lineto
-696.69 1018.43 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3930.5 1342.97 moveto 453 (RR: [2,14,22,28,29,34,49,55,57,68,73,75,79,81,83,89,94,95,97]) alignedtext
-grestore
-% ATA->TAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 8564.04 1327.09 moveto
-8629.41 1328.55 8741.71 1329.94 8838 1325.57 curveto
-8862.12 1324.48 8888.64 1322.26 8911.55 1320.03 curveto
-stroke
-0 0 0 edgecolor
-newpath 8912.19 1323.49 moveto
-8921.8 1319.01 lineto
-8911.5 1316.52 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 8912.19 1323.49 moveto
-8921.8 1319.01 lineto
-8911.5 1316.52 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8647.5 1332.97 moveto 189 (FF: [49,75,81,83,89,94,97]) alignedtext
-grestore
-% ATA->ATC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 8453.64 1319.51 moveto
-8355.17 1308.04 8154.09 1281.36 8092 1248.57 curveto
-8060.98 1232.19 8032.67 1206.01 8010.29 1181.19 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 8012.78 1178.72 moveto
-8003.54 1173.54 lineto
-8007.53 1183.35 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 8012.78 1178.72 moveto
-8003.54 1173.54 lineto
-8007.53 1183.35 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8092 1312.97 moveto 280 (RF: [22,28,29,34,35,44,55,57,68,73,95]) alignedtext
-grestore
-% ATA->ATA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 8468.75 1390.64 moveto
-8474.51 1401.27 8487.93 1408.57 8509 1408.57 curveto
-8524.14 1408.57 8535.33 1404.8 8542.57 1398.73 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 8545.58 1400.58 moveto
-8549.25 1390.64 lineto
-8540.18 1396.13 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 8545.58 1400.58 moveto
-8549.25 1390.64 lineto
-8540.18 1396.13 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8380 1413.97 moveto 258 (FR: [22,28,29,34,55,57,68,73,79,95]) alignedtext
-grestore
-% ACG->CGA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 11459.58 1083.65 moveto
-11401.93 1083.82 11270.37 1084.2 11195.93 1084.42 curveto
-stroke
-0 0 0 edgecolor
-newpath 11195.81 1080.92 moveto
-11185.82 1084.45 lineto
-11195.83 1087.92 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11195.81 1080.92 moveto
-11185.82 1084.45 lineto
-11195.83 1087.92 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11206 1088.97 moveto 234 (FF: [13,17,18,33,45,59,74,77,98]) alignedtext
-grestore
-% ACG->GAC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11516.43 1066.84 moveto
-11522.08 1064.24 11528.09 1061.97 11534 1060.57 curveto
-11636.95 1036.27 11668.41 1039.18 11772 1060.57 curveto
-11774.97 1061.19 11777.99 1061.98 11780.99 1062.91 curveto
-stroke
-0 1 1 edgecolor
-newpath 11779.85 1066.22 moveto
-11790.44 1066.22 lineto
-11782.17 1059.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 11779.85 1066.22 moveto
-11790.44 1066.22 lineto
-11782.17 1059.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11534.5 1065.97 moveto 237 (RR: [13,17,18,33,45,59,74,77,98]) alignedtext
-grestore
-% CAA->AAT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 12132.96 1146.92 moveto
-12119.65 1395.13 12056.35 2265.57 11823 2265.57 curveto
-7619 2265.57 7619 2265.57 7619 2265.57 curveto
-7072.52 2265.57 6936.48 2227.57 6390 2227.57 curveto
-1091 2227.57 1091 2227.57 1091 2227.57 curveto
-754.09 2227.57 825.97 1889.4 706 1574.57 curveto
-638.3 1396.92 607.75 1173.6 595.73 1059.02 curveto
-stroke
-0 0 0 edgecolor
-newpath 599.2 1058.54 moveto
-594.69 1048.95 lineto
-592.24 1059.26 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 599.2 1058.54 moveto
-594.69 1048.95 lineto
-592.24 1059.26 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6926.5 2263.97 moveto 211 (FF: [22,29,34,55,57,68,73,79]) alignedtext
-grestore
-% CAA->GAC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 12082.36 1081.74 moveto
-12021.16 1081.94 11922.29 1082.26 11865.95 1082.44 curveto
-stroke
-0 1 1 edgecolor
-newpath 11865.6 1078.94 moveto
-11855.61 1082.47 lineto
-11865.62 1085.94 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 11865.6 1078.94 moveto
-11855.61 1082.47 lineto
-11865.62 1085.94 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11907 1086.97 moveto 124 (RR: [29,55,79,89]) alignedtext
-grestore
-% ACC->TAA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 9500.66 1388.01 moveto
-9461.53 1376.04 9409.22 1361.38 9362 1352.57 curveto
-9244.81 1330.71 9105.48 1320.54 9028.48 1316.27 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 9028.22 1312.76 moveto
-9018.04 1315.71 lineto
-9027.84 1319.74 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 9028.22 1312.76 moveto
-9018.04 1315.71 lineto
-9027.84 1319.74 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9164 1357.97 moveto 136 (RF: [7,11,37,40,56]) alignedtext
-grestore
-% ACC->CCG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 9500.71 1445.23 moveto
-9317.51 1555.93 8748.39 1872.57 8232 1872.57 curveto
-7032 1872.57 7032 1872.57 7032 1872.57 curveto
-6320.88 1872.57 6143.12 1880.57 5432 1880.57 curveto
-2730 1880.57 2730 1880.57 2730 1880.57 curveto
-2553.99 1880.57 2500.6 1902.92 2336 1840.57 curveto
-2321.81 1835.2 2307.8 1827.36 2294.9 1818.76 curveto
-stroke
-0 0 0 edgecolor
-newpath 2296.8 1815.83 moveto
-2286.59 1813.03 lineto
-2292.83 1821.59 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 2296.8 1815.83 moveto
-2286.59 1813.03 lineto
-2292.83 1821.59 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5803 1884.97 moveto 216 (FF: [5,7,15,21,23,37,40,48,56]) alignedtext
-grestore
-% GCC->CCG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 1681.03 1665.19 moveto
-1722.94 1678.35 1789.37 1698.09 1848 1710.57 curveto
-1960.06 1734.43 2092.66 1751.26 2169.37 1759.9 curveto
-stroke
-0 0 0 edgecolor
-newpath 2169.03 1763.38 moveto
-2179.36 1761.01 lineto
-2169.81 1756.43 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 2169.03 1763.38 moveto
-2179.36 1761.01 lineto
-2169.81 1756.43 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1892.5 1759.97 moveto 193 (FF: [5,7,15,21,23,40,48,96]) alignedtext
-grestore
-% GCC->CCA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 1648.22 1586.34 moveto
-1666.52 1482.64 1717.6 1281.43 1848 1178.57 curveto
-2014.73 1047.06 2122.67 1175.9 2318 1092.57 curveto
-2327.08 1088.7 2327 1083.61 2336 1079.57 curveto
-2709.8 911.95 2829.11 928.15 3236 880.57 curveto
-3642.61 833.03 3747.62 866.57 4157 866.57 curveto
-4157 866.57 4157 866.57 5032 866.57 curveto
-5346.35 866.57 5722.87 833.66 5858.83 820.72 curveto
-stroke
-0 0 0 edgecolor
-newpath 5859.35 824.18 moveto
-5868.97 819.75 lineto
-5858.68 817.22 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 5859.35 824.18 moveto
-5868.97 819.75 lineto
-5858.68 817.22 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3255.5 885.97 moveto 189 (FF: [19,26,31,50,69,90,92]) alignedtext
-grestore
-% GCC->CCC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 1644.36 1716.64 moveto
-1657.39 1827.65 1701.43 2051.26 1848 2150.57 curveto
-1954.21 2222.54 4028.7 2189.57 4157 2189.57 curveto
-4157 2189.57 4157 2189.57 7032 2189.57 curveto
-7565.4 2189.57 7698.6 2208.57 8232 2208.57 curveto
-8232 2208.57 8232 2208.57 10172 2208.57 curveto
-10401.58 2208.57 10498.93 2314.8 10688 2184.57 curveto
-10722.47 2160.83 10741.83 2118.35 10752.64 2080.74 curveto
-stroke
-0 0 0 edgecolor
-newpath 10756.1 2081.35 moveto
-10755.34 2070.78 lineto
-10749.35 2079.52 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10756.1 2081.35 moveto
-10755.34 2070.78 lineto
-10749.35 2079.52 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6311.5 2194.97 moveto 157 (FF: [6,36,53,70,76,87]) alignedtext
-grestore
-% GCC->AGG
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 1651.83 1716.77 moveto
-1674 1810.46 1729.07 1980.87 1848 2062.57 curveto
-1989.8 2159.98 2060.97 2102.57 2233 2102.57 curveto
-2233 2102.57 2233 2102.57 5432 2102.57 curveto
-6852.47 2102.57 7211.37 2186.99 8628 2082.57 curveto
-9126.71 2045.81 9251.6 2022.42 9742 1924.57 curveto
-9900.46 1892.95 9963.88 1929.39 10094 1833.57 curveto
-10112.32 1820.08 10127.3 1800.87 10139.05 1781.5 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10142.22 1783.01 moveto
-10144.22 1772.61 lineto
-10136.17 1779.49 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10142.22 1783.01 moveto
-10144.22 1772.61 lineto
-10136.17 1779.49 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5827 2115.97 moveto 168 (FR: [12,24,39,58,61,88]) alignedtext
-grestore
-% GCC->ATG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 1596.71 1651.37 moveto
-1515.18 1650.22 1330.95 1643.91 1180 1611.57 curveto
-1177.32 1611 1174.61 1610.37 1171.88 1609.69 curveto
-stroke
-0 1 1 edgecolor
-newpath 1172.53 1606.24 moveto
-1161.96 1607.03 lineto
-1170.72 1613 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 1172.53 1606.24 moveto
-1161.96 1607.03 lineto
-1170.72 1613 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1180 1648.97 moveto 250 (RR: [5,13,15,17,21,23,48,59,96,98]) alignedtext
-grestore
-% GCC->AGC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 1657.37 1586.4 moveto
-1684.84 1500.71 1744.75 1351.16 1848 1266.57 curveto
-2017.1 1128.04 2129.17 1231.71 2318 1121.57 curveto
-2327.51 1116.03 2326.14 1109.46 2336 1104.57 curveto
-2431.25 1057.35 2702.11 1036.05 2808 1026.57 curveto
-2826.76 1024.89 8213.16 946.57 8232 946.57 curveto
-8232 946.57 8232 946.57 9561 946.57 curveto
-9758.26 946.57 9989.35 912.66 10102.47 893.82 curveto
-stroke
-0 1 1 edgecolor
-newpath 10103.1 897.27 moveto
-10112.38 892.16 lineto
-10101.94 890.36 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 10103.1 897.27 moveto
-10112.38 892.16 lineto
-10101.94 890.36 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5628.5 988.97 moveto 565 (RR: [6,12,19,24,25,26,31,36,46,50,53,58,60,61,69,70,72,76,80,87,88,90,92,99]) alignedtext
-grestore
-% AGG->AAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10134.74 1705.54 moveto
-9846.38 1690.01 7940.31 1590.57 6390 1590.57 curveto
-5032 1590.57 5032 1590.57 5032 1590.57 curveto
-4808.08 1590.57 4710.28 1519.73 4606 1321.57 curveto
-4552.43 1219.79 4515.77 882.7 4501.57 730.86 curveto
-stroke
-0 1 1 edgecolor
-newpath 4505.03 730.33 moveto
-4500.62 720.7 lineto
-4498.06 730.98 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 4505.03 730.33 moveto
-4500.62 720.7 lineto
-4498.06 730.98 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7494 1616.97 moveto 250 (RR: [6,32,36,47,52,53,62,76,84,87]) alignedtext
-grestore
-% AGG->CCC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10209.23 1698.68 moveto
-10301.8 1678.93 10545.21 1641.79 10688 1757.57 curveto
-10715.12 1779.56 10737.95 1865.56 10751.77 1930.17 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10748.43 1931.27 moveto
-10753.91 1940.34 lineto
-10755.28 1929.83 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10748.43 1931.27 moveto
-10753.91 1940.34 lineto
-10755.28 1929.83 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10367 1762.97 moveto 204 (FR: [6,32,36,53,62,76,84,87]) alignedtext
-grestore
-% AGG->GCC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10134.87 1715.45 moveto
-10061.02 1731.91 9891.54 1773.72 9760 1836.57 curveto
-9751.32 1840.72 9751.02 1845.26 9742 1848.57 curveto
-9554.89 1917.32 8159.34 2056.57 7960 2056.57 curveto
-7032 2056.57 7032 2056.57 7032 2056.57 curveto
-6320.88 2056.57 6143.12 2048.57 5432 2048.57 curveto
-2233 2048.57 2233 2048.57 2233 2048.57 curveto
-1995.28 2048.57 1780.58 1826.07 1687.67 1714.21 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 1690.25 1711.85 moveto
-1681.19 1706.36 lineto
-1684.85 1716.3 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 1690.25 1711.85 moveto
-1681.19 1706.36 lineto
-1684.85 1716.3 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5827 2056.97 moveto 168 (FR: [12,24,39,58,61,88]) alignedtext
-grestore
-% AGG->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10164.18 1642.26 moveto
-10152.86 1558.39 10129.3 1419.27 10094 1382.57 curveto
-9987.09 1271.43 9907.55 1333.41 9760 1288.57 curveto
-9712.13 1274.03 9658.21 1256.33 9618.58 1243.08 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 9619.67 1239.75 moveto
-9609.08 1239.89 lineto
-9617.45 1246.39 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 9619.67 1239.75 moveto
-9609.08 1239.89 lineto
-9617.45 1246.39 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9832 1387.97 moveto 190 (RF: [12,24,38,39,61,88,91]) alignedtext
-grestore
-% ATG->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 1020.16 1560.08 moveto
-933.6 1531.44 788.51 1471.21 706 1369.57 curveto
-632.42 1278.93 605.06 1142.63 594.92 1058.59 curveto
-stroke
-0 1 1 edgecolor
-newpath 598.39 1058.14 moveto
-593.76 1048.61 lineto
-591.43 1058.95 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 598.39 1058.14 moveto
-593.76 1048.61 lineto
-591.43 1058.95 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-706.5 1557.97 moveto 295 (RR: [5,13,15,17,21,23,45,48,59,77,96,98]) alignedtext
-grestore
-% ATG->GCC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 1161.61 1577.11 moveto
-1230.53 1574.98 1338.13 1574.99 1430 1589.57 curveto
-1484.85 1598.28 1545.49 1617.38 1587.26 1632.09 curveto
-stroke
-0 0 0 edgecolor
-newpath 1586.33 1635.48 moveto
-1596.93 1635.54 lineto
-1588.68 1628.88 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 1586.33 1635.48 moveto
-1596.93 1635.54 lineto
-1588.68 1628.88 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1215 1594.97 moveto 180 (FF: [5,15,21,23,48,59,96]) alignedtext
-grestore
-% AGC->AAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10156.74 816.33 moveto
-10142.08 759.63 10118.58 683.67 10094 664.57 curveto
-10035.13 618.82 9833.71 643.81 9760 632.57 curveto
-9302.95 562.86 9204.33 418.57 8742 418.57 curveto
-6390 418.57 6390 418.57 6390 418.57 curveto
-6377.58 418.57 4617.34 543.51 4606 548.57 curveto
-4587.41 556.87 4570.07 569.68 4554.88 583.59 curveto
-stroke
-0 1 1 edgecolor
-newpath 4552.44 581.08 moveto
-4547.59 590.5 lineto
-4557.26 586.16 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 4552.44 581.08 moveto
-4547.59 590.5 lineto
-4557.26 586.16 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7489.5 423.97 moveto 259 (RR: [32,38,39,47,52,62,71,84,88,91]) alignedtext
-grestore
-% AGC->CTC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10231.85 862.41 moveto
-10237.96 860.68 10244.08 859.03 10250 857.57 curveto
-10442.29 810.15 10543.51 911.02 10688 775.57 curveto
-10721.23 744.42 10744.18 624.82 10756.2 544.69 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10759.68 545.04 moveto
-10757.68 534.64 lineto
-10752.76 544.02 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10759.68 545.04 moveto
-10757.68 534.64 lineto
-10752.76 544.02 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10250 862.97 moveto 438 (RF: [6,10,25,36,43,46,53,54,58,63,65,66,70,76,80,87,99,100]) alignedtext
-grestore
-% AGC->CAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10112.23 853.16 moveto
-10106.17 850.99 10100.02 849.07 10094 847.57 curveto
-9863.44 790.19 9798.59 806.57 9561 806.57 curveto
-7332 806.57 7332 806.57 7332 806.57 curveto
-7099.92 806.57 7041.63 807.14 6810 792.57 curveto
-6789.55 791.29 6767.21 789.25 6747.35 787.22 curveto
-stroke
-0 1 1 edgecolor
-newpath 6747.53 783.72 moveto
-6737.22 786.16 lineto
-6746.8 790.68 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 6747.53 783.72 moveto
-6737.22 786.16 lineto
-6746.8 790.68 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8390.5 811.97 moveto 237 (RR: [19,26,31,50,60,69,72,90,92]) alignedtext
-grestore
-% AGC->GCC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 10112.42 921.84 moveto
-10106.37 924.82 10100.17 927.48 10094 929.57 curveto
-9868.49 1006.12 9799.15 984.57 9561 984.57 curveto
-8232 984.57 8232 984.57 8232 984.57 curveto
-7865.88 984.57 7765.54 951.18 7410 1038.57 curveto
-7336.38 1056.67 7328.12 1091.63 7254 1107.57 curveto
-7104.96 1139.63 6720.45 1112.02 6568 1112.57 curveto
-6409.78 1113.15 6370.22 1113.39 6212 1112.57 curveto
-5952.43 1111.24 5887.53 1110.83 5628 1106.57 curveto
-5075.05 1097.51 4936.99 1084.79 4384 1078.57 curveto
-4182.23 1076.3 4131.75 1075.52 3930 1078.57 curveto
-3431.16 1086.13 3306.59 1094.98 2808 1112.57 curveto
-2703.09 1116.27 2425.9 1077.38 2336 1131.57 curveto
-2322.36 1139.8 2328.7 1150.77 2318 1162.57 curveto
-2120.7 1380.24 1811.39 1559.17 1690.17 1624.73 curveto
-stroke
-0 0 0 edgecolor
-newpath 1688.23 1621.79 moveto
-1681.08 1629.62 lineto
-1691.54 1627.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 1688.23 1621.79 moveto
-1681.08 1629.62 lineto
-1691.54 1627.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5630 1116.97 moveto 562 (FF: [6,12,19,24,25,26,31,36,46,50,53,58,60,61,69,70,72,76,80,87,88,90,92,99]) alignedtext
-grestore
-% AGC->AGC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10129.67 946.64 moveto
-10135.73 957.27 10149.84 964.57 10172 964.57 curveto
-10188.27 964.57 10200.21 960.63 10207.8 954.33 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10210.52 956.53 moveto
-10214.33 946.64 lineto
-10205.19 952 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10210.52 956.53 moveto
-10214.33 946.64 lineto
-10205.19 952 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10061 969.97 moveto 222 (FR: [10,24,43,58,63,65,99,100]) alignedtext
-grestore
-% AGC->CGC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10229.87 946.82 moveto
-10236.32 952.24 10243.07 957.28 10250 961.57 curveto
-10423.84 1069.29 10506.56 1008.22 10688 1102.57 curveto
-10699.17 1108.38 10710.42 1115.78 10720.76 1123.35 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10718.75 1126.22 moveto
-10728.84 1129.44 lineto
-10722.96 1120.63 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10718.75 1126.22 moveto
-10728.84 1129.44 lineto
-10722.96 1120.63 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10306.5 1107.97 moveto 325 (FR: [16,32,38,39,47,52,62,71,82,84,85,91,93]) alignedtext
-grestore
-% AGC->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10138.09 946.78 moveto
-10126.08 965.33 10111.21 984.33 10094 998.57 curveto
-9946.67 1120.44 9723.74 1185.48 9619.1 1210.82 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 9618.26 1207.42 moveto
-9609.35 1213.15 lineto
-9619.89 1214.23 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 9618.26 1207.42 moveto
-9609.35 1213.15 lineto
-9619.89 1214.23 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9760 1172.97 moveto 334 (RF: [12,16,24,43,58,61,65,82,85,88,93,99,100]) alignedtext
-grestore
-% CGC->CGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10803.39 1165.21 moveto
-10863.92 1169.61 10986.08 1172.33 11080 1134.57 curveto
-11083.24 1133.27 11086.45 1131.74 11089.59 1130.03 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 11091.5 1132.97 moveto
-11098.28 1124.82 lineto
-11087.9 1126.97 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 11091.5 1132.97 moveto
-11098.28 1124.82 lineto
-11087.9 1126.97 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10844.5 1172.97 moveto 235 (RF: [32,38,39,47,52,62,71,84,91]) alignedtext
-grestore
-% CGC->CCG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10728.77 1160.56 moveto
-10567.79 1156.14 9915.47 1137.6 9380 1113.57 curveto
-8799.26 1087.51 8655.11 1057.58 8074 1041.57 curveto
-7972.71 1038.78 7947.02 1033.6 7846 1041.57 curveto
-7580.42 1062.53 7519.43 1112.74 7254 1135.57 curveto
-5403.92 1294.72 4932.44 1075.03 3076 1116.57 curveto
-2993.39 1118.42 2394.83 1132.55 2336 1190.57 curveto
-2331.53 1194.98 2272.49 1536.39 2245.86 1691.44 curveto
-stroke
-0 1 1 edgecolor
-newpath 2242.4 1690.93 moveto
-2244.16 1701.38 lineto
-2249.3 1692.11 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 2242.4 1690.93 moveto
-2244.16 1701.38 lineto
-2249.3 1692.11 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6615.5 1184.97 moveto 147 (RR: [11,16,82,85,93]) alignedtext
-grestore
-% CGC->AGC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10751.21 1096.33 moveto
-10736.67 1038.27 10713.05 959.52 10688 939.57 curveto
-10620.69 885.98 10366.87 880.06 10242.11 880.52 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10241.88 877.02 moveto
-10231.9 880.57 lineto
-10241.91 884.02 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10241.88 877.02 moveto
-10231.9 880.57 lineto
-10241.91 884.02 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10306.5 944.97 moveto 325 (FR: [16,32,38,39,47,52,62,71,82,84,85,91,93]) alignedtext
-grestore
-% CTA->TAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 9512.88 1233.55 moveto
-9472.66 1241.71 9413.74 1253.21 9362 1261.57 curveto
-9243.79 1280.68 9104.69 1297.89 9028.04 1306.92 curveto
-stroke
-0 0 0 edgecolor
-newpath 9027.63 1303.44 moveto
-9018.1 1308.08 lineto
-9028.44 1310.39 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 9027.63 1303.44 moveto
-9018.1 1308.08 lineto
-9028.44 1310.39 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9104 1301.97 moveto 256 (FF: [12,16,38,39,61,71,82,88,91,93]) alignedtext
-grestore
-% CTA->AGG
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 9609.33 1240.98 moveto
-9650.56 1258.27 9708.35 1288.71 9742 1333.57 curveto
-9760.5 1358.24 9740.92 1376.35 9760 1400.57 curveto
-9864.6 1533.38 9970.99 1466.61 10094 1582.57 curveto
-10109.52 1597.2 10123.2 1615.55 10134.59 1633.66 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10131.8 1635.8 moveto
-10140 1642.51 lineto
-10137.77 1632.15 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10131.8 1635.8 moveto
-10140 1642.51 lineto
-10137.77 1632.15 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9832 1587.97 moveto 190 (RF: [12,24,38,39,61,88,91]) alignedtext
-grestore
-% CTA->AGC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 9609.32 1237.29 moveto
-9711.78 1263.18 9952.96 1306.74 10094 1189.57 curveto
-10129.4 1160.16 10151.79 1038.24 10163.09 956.9 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10166.6 957.07 moveto
-10164.48 946.69 lineto
-10159.66 956.13 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10166.6 957.07 moveto
-10164.48 946.69 lineto
-10159.66 956.13 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9760 1271.97 moveto 334 (RF: [12,16,24,43,58,61,65,82,85,88,93,99,100]) alignedtext
-grestore
-% CTA->CTA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 9512.57 1250.35 moveto
-9484.96 1277.05 9501.1 1306.57 9561 1306.57 curveto
-9615.28 1306.57 9633.63 1282.32 9616.04 1257.9 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 9618.65 1255.57 moveto
-9609.43 1250.35 lineto
-9613.38 1260.18 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 9618.65 1255.57 moveto
-9609.43 1250.35 lineto
-9613.38 1260.18 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9461.5 1311.97 moveto 199 (FR: [12,24,58,61,65,99,100]) alignedtext
-grestore
-% ACT->AAG
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 4983.92 697.07 moveto
-4904.84 695.8 4742.47 691.33 4606 675.57 curveto
-4603.45 675.28 4600.86 674.96 4598.26 674.62 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 4598.52 671.13 moveto
-4588.14 673.24 lineto
-4597.57 678.06 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 4598.52 671.13 moveto
-4588.14 673.24 lineto
-4597.57 678.06 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4606 696.97 moveto 204 (FR: [8,31,42,50,66,69,78,86]) alignedtext
-grestore
-% ACT->TCA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 5080.04 696.97 moveto
-5372.53 693.28 6913.07 673.85 7261.78 669.46 curveto
-stroke
-0 1 1 edgecolor
-newpath 7262.04 672.95 moveto
-7271.99 669.33 lineto
-7261.95 665.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 7262.04 672.95 moveto
-7271.99 669.33 lineto
-7261.95 665.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6296.5 687.97 moveto 187 (RR: [1,3,4,20,27,41,51,67]) alignedtext
-grestore
-% ACT->CTC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 5080.38 690.07 moveto
-5125.26 683.4 5193.99 673.89 5254 668.57 curveto
-6511.79 557.14 6830.09 580.71 8092 535.57 curveto
-9127.32 498.54 10388.88 475.93 10696.12 470.73 curveto
-stroke
-0 0 0 edgecolor
-newpath 10696.28 474.23 moveto
-10706.22 470.56 lineto
-10696.16 467.23 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10696.28 474.23 moveto
-10706.22 470.56 lineto
-10696.16 467.23 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8117.5 540.97 moveto 229 (FF: [1,3,4,20,27,35,41,44,51,67]) alignedtext
-grestore
-% ACT->CCA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 5080.05 701.98 moveto
-5124.99 706.03 5194.02 712.07 5254 716.57 curveto
-5412.11 728.44 5453.37 714.95 5610 739.57 curveto
-5698.58 753.5 5799.16 781.42 5858.73 799.27 curveto
-stroke
-0 1 1 edgecolor
-newpath 5858.06 802.72 moveto
-5868.64 802.26 lineto
-5860.08 796.02 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 5858.06 802.72 moveto
-5868.64 802.26 lineto
-5860.08 796.02 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5307 744.97 moveto 250 (RR: [8,19,26,31,42,50,69,78,86,92]) alignedtext
-grestore
-endpage
-showpage
-grestore
-%%PageTrailer
-%%EndPage: 1
-%%Trailer
-%%Pages: 1
-%%BoundingBox: 36 36 12234 2334
-end
-restore
-%%EOF
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/txt b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/txt
deleted file mode 100755
index 334f3e9..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/txt
+++ /dev/null
@@ -1,27 +0,0 @@
-AAA	{[{AAA:[93]},{AAG:[81,83,89,93,94,97]},{AAT:[2,4,9,14,27,30,41,49,64,75,81,83,94,97]}]	[]	[]	[{AAA:[93]},{GAA:[1,2,4,9,14,27,30,41,49,54,64,67,75,81,83,94,97]},{TAA:[49,81,83,89,93,94,97]}]	{5':[], ~5':[(1-0_0),(49-0_0),(54-0_0),(67-0_0)]}	AAA	25.0x}
-GAA	{[{AAA:[1,2,4,9,14,27,30,41,49,54,64,67,75,81,83,94,97]},{AAG:[8,25,32,36,42,46,47,52,53,62,66,71,76,78,80,84,86,87]},{AAT:[13,15,17,23,33,45,48,59,77,96,98]}]	[]	[{TCA:[1,4,20,27,30,41,64,67]}]	[{AGA:[8,25,42,46,66,70,78,80,86]},{CGA:[13,17,32,33,38,45,47,52,59,62,71,76,77,84,91,96,98]},{GGA:[2,10,14,49,54,63,75,81,94,97]}]	{5':[(36-0_0),(53-0_0)], ~5':[(38-0_0),(63-0_0),(70-0_0),(91-0_0)]}	GAA	52.0x}
-AGA	{[{GAA:[8,25,42,46,66,70,78,80,86]},{GAC:[29,79,89]}]	[{CTC:[10,43,54,63,65,99,100]}]	[]	[{AAG:[79,83,89]},{CAG:[2,8,10,14,25,42,43,46,54,63,65,66,70,78,80,86,100]}]	{5':[(29-0_0),(99-0_0)], ~5':[(14-0_0),(83-0_0)]}	AGA	22.0x}
-GGA	{[{GAA:[2,10,14,49,54,63,75,81,94,97]},{GAC:[9,13,17,18,33,45,74,77,98]}]	[{ATC:[11,16,37,56,82,85]},{CTC:[1,3,4,20,35,44,51,67]}]	[{CCA:[2,10,14,43,49,54,63,75]},{CCC:[1,3,20,28,35,44,51,67,95]},{CCG:[9,11,16,18,30,33,45,56,64,74,77,82,85]}]	[]	{5':[(4-0_0),(17-0_0),(37-0_0),(81-0_0)], ~5':[(28-0_0),(30-0_0),(64-0_0)]}	GGA	38.0x}
-ATA	{[{TAA:[49,75,81,83,89,94,97]}]	[{ATA:[22,28,29,34,55,57,68,73,79,95]}]	[{ATC:[22,28,29,34,35,44,55,57,68,73,95]}]	[{AAT:[2,14,22,28,29,34,49,55,57,68,73,75,79,81,83,89,94,95,97]}]	{5':[(79-0_0)], ~5':[(2-0_0),(35-0_0),(44-0_0)]}	ATA	31.0x}
-GAC	{[{CAA:[22,29,34,55,57,68,79]},{ACG:[13,17,18,33,45,59,74,77,98]}]	[]	[]	[{AGA:[29,79,89]},{GGA:[9,13,17,18,33,45,74,77,98]}]	{5':[(59-0_0)], ~5':[(9-0_0)]}	GAC	14.0x}
-ACC	{[{CCG:[5,7,15,21,23,37,40,48,56]}]	[]	[{TAA:[7,11,37,40,56]}]	[]	{5':[(5-0_0),(15-1_0),(23-1_0),(48-1_0)], ~5':[]}	TACC	8.5x}
-GCC	{[{CCA:[19,26,31,50,69,90,92]},{CCC:[6,36,53,70,76,87]},{CCG:[5,7,15,21,23,40,48,96]}]	[{AGG:[12,24,39,58,61,88]}]	[]	[{AGC:[6,12,19,24,25,26,31,36,46,50,53,58,60,61,69,70,72,76,80,87,88,90,92,99]},{ATG:[5,13,15,17,21,23,48,59,96,98]}]	{5':[(39-0_0),(40-0_0)], ~5':[]}	GCC	34.0x}
-AGC	{[{GCC:[6,12,19,24,25,26,31,36,46,50,53,58,60,61,69,70,72,76,80,87,88,90,92,99]}]	[{AGC:[10,24,43,58,63,65,99,100]},{CGC:[16,32,38,39,47,52,62,71,82,84,85,91,93]}]	[{CTA:[12,16,24,43,58,61,65,82,85,88,93,99,100]},{CTC:[6,10,25,36,43,46,53,54,58,63,65,66,70,76,80,87,99,100]}]	[{AAG:[32,38,39,47,52,62,71,84,88,91]},{CAG:[19,26,31,50,60,69,72,90,92]}]	{5':[(10-0_0),(24-0_0)], ~5':[(61-0_0),(66-0_0),(88-0_0)]}	AGC	59.0x}
-ATC	{[{TCA:[19,26,60,72,90,92]}]	[{CGA:[9,18,22,28,30,34,35,44,55,57,64,68,73,74,95]},{GGA:[11,16,37,56,82,85]}]	[{ATA:[22,28,29,34,35,44,55,57,68,73,95]},{ATC:[19,60,72,90,92]}]	[{AAT:[7,9,11,16,18,27,30,37,40,41,56,64,74,82,85]}]	{5':[], ~5':[(7-0_0),(19-0_0)]}	ATC	37.0x}
-AAG	{[{AGA:[79,83,89]},{AGC:[32,38,39,47,52,62,71,84,88,91]},{AGG:[6,32,36,47,52,53,62,76,84,87]}]	[{ACT:[8,31,42,50,66,69,78,86]}]	[]	[{AAA:[81,83,89,93,94,97]},{GAA:[8,25,32,36,42,46,47,52,53,62,66,71,76,78,80,84,86,87]},{TAA:[38,39,47,52,71,88,91]}]	{5':[(6-0_0),(50-0_0),(62-0_0)], ~5':[(25-0_0),(46-0_0),(71-0_0),(80-0_0),(94-0_0),(97-0_0)]}	AAG	39.0x}
-ACG	{[{CGA:[13,17,18,33,45,59,74,77,98]}]	[]	[]	[{GAC:[13,17,18,33,45,59,74,77,98]}]	{5':[], ~5':[]}	ACG	9.0x}
-AGG	{[]	[{CCC:[6,32,36,53,62,76,84,87]},{GCC:[12,24,39,58,61,88]}]	[{CTA:[12,24,38,39,61,88,91]}]	[{AAG:[6,32,36,47,52,53,62,76,84,87]}]	{5':[], ~5':[(52-0_0)]}	AGG	18.0x}
-ATG	{[{GCC:[5,15,21,23,48,59,96]}]	[]	[]	[{AAT:[5,13,15,17,21,23,45,48,59,77,96,98]}]	{5':[], ~5':[(13-1_0),(45-0_0),(77-0_0),(98-1_0)]}	ATGC	11.0x}
-AAT	{[{ATA:[2,14,22,28,29,34,49,55,57,68,73,75,79,81,83,89,94,95,97]},{ATC:[7,9,11,16,18,27,30,37,40,41,56,64,74,82,85]},{ATG:[5,13,15,17,21,23,45,48,59,77,96,98]}]	[]	[]	[{AAA:[2,4,9,14,27,30,41,49,64,75,81,83,94,97]},{CAA:[22,29,34,55,57,68,73,79]},{GAA:[13,15,17,23,33,45,48,59,77,96,98]},{TAA:[7,11,37,40,56,85]}]	{5':[(16-0_0),(18-0_0),(21-0_0),(74-0_0),(82-0_0),(89-0_0),(95-0_0)], ~5':[(33-0_0)]}	AAT	48.0x}
-ACT	{[{CTC:[1,3,4,20,27,35,41,44,51,67]}]	[{AAG:[8,31,42,50,66,69,78,86]}]	[]	[{CCA:[8,19,26,31,42,50,69,78,86,92]},{TCA:[1,3,4,20,27,41,51,67]}]	{5':[], ~5':[(26-1_0),(92-0_0)]}	CACT	18.5x}
-CAA	{[{AAT:[22,29,34,55,57,68,73,79]}]	[]	[]	[{GAC:[29,55,79,89]}]	{5':[(22-0_0),(34-0_0),(57-0_0)], ~5':[]}	ACAA	8.0x}
-TAA	{[{AAA:[49,81,83,89,93,94,97]},{AAG:[38,39,47,52,71,88,91]},{AAT:[7,11,37,40,56,85]}]	[]	[{ACC:[5,7,11,21,37,40,56]}]	[{ATA:[49,75,81,83,89,94,97]},{CTA:[12,16,38,39,61,71,82,88,91,93]}]	{5':[(47-0_0)], ~5':[(12-0_0),(75-0_0)]}	TAA	25.0x}
-CCA	{[{CAG:[2,10,14,43,54,63,75,100]},{ACT:[1,3,4,8,20,26,27,31,41,42,50,51,67,69,78,86]}]	[]	[{GGA:[2,10,14,43,49,54,63,75]}]	[{GCC:[19,26,31,50,69,90,92]}]	{5':[(78-0_0),(86-0_0)], ~5':[]}	CCA	20.0x}
-TCA	{[{CAG:[6,8,19,25,26,31,42,46,50,60,66,69,70,72,78,80,86,90,92]},{ACT:[1,3,4,8,20,26,27,31,41,42,50,51,67,69,78,86]}]	[]	[{GAA:[1,4,20,27,30,41,64,67]}]	[{ATC:[19,26,60,72,90,92]},{CTC:[6,25,36,46,53,66,70,80,87]}]	{5':[(8-0_0),(31-0_0),(42-0_0),(69-0_0)], ~5':[(87-0_0),(90-0_0)]}	TCA	35.0x}
-CGA	{[{GAA:[13,17,32,33,38,45,47,52,59,62,71,76,77,84,91,96,98]}]	[{ATC:[9,18,22,28,30,34,35,44,55,57,64,68,73,74,95]}]	[{CGC:[32,38,39,47,52,62,71,84,91]}]	[{ACG:[13,17,18,33,45,59,74,77,98]},{CCG:[3,9,18,22,28,30,33,34,35,44,51,57,64,68,73,74,95]}]	{5':[(55-0_0),(76-0_0)], ~5':[(3-0_0),(51-0_0)]}	CGA	38.0x}
-CTA	{[{TAA:[12,16,38,39,61,71,82,88,91,93]}]	[{CTA:[12,24,58,61,65,99,100]}]	[{AGC:[12,16,24,43,58,61,65,82,85,88,93,99,100]},{AGG:[12,24,38,39,61,88,91]}]	[]	{5':[(100-0_0)], ~5':[(43-0_0),(85-0_0)]}	CTA	28.0x}
-CCC	{[{CCG:[3,20,28,35,44,51,73,95]}]	[{AGG:[6,32,36,53,62,76,84,87]}]	[{GGA:[1,3,20,28,35,44,51,67,95]}]	[{GCC:[6,36,53,70,76,87]}]	{5':[(32-0_0),(73-0_0),(84-0_0)], ~5':[]}	CCC	19.0x}
-CGC	{[]	[{AGC:[16,32,38,39,47,52,62,71,82,84,85,91,93]}]	[{CGA:[32,38,39,47,52,62,71,84,91]}]	[{CCG:[11,16,82,85,93]}]	{5':[], ~5':[(11-0_0)]}	CGC	14.0x}
-CTC	{[{TCA:[6,25,36,46,53,66,70,80,87]}]	[{AGA:[10,43,54,63,65,99,100]},{GGA:[1,3,4,20,35,44,51,67]}]	[{AGC:[6,10,25,36,43,46,53,54,58,63,65,66,70,76,80,87,99,100]}]	[{ACT:[1,3,4,20,27,35,41,44,51,67]}]	{5':[], ~5':[(27-0_0),(41-0_0),(58-0_0)]}	CTC	28.0x}
-CAG	{[{AGA:[2,8,10,14,25,42,43,46,54,63,65,66,70,78,80,86,100]},{AGC:[19,26,31,50,60,69,72,90,92]}]	[]	[]	[{CCA:[2,10,14,43,54,63,75,100]},{TCA:[6,8,19,25,26,31,42,46,50,60,66,69,70,72,78,80,86,90,92]}]	{5':[(65-0_0)], ~5':[(60-0_0),(72-0_0)]}	CAG	30.0x}
-CCG	{[{CGA:[3,9,18,22,28,30,33,34,35,44,51,57,64,68,73,74,95]},{CGC:[11,16,82,85,93]}]	[{CCG:[5,7,15,21,23,37,40,48,96]}]	[{GGA:[9,11,16,18,30,33,45,56,64,74,77,82,85]}]	[{ACC:[5,7,15,21,23,37,40,48,56]},{CCC:[3,20,28,35,44,51,73,95]},{GCC:[5,7,15,21,23,40,48,96]}]	{5':[(68-0_0),(93-0_0),(96-0_0)], ~5':[(20-0_0),(56-0_0)]}	CCG	45.0x}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/checker/SymmetryCheckerVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/checker/SymmetryCheckerVertex.java
index 1d86859..5b3f9c4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/checker/SymmetryCheckerVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/checker/SymmetryCheckerVertex.java
@@ -7,8 +7,8 @@
 import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
 import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
 import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 
 public class SymmetryCheckerVertex extends
     BasicGraphCleanVertex<VertexValueWritable, MessageWritable> {
@@ -43,8 +43,8 @@
             //check if the corresponding edge exists
             while(msgIterator.hasNext()){
                 incomingMsg = msgIterator.next();
-                byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-                byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+                EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+                EDGETYPE neighborToMeDir = meToNeighborDir.mirror(); 
                 boolean exist = getVertexValue().getEdgeList(neighborToMeDir).contains(incomingMsg.getSourceVertexId());
                 if(!exist){
                     getVertexValue().setState(State.IS_ERROR);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/graph/GenerateGraphViz.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/graph/GenerateGraphViz.java
index 2593c34..b440dc4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/graph/GenerateGraphViz.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/graph/GenerateGraphViz.java
@@ -13,8 +13,8 @@
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 
 public class GenerateGraphViz {
 
@@ -132,25 +132,25 @@
     public static String convertEdgeToGraph(String outputNode, NodeWritable value){
         String outputEdge = "";
         Iterator<EdgeWritable> edgeIterator;
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next(); 
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
@@ -171,25 +171,25 @@
     public static String convertEdgeToGraph(String outputNode, VertexValueWritable value){
         String outputEdge = "";
         Iterator<EdgeWritable> edgeIterator;
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next(); 
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
                     edge.printReadIdSet() + "\"]\n";
         }
-        edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+        edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
         while(edgeIterator.hasNext()){
             EdgeWritable edge = edgeIterator.next();
             outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java
index 9e07213..4eee225 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java
@@ -6,7 +6,6 @@
 import edu.uci.ics.genomix.pregelix.io.common.ByteWritable;
 import edu.uci.ics.genomix.pregelix.io.common.HashMapWritable;
 import edu.uci.ics.genomix.pregelix.io.common.VLongWritable;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
@@ -18,7 +17,7 @@
     private static final long serialVersionUID = 1L;
     
     public static class HeadMergeDir{
-        public static final byte NON_HEAD = 0b00 << 2;
+        public static final byte PATH_NON_HEAD = 0b00 << 2;
         public static final byte HEAD_CANNOT_MERGE = 0b01 << 2;
         public static final byte HEAD_CAN_MERGEWITHPREV = 0b10 << 2; //use for initiating head
         public static final byte HEAD_CAN_MERGEWITHNEXT = 0b11 << 2;
@@ -27,6 +26,13 @@
     }
     
     public static class VertexStateFlag extends HeadMergeDir{
+        public static final byte TO_UPDATE = 0b01 << 5;
+        public static final byte TO_OTHER = 0b10 << 5;
+        public static final byte TO_NEIGHBOR = 0b11 << 5;
+        public static final byte MSG_MASK = 0b11 << 5; 
+        public static final byte MSG_CLEAR = (byte)0011111;
+        
+        //TODO clean up code
         public static final byte IS_NON = 0b000 << 4;
         public static final byte IS_HEAD = 0b001 << 4;
         public static final byte IS_FINAL = 0b010 << 4;
@@ -97,11 +103,6 @@
         scaffoldingMap = new HashMapWritable<VLongWritable, KmerListAndFlagListWritable>();
     }
 
-//    TODO: figure out why can't use
-//    public VertexValueWritable get(){
-//        return this;
-//    }
-    
     public void setAsCopy(VertexValueWritable other){
         setNode(other.getNode());
         state = other.getState();
@@ -118,35 +119,35 @@
     }
     
     public EdgeListWritable getFFList() {
-        return getEdgeList(DirectionFlag.DIR_FF);
+        return getEdgeList(EDGETYPE.FF);
     }
 
     public EdgeListWritable getFRList() {
-        return getEdgeList(DirectionFlag.DIR_FR);
+        return getEdgeList(EDGETYPE.FR);
     }
 
     public EdgeListWritable getRFList() {
-        return getEdgeList(DirectionFlag.DIR_RF);
+        return getEdgeList(EDGETYPE.RF);
     }
 
     public EdgeListWritable getRRList() {
-        return getEdgeList(DirectionFlag.DIR_RR);
+        return getEdgeList(EDGETYPE.RR);
     }
     
     public void setFFList(EdgeListWritable forwardForwardList){
-        setEdgeList(DirectionFlag.DIR_FF, forwardForwardList);
+        setEdgeList(EDGETYPE.FF, forwardForwardList);
     }
     
     public void setFRList(EdgeListWritable forwardReverseList){
-        setEdgeList(DirectionFlag.DIR_FR, forwardReverseList);
+        setEdgeList(EDGETYPE.FR, forwardReverseList);
     }
     
     public void setRFList(EdgeListWritable reverseForwardList){
-        setEdgeList(DirectionFlag.DIR_RF, reverseForwardList);
+        setEdgeList(EDGETYPE.RF, reverseForwardList);
     }
 
     public void setRRList(EdgeListWritable reverseReverseList){
-        setEdgeList(DirectionFlag.DIR_RR, reverseReverseList);
+        setEdgeList(EDGETYPE.RR, reverseReverseList);
     }
     
     public AdjacencyListWritable getIncomingList() {
@@ -252,53 +253,23 @@
     /**
      * Delete the corresponding edge
      */
-    public void processDelete(byte neighborToDeleteDir, EdgeWritable nodeToDelete){
-        byte dir = (byte)(neighborToDeleteDir & MessageFlag.DIR_MASK);
-        this.getEdgeList(dir).remove(nodeToDelete);
+    public void processDelete(EDGETYPE neighborToDeleteEdgetype, EdgeWritable nodeToDelete){
+        this.getEdgeList(neighborToDeleteEdgetype).remove(nodeToDelete);
     }
     
-    
-//    /**
-//     * Process any changes to value.  This is for edge updates.  nodeToAdd should be only edge
-//     */
-//    public void processUpdates(byte deleteDir, VKmerBytesWritable toDelete, byte updateDir, NodeWritable other){
-//    	// TODO remove this function (use updateEdges)
-//        byte replaceDir = mirrorDirection(deleteDir);
-//        this.getNode().updateEdges(deleteDir, toDelete, updateDir, replaceDir, other, true);
-//    }
-    
-    public void processFinalUpdates(byte deleteDir, byte updateDir, NodeWritable other){
-        byte replaceDir = mirrorDirection(deleteDir);
+    public void processFinalUpdates(EDGETYPE deleteDir, EDGETYPE updateDir, NodeWritable other){
+        EDGETYPE replaceDir = deleteDir.mirror();
         this.getNode().updateEdges(deleteDir, null, updateDir, replaceDir, other, false);
     }
     
     /**
      * Process any changes to value.  This is for merging.  nodeToAdd should be only edge
      */
-    public void processMerges(byte mergeDir, NodeWritable node, int kmerSize){
+    public void processMerges(EDGETYPE mergeDir, NodeWritable node, int kmerSize){
         KmerBytesWritable.setGlobalKmerLength(kmerSize); // TODO Do this once at the init of your function, then you don't need it as a parameter here
-        mergeDir = (byte)(mergeDir & MessageFlag.DIR_MASK); // TODO move this dir outside and remove this function
         super.getNode().mergeWithNode(mergeDir, node);
     }
     
-    /**
-     * Returns the edge dir for B->A when the A->B edge is type @dir
-     */
-    public byte mirrorDirection(byte dir) {
-        switch (dir) {
-            case MessageFlag.DIR_FF:
-                return MessageFlag.DIR_RR;
-            case MessageFlag.DIR_FR:
-                return MessageFlag.DIR_FR;
-            case MessageFlag.DIR_RF:
-                return MessageFlag.DIR_RF;
-            case MessageFlag.DIR_RR:
-                return MessageFlag.DIR_FF;
-            default:
-                throw new RuntimeException("Unrecognized direction in flipDirection: " + dir);
-        }
-    }
-    
     @Override
     public String toString() {
         return super.toString() + "\t" + State.getContent(state);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/BubbleMergeMessageWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/BubbleMergeMessageWritable.java
index fef5c15..59108d4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/BubbleMergeMessageWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/BubbleMergeMessageWritable.java
@@ -8,6 +8,7 @@
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 
 public class BubbleMergeMessageWritable extends MessageWritable{
 
@@ -19,8 +20,8 @@
     private VKmerBytesWritable majorVertexId; //use for MergeBubble
     private VKmerBytesWritable minorVertexId;
     private NodeWritable node; //except kmer, other field should be updated when MergeBubble
-    private byte meToMajorDir;
-    private byte meToMinorDir;
+    private byte meToMajorEdgetype;
+    private byte meToMinorEdgetype;
     private VKmerBytesWritable topCoverageVertexId;
     private boolean isFlip;
     
@@ -29,8 +30,8 @@
         majorVertexId = new VKmerBytesWritable();
         minorVertexId = new VKmerBytesWritable();
         node = new NodeWritable();
-        meToMajorDir = 0;
-        meToMinorDir = 0;
+        meToMajorEdgetype = 0;
+        meToMinorEdgetype = 0;
         topCoverageVertexId = new VKmerBytesWritable();
         isFlip = false;
     }
@@ -45,8 +46,8 @@
         this.setMajorVertexId(msg.getMajorVertexId());
         this.setMinorVertexId(msg.getMinorVertexId());
         this.setNode(msg.node);
-        this.setMeToMajorDir(msg.meToMajorDir);
-        this.setMeToMinorDir(msg.meToMinorDir);
+        this.setMeToMajorEdgetype(msg.meToMajorEdgetype);
+        this.setMeToMinorEdgetype(msg.meToMinorEdgetype);
         this.setTopCoverageVertexId(msg.topCoverageVertexId);
         this.setFlip(msg.isFlip());
     }
@@ -56,19 +57,20 @@
         majorVertexId.reset(0);
         minorVertexId.reset(0);
         node.reset();
-        meToMajorDir = 0;
-        meToMinorDir = 0;
+        meToMajorEdgetype = 0;
+        meToMinorEdgetype = 0;
         topCoverageVertexId.reset(0);
         isFlip = false;
     }
     
     public byte getRelativeDirToMajor(){
-        switch(meToMajorDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_RR:
+        EDGETYPE et = EDGETYPE.fromByte(meToMajorEdgetype);
+        switch(et){
+            case FF:
+            case RR:
                 return DirToMajor.FORWARD;
-            case MessageFlag.DIR_FR:
-            case MessageFlag.DIR_RF:
+            case FR:
+            case RF:
                 return DirToMajor.REVERSE;
         }
         return 0;
@@ -115,22 +117,22 @@
         this.node.setAsCopy(node);
     }
     
-    public byte getMeToMajorDir() {
-        return meToMajorDir;
+    public byte getMeToMajorEdgetype() {
+        return meToMajorEdgetype;
     }
 
-    public void setMeToMajorDir(byte meToMajorDir) {
-        this.meToMajorDir = meToMajorDir;
+    public void setMeToMajorEdgetype(byte meToMajorEdgetype) {
+        this.meToMajorEdgetype = meToMajorEdgetype;
     }
 
-    public byte getMeToMinorDir() {
-        return meToMinorDir;
+    public byte getMeToMinorEdgetype() {
+        return meToMinorEdgetype;
     }
 
-    public void setMeToMinorDir(byte meToMinorDir) {
-        this.meToMinorDir = meToMinorDir;
+    public void setMeToMinorEdgetype(byte meToMinorEdgetype) {
+        this.meToMinorEdgetype = meToMinorEdgetype;
     }
-    
+
     public boolean isFlip() {
         return isFlip;
     }
@@ -146,8 +148,8 @@
         majorVertexId.readFields(in);
         minorVertexId.readFields(in);
         node.readFields(in);
-        meToMajorDir = in.readByte();
-        meToMinorDir = in.readByte();
+        meToMajorEdgetype = in.readByte();
+        meToMinorEdgetype = in.readByte();
         topCoverageVertexId.readFields(in);
         isFlip = in.readBoolean();
     }
@@ -158,8 +160,8 @@
         majorVertexId.write(out);
         minorVertexId.write(out);
         node.write(out);
-        out.writeByte(meToMajorDir);
-        out.write(meToMinorDir);
+        out.writeByte(meToMajorEdgetype);
+        out.write(meToMinorEdgetype);
         topCoverageVertexId.write(out);
         out.writeBoolean(isFlip);
     }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/PathMergeMessageWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/PathMergeMessageWritable.java
index 07ededf..77e421a 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/PathMergeMessageWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/PathMergeMessageWritable.java
@@ -3,13 +3,14 @@
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.EnumSet;
 
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 
 public class PathMergeMessageWritable extends MessageWritable{
     
@@ -24,6 +25,11 @@
         updateMsg = false;
     }
     
+    public PathMergeMessageWritable(PathMergeMessageWritable other){
+        this();
+        this.setAsCopy(other);
+    }
+    
     public void setAsCopy(PathMergeMessageWritable other){
         super.setAsCopy(other);
         this.node.setAsCopy(other.getNode());
@@ -46,20 +52,20 @@
         this.node.setInternalKmer(internalKmer);
     }
     
-    public EdgeListWritable getEdgeList(byte dir) {
-        return node.getEdgeList((byte) (dir & DirectionFlag.DIR_MASK));
+    public EdgeListWritable getEdgeList(EDGETYPE edgeType) {
+        return node.getEdgeList(edgeType);
     }
     
     public EdgeWritable getNeighborEdge(){
-        for(byte d : DirectionFlag.values){
-            if(!getEdgeList(d).isEmpty())
-                return getEdgeList(d).get(0);
+        for(EDGETYPE e : EnumSet.allOf(EDGETYPE.class)){
+            if(!getEdgeList(e).isEmpty())
+                return getEdgeList(e).get(0);
         }
         return null;
     }
 
-    public void setEdgeList(byte dir, EdgeListWritable edgeList) {
-        this.node.setEdgeList((byte) (dir & DirectionFlag.DIR_MASK), edgeList);
+    public void setEdgeList(EDGETYPE edgeType, EdgeListWritable edgeList) {
+        this.node.setEdgeList(edgeType, edgeList);
     }
     
     public PositionListWritable getStartReads() {
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
index 5349b1c..dcae00a 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
@@ -1,9 +1,10 @@
 package edu.uci.ics.genomix.pregelix.operator;
 
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.EnumSet;
 import java.util.Iterator;
-import java.util.Map.Entry;
-import java.util.AbstractMap.SimpleEntry;
+import java.util.List;
 import java.util.Random;
 import java.util.logging.Logger;
 
@@ -28,12 +29,10 @@
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.pregelix.util.VertexUtil;
 import edu.uci.ics.genomix.type.NodeWritable.DIR;
-import edu.uci.ics.genomix.type.NodeWritable.OutgoingListFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerListWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
-import edu.uci.ics.genomix.type.NodeWritable.IncomingListFlag;
 
 public abstract class BasicGraphCleanVertex<V extends VertexValueWritable, M extends MessageWritable> extends
         Vertex<VKmerBytesWritable, V, NullWritable, M> {
@@ -48,21 +47,22 @@
     public static boolean fakeVertexExist = false;
     public static VKmerBytesWritable fakeVertex = null;
     
-    public byte[][] connectedTable = new byte[][]{
-            {MessageFlag.DIR_RF, MessageFlag.DIR_FF},
-            {MessageFlag.DIR_RF, MessageFlag.DIR_FR},
-            {MessageFlag.DIR_RR, MessageFlag.DIR_FF},
-            {MessageFlag.DIR_RR, MessageFlag.DIR_FR}
+    public EDGETYPE[][] connectedTable = new EDGETYPE[][]{
+            {EDGETYPE.RF, EDGETYPE.FF},
+            {EDGETYPE.RF, EDGETYPE.FR},
+            {EDGETYPE.RR, EDGETYPE.FF},
+            {EDGETYPE.RR, EDGETYPE.FR}
     };
     
     protected M incomingMsg = null; 
     protected M outgoingMsg = null; 
+    protected M aggregatingMsg = null;
     protected VKmerBytesWritable destVertexId = null;
     protected VertexValueWritable tmpValue = new VertexValueWritable(); 
     protected Iterator<VKmerBytesWritable> kmerIterator;
     protected VKmerListWritable kmerList = null;
     protected VKmerBytesWritable repeatKmer = null; //for detect tandemRepeat
-    protected byte repeatDir; //for detect tandemRepeat
+    protected EDGETYPE repeatEdgetype; //for detect tandemRepeat
     protected VKmerBytesWritable tmpKmer = null;
     protected short outFlag;
     protected short inFlag;
@@ -70,8 +70,22 @@
     
     protected EdgeListWritable incomingEdgeList = null; //SplitRepeat and BubbleMerge
     protected EdgeListWritable outgoingEdgeList = null; //SplitRepeat and BubbleMerge
-    protected byte incomingEdgeDir = 0; //SplitRepeat and BubbleMerge
-    protected byte outgoingEdgeDir = 0; //SplitRepeat and BubbleMerge
+    protected EDGETYPE incomingEdgeType; //SplitRepeat and BubbleMerge
+    protected EDGETYPE outgoingEdgeType; //SplitRepeat and BubbleMerge
+    
+    protected static final List<VKmerBytesWritable> problemKmers = Arrays.asList(
+//            new VKmerBytesWritable("CCCGGCCTCCAGCGTGGGATACGCGAAGATGCCGCCGTAGGTGAGAATCTGGTTC"),
+//            new VKmerBytesWritable("GCAGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
+//            new VKmerBytesWritable("GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
+//            new VKmerBytesWritable("GAGCAGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
+//            new VKmerBytesWritable("GGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
+//            new VKmerBytesWritable("AGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
+//            new VKmerBytesWritable("GCGACGTGCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
+//            new VKmerBytesWritable("GTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
+            new VKmerBytesWritable("AACACCGAGGGCGTGCCGACGAACCCCGAGGCCTACGCGAAGATGCGCGGCTGGA")
+            );
+    protected static final boolean debug = false;
+    protected boolean verbose = false;
     
     protected HashMapWritable<ByteWritable, VLongWritable> counters = new HashMapWritable<ByteWritable, VLongWritable>();
     /**
@@ -83,6 +97,10 @@
         if (maxIteration < 0)
             maxIteration = Integer.parseInt(getContext().getConfiguration().get(GenomixJobConf.GRAPH_CLEAN_MAX_ITERATIONS));
         GenomixJobConf.setGlobalStaticConstants(getContext().getConfiguration());
+        
+        verbose = false;
+        for (VKmerBytesWritable problemKmer : problemKmers)
+            verbose |= debug && (getVertexValue().getNode().findEdge(problemKmer) != null || getVertexId().equals(problemKmer));
     }
     
     public boolean isHeadNode(){
@@ -120,22 +138,22 @@
         return flagAndMergeDir;
     }
     
-    public byte getMsgFlagAndMergeDir(){
-        byte flagAndMergeDir = (byte)(getVertexValue().getState() & State.IS_HEAD);
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
-        switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
-                flagAndMergeDir |= MessageFlag.HEAD_CAN_MERGEWITHPREV;
-                break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
-                flagAndMergeDir |= MessageFlag.HEAD_CAN_MERGEWITHNEXT;
-                break;
-        }
-        return flagAndMergeDir;
-    }
+//    public byte getMsgFlagAndMergeDir(){
+//        byte flagAndMergeDir = (byte)(getVertexValue().getState() & State.IS_HEAD);
+//        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
+//        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+//        switch(neighborToMeDir){
+//            case MessageFlag.DIR_FF:
+//            case MessageFlag.DIR_FR:
+//                flagAndMergeDir |= MessageFlag.HEAD_CAN_MERGEWITHPREV;
+//                break;
+//            case MessageFlag.DIR_RF:
+//            case MessageFlag.DIR_RR:
+//                flagAndMergeDir |= MessageFlag.HEAD_CAN_MERGEWITHNEXT;
+//                break;
+//        }
+//        return flagAndMergeDir;
+//    }
     
     /**
      * set head state
@@ -196,34 +214,6 @@
     /**
      * get destination vertex
      */
-    public VKmerBytesWritable getPrevDestVertexId() {
-    	// TODO check length of RF and RR == 1; throw exception otherwise
-        if (!getVertexValue().getRFList().isEmpty()){ //#RFList() > 0
-            kmerIterator = getVertexValue().getRFList().getKeyIterator();
-            return kmerIterator.next();
-        } else if (!getVertexValue().getRRList().isEmpty()){ //#RRList() > 0
-            kmerIterator = getVertexValue().getRRList().getKeyIterator();
-            return kmerIterator.next();
-        } else {
-            return null;
-        }
-    }
-    
-    public VKmerBytesWritable getNextDestVertexId() {
-        if (!getVertexValue().getFFList().isEmpty()){ //#FFList() > 0
-            kmerIterator = getVertexValue().getFFList().getKeyIterator();
-            return kmerIterator.next();
-        } else if (!getVertexValue().getFRList().isEmpty()){ //#FRList() > 0
-            kmerIterator = getVertexValue().getFRList().getKeyIterator();
-            return kmerIterator.next();
-        } else {
-            return null;  
-        }
-    }
-
-    /**
-     * get destination vertex
-     */
     public VKmerBytesWritable getPrevDestVertexIdAndSetFlag() {
         if (!getVertexValue().getRFList().isEmpty()){ // #RFList() > 0
             kmerIterator = getVertexValue().getRFList().getKeyIterator();
@@ -268,7 +258,7 @@
             else if(!getVertexValue().getRRList().isEmpty())
                 outgoingMsg.setFlag(MessageFlag.DIR_RR);
             outgoingMsg.setSourceVertexId(getVertexId());
-            destVertexId.setAsCopy(getPrevDestVertexId());
+            destVertexId.setAsCopy(getDestVertexId(DIR.PREVIOUS));
             sendMsg(destVertexId, outgoingMsg);
         }
     }
@@ -284,22 +274,22 @@
             else if(!getVertexValue().getFRList().isEmpty())
                 outgoingMsg.setFlag(MessageFlag.DIR_FR);
             outgoingMsg.setSourceVertexId(getVertexId());
-            destVertexId.setAsCopy(getNextDestVertexId());
+            destVertexId.setAsCopy(getDestVertexId(DIR.NEXT));
             sendMsg(destVertexId, outgoingMsg);
         }
     }
     
     /**
-     * head send message to all neighbor nodes
+     * send message to all neighbor nodes
      */
     public void sendSettledMsgs(DIR direction, VertexValueWritable value){
         //TODO THE less context you send, the better  (send simple messages)
-        byte dirs[] = direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
-        for(byte dir : dirs){
-            kmerIterator = value.getEdgeList(dir).getKeyIterator();
+        EnumSet<EDGETYPE> edgeTypes = (direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING);
+        for(EDGETYPE e : edgeTypes){
+            kmerIterator = value.getEdgeList(e).getKeyIterator();
             while(kmerIterator.hasNext()){
                 outFlag &= MessageFlag.DIR_CLEAR;
-                outFlag |= dir;
+                outFlag |= e.get();
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setSourceVertexId(getVertexId());
                 destVertexId.setAsCopy(kmerIterator.next());
@@ -314,38 +304,72 @@
     }
     
     /**
+     * head send message to all neighbor nodes
+     */
+    public void headSendSettledMsgs(DIR direction, VertexValueWritable value){
+        //TODO THE less context you send, the better  (send simple messages)
+        EnumSet<EDGETYPE> edgeTypes = (direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING);
+        for(EDGETYPE e : edgeTypes){
+            kmerIterator = value.getEdgeList(e).getKeyIterator();
+            while(kmerIterator.hasNext()){
+                outFlag &= MessageFlag.HEAD_CAN_MERGE_CLEAR;
+                EDGETYPE meToNeighborEdgeType = e.mirror();
+                switch(meToNeighborEdgeType){
+                    case FF:
+                    case FR:
+                        outFlag |= MessageFlag.HEAD_CAN_MERGEWITHPREV;
+                        break;
+                    case RF:
+                    case RR:
+                        outFlag |= MessageFlag.HEAD_CAN_MERGEWITHNEXT;
+                        break;  
+                }
+                outgoingMsg.setFlag(outFlag);
+                outgoingMsg.setSourceVertexId(getVertexId());
+                destVertexId.setAsCopy(kmerIterator.next());
+                sendMsg(destVertexId, outgoingMsg);
+            }
+        }
+    }
+    
+    public void headSendSettledMsgToAllNeighborNodes(VertexValueWritable value) {
+        headSendSettledMsgs(DIR.PREVIOUS, value);
+        headSendSettledMsgs(DIR.NEXT, value);
+    }
+    
+    /**
      * get a copy of the original Kmer without TandemRepeat
      * @param destVertex 
      */
     public void copyWithoutTandemRepeats(V srcVertex, VertexValueWritable destVertex){
         destVertex.setAsCopy(srcVertex);
-        destVertex.getEdgeList(repeatDir).remove(repeatKmer);
+        destVertex.getEdgeList(repeatEdgetype).remove(repeatKmer);
         while(isTandemRepeat(destVertex))
-            destVertex.getEdgeList(repeatDir).remove(repeatKmer);
+            destVertex.getEdgeList(repeatEdgetype).remove(repeatKmer);
     }
     
-    /**
-     * check if it is valid path
-     */
-    public boolean isValidPath(){
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
-        switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
-                return getVertexValue().inDegree() == 1;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
-                return getVertexValue().outDegree() == 1;
-        }
-        return true;
-    }
+//    /**
+//     * check if it is valid path
+//     */
+//    public boolean isValidPath(){
+//        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
+//        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+//        switch(neighborToMeDir){
+//            case MessageFlag.DIR_FF:
+//            case MessageFlag.DIR_FR:
+//                return getVertexValue().inDegree() == 1;
+//            case MessageFlag.DIR_RF:
+//            case MessageFlag.DIR_RR:
+//                return getVertexValue().outDegree() == 1;
+//        }
+//        return true;
+//    }
     
     /**
      * check if A need to be filpped with neighbor
      */
-    public boolean ifFlipWithNeighbor(boolean withPrecessor){
-        if(withPrecessor){
+    public boolean ifFlipWithNeighbor(DIR direction){
+        if(direction == DIR.PREVIOUS){
             if(getVertexValue().getRRList().isEmpty())
                 return true;
             else
@@ -395,17 +419,14 @@
     /**
      * set neighborToMe Dir
      */
-    public void setNeighborToMeDir(DIR predecessorToMe){
-        if(getVertexValue().getDegree(predecessorToMe) != 1)
+    public void setNeighborToMeDir(DIR direction){
+        if(getVertexValue().getDegree(direction) != 1)
             throw new IllegalArgumentException("In merge dir, the degree is not 1");
-        byte[] dirs = predecessorToMe == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
+        EnumSet<EDGETYPE> edgeTypes = direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING;
         outFlag &= MessageFlag.DIR_CLEAR;
         
-        if(getVertexValue().getEdgeList(dirs[0]).getCountOfPosition() == 1){
-            outFlag |= dirs[0];
-        } else if(getVertexValue().getEdgeList(dirs[1]).getCountOfPosition() == 1){
-            outFlag |= dirs[1];
-        }
+        for (EDGETYPE et : edgeTypes)
+            outFlag |= et.get();
     }
     
     /**
@@ -433,7 +454,7 @@
     /**
      * Returns the edge dir for B->A when the A->B edge is type @dir
      */
-    public byte mirrorDirection(byte dir) {
+    public byte meToNeighborDir(byte dir) {
         switch (dir) {
             case MessageFlag.DIR_FF:
                 return MessageFlag.DIR_RR;
@@ -497,8 +518,8 @@
      * do some remove operations on adjMap after receiving the info about dead Vertex
      */
     public void responseToDeadVertex(){
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         
         getVertexValue().getEdgeList(neighborToMeDir).remove(incomingMsg.getSourceVertexId());
     }
@@ -548,48 +569,17 @@
     /**
      * Look inside of vertex for the given edge, returning the direction we found it in (or null) 
      */
-    public static Byte findEdge(VKmerBytesWritable id, VertexValueWritable vertex){
+    public static EDGETYPE findEdge(VKmerBytesWritable id, VertexValueWritable vertex){
         // TODO move into Node?
-        for(byte d : DirectionFlag.values){
-            for (VKmerBytesWritable curKey : vertex.getEdgeList(d).getKeys()) {
+        for(EDGETYPE e : EnumSet.allOf(EDGETYPE.class)){
+            for (VKmerBytesWritable curKey : vertex.getEdgeList(e).getKeys()) {
                 if(curKey.equals(id)) // points to self
-                    return d;
+                    return e;
             }
         }
         return null;
     }
     
-    public boolean isTandemRepeat(VertexValueWritable value){
-            VKmerBytesWritable kmerToCheck;
-            for(byte d : DirectionFlag.values){
-                Iterator<VKmerBytesWritable> it = value.getEdgeList(d).getKeyIterator();
-                while(it.hasNext()){
-                    kmerToCheck = it.next();
-                    if(kmerToCheck.equals(getVertexId())){
-                        repeatDir = d;
-                        repeatKmer.setAsCopy(kmerToCheck);
-                        return true;
-                    }
-                }
-            }
-            return false;
-        }
-    
-    public byte flipDir(byte dir){
-        switch(dir){
-            case DirectionFlag.DIR_FF:
-                return DirectionFlag.DIR_RF;
-            case DirectionFlag.DIR_FR:
-                return DirectionFlag.DIR_RR;
-            case DirectionFlag.DIR_RF:
-                return DirectionFlag.DIR_FF;
-            case DirectionFlag.DIR_RR:
-                return DirectionFlag.DIR_FR;
-            default:
-                throw new RuntimeException("Unrecognized direction in flipDirection: " + dir);
-        }
-    }
-    
     /**
      * set statistics counter
      */
@@ -639,9 +629,9 @@
     public void startSendMsgForP2() {
         if(isTandemRepeat(getVertexValue())){
             tmpValue.setAsCopy(getVertexValue());
-            tmpValue.getEdgeList(repeatDir).remove(repeatKmer);
+            tmpValue.getEdgeList(repeatEdgetype).remove(repeatKmer);
             while(isTandemRepeat(tmpValue))
-                tmpValue.getEdgeList(repeatDir).remove(repeatKmer);
+                tmpValue.getEdgeList(repeatEdgetype).remove(repeatKmer);
             outFlag = 0;
             outFlag |= MessageFlag.IS_HEAD;
             sendSettledMsgToAllNeighborNodes(tmpValue);
@@ -693,12 +683,67 @@
      * use for SplitRepeatVertex and BubbleMerge
      * @param i
      */
-    public void setEdgeListAndEdgeDir(int i){
+    public void setEdgeListAndEdgeType(int i){
         incomingEdgeList.setAsCopy(getVertexValue().getEdgeList(connectedTable[i][0]));
-        incomingEdgeDir = connectedTable[i][0];
+        incomingEdgeType = connectedTable[i][0];
         
         outgoingEdgeList.setAsCopy(getVertexValue().getEdgeList(connectedTable[i][1]));
-        outgoingEdgeDir = connectedTable[i][1];
+        outgoingEdgeType = connectedTable[i][1];
     }
     
+//2013.9.21 ------------------------------------------------------------------//
+    /**
+     * get destination vertex ex. RemoveTip
+     */
+    public VKmerBytesWritable getDestVertexId(DIR direction){
+        int degree = getVertexValue().getDegree(direction);
+        if(degree > 1)
+            throw new IllegalArgumentException("degree > 1, getDestVertexId(DIR direction) only can use for degree == 1 + \n" + getVertexValue().toString());
+        
+        if(degree == 1){
+            EnumSet<EDGETYPE> edgeTypes = direction.edgeType();
+            for(EDGETYPE et : edgeTypes){
+                if(getVertexValue().getEdgeList(et).getCountOfPosition() > 0)
+                    return getVertexValue().getEdgeList(et).get(0).getKey();
+            }
+        }
+        //degree in this direction == 0
+        throw new IllegalArgumentException("degree > 0, getDestVertexId(DIR direction) only can use for degree == 1 + \n" + getVertexValue().toString());
+    }
+    
+    /**
+     * check if I am a tandemRepeat 
+     */
+    public boolean isTandemRepeat(VertexValueWritable value){
+        VKmerBytesWritable kmerToCheck;
+        for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+            Iterator<VKmerBytesWritable> it = value.getEdgeList(et).getKeyIterator();
+            while(it.hasNext()){
+                kmerToCheck = it.next();
+                if(kmerToCheck.equals(getVertexId())){
+                    repeatEdgetype = et;
+                    repeatKmer.setAsCopy(kmerToCheck);
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    /**
+     * broadcastKillself ex. RemoveLow
+     */
+    public void broadcastKillself(){
+        VertexValueWritable vertex = getVertexValue();
+        for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+            for(VKmerBytesWritable kmer : vertex.getEdgeList(et).getKeys()){
+                outFlag &= EDGETYPE.CLEAR;
+                outFlag |= et.mirror().get();
+                outgoingMsg.setFlag(outFlag);
+                outgoingMsg.setSourceVertexId(getVertexId());
+                destVertexId = kmer;
+                sendMsg(destVertexId, outgoingMsg);
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
index adbc526..c740bae 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
@@ -7,6 +7,7 @@
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.pregelix.api.graph.Vertex;
 import edu.uci.ics.pregelix.api.job.PregelixJob;
@@ -33,8 +34,8 @@
     private VKmerBytesWritable upBridge = new VKmerBytesWritable("ATA");
     private VKmerBytesWritable downBridge = new VKmerBytesWritable("ACG");
     private VKmerBytesWritable insertedBridge = new VKmerBytesWritable("GTA");
-    private byte bridgeToUpDir = MessageFlag.DIR_FR; 
-    private byte bridgeToDownDir = MessageFlag.DIR_RF; 
+    private EDGETYPE bridgeToUpDir = EDGETYPE.FR; 
+    private EDGETYPE bridgeToDownDir = EDGETYPE.RF; 
     
     /**
      * initiate kmerSize, maxIteration
@@ -49,7 +50,7 @@
     }
     
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    public void insertBridge(byte dirToUp, EdgeListWritable edgeListToUp, byte dirToDown,
+    public void insertBridge(EDGETYPE dirToUp, EdgeListWritable edgeListToUp, EDGETYPE dirToDown,
             EdgeListWritable edgeListToDown, VKmerBytesWritable insertedBridge){
         Vertex vertex = (Vertex) BspUtils.createVertex(getContext().getConfiguration());
         vertex.getMsgList().clear();
@@ -79,7 +80,7 @@
         return edgeList;
     }
     
-    public void addEdgeToInsertedBridge(byte dir, VKmerBytesWritable insertedBridge){
+    public void addEdgeToInsertedBridge(EDGETYPE dir, VKmerBytesWritable insertedBridge){
         EdgeWritable newEdge = new EdgeWritable();
         newEdge.setKey(insertedBridge);
         newEdge.appendReadID(0);
@@ -110,7 +111,7 @@
         if(getSuperstep() == 1){
             if(getVertexId().toString().equals("ATA")){
                 /** add edge pointing to inserted bridge **/
-                byte upToBridgeDir = mirrorDirection(bridgeToUpDir);
+                EDGETYPE upToBridgeDir = bridgeToUpDir.mirror(); 
                 addEdgeToInsertedBridge(upToBridgeDir, insertedBridge);
                 
                 /** insert bridge **/
@@ -120,7 +121,7 @@
             } 
             else if(getVertexId().toString().equals("ACG")){
                 /** add edge pointing to new bridge **/
-                byte downToBridgeDir = mirrorDirection(bridgeToDownDir);
+                EDGETYPE downToBridgeDir = bridgeToDownDir.mirror(); 
                 addEdgeToInsertedBridge(downToBridgeDir, insertedBridge);
             }
         }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
index e446129..074fb4e 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
@@ -1,5 +1,6 @@
 package edu.uci.ics.genomix.pregelix.operator.bubblemerge;
 
+import java.util.EnumSet;
 import java.util.Iterator;
 
 import org.apache.hadoop.io.NullWritable;
@@ -7,7 +8,7 @@
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.pregelix.api.graph.Vertex;
 import edu.uci.ics.pregelix.api.job.PregelixJob;
 import edu.uci.ics.pregelix.api.util.BspUtils;
@@ -35,8 +36,8 @@
     private VKmerBytesWritable insertedBubble = new VKmerBytesWritable("ATA"); //reverse
     private VKmerBytesWritable internalKmerInNewBubble = new VKmerBytesWritable("ATG");
     private float coverageOfInsertedBubble = 1;
-    private byte majorToNewBubbleDir = MessageFlag.DIR_FR;
-    private byte minorToNewBubbleDir = MessageFlag.DIR_FR;
+    private EDGETYPE majorToNewBubbleDir = EDGETYPE.FR;
+    private EDGETYPE minorToNewBubbleDir = EDGETYPE.FR;
     
     private EdgeListWritable[] edges = new EdgeListWritable[4];
     
@@ -95,20 +96,20 @@
         addVertex(insertedBubble, vertex);
     }
     
-    public void addEdgeToInsertedBubble(byte meToNewBubbleDir, VKmerBytesWritable insertedBubble){
+    public void addEdgeToInsertedBubble(EDGETYPE meToNewBubbleDir, VKmerBytesWritable insertedBubble){
         EdgeWritable newEdge = new EdgeWritable();
         newEdge.setKey(insertedBubble);
         newEdge.appendReadID(0);
-        byte newBubbleToMeDir = mirrorDirection(meToNewBubbleDir);
+        EDGETYPE newBubbleToMeDir = meToNewBubbleDir.mirror(); 
         getVertexValue().getEdgeList(newBubbleToMeDir).add(newEdge);
     }
     
     public void setupEdgeForInsertedBubble(){
-        for (byte d : DirectionFlag.values) {
-            edges[d] = new EdgeListWritable();
+        for (EDGETYPE et : EnumSet.allOf(EDGETYPE.class)) {
+            edges[et.get()] = new EdgeListWritable();
         }
-        edges[majorToNewBubbleDir].add(majorVertexId);
-        edges[minorToNewBubbleDir].add(minorVertexId);
+        edges[majorToNewBubbleDir.get()].add(majorVertexId);
+        edges[minorToNewBubbleDir.get()].add(minorVertexId);
     }
     
     @Override
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
index 9bb5746..8c84000 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
@@ -10,6 +10,8 @@
 
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.genomix.config.GenomixJobConf;
 import edu.uci.ics.genomix.pregelix.client.Client;
@@ -18,7 +20,6 @@
 import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
 import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
 import edu.uci.ics.genomix.pregelix.util.VertexUtil;
 
 /**
@@ -37,18 +38,19 @@
     
     private Map<VKmerBytesWritable, ArrayList<BubbleMergeMessageWritable>> receivedMsgMap = new HashMap<VKmerBytesWritable, ArrayList<BubbleMergeMessageWritable>>();
     private ArrayList<BubbleMergeMessageWritable> receivedMsgList = new ArrayList<BubbleMergeMessageWritable>();
-    private BubbleMergeMessageWritable topCoverageMessage = new BubbleMergeMessageWritable();
-    private BubbleMergeMessageWritable curMessage = new BubbleMergeMessageWritable();
-    private Set<BubbleMergeMessageWritable> unchangedSet = new HashSet<BubbleMergeMessageWritable>();
-    private Set<BubbleMergeMessageWritable> deletedSet = new HashSet<BubbleMergeMessageWritable>();
+    private BubbleMergeMessageWritable topMsg = new BubbleMergeMessageWritable();
+    private BubbleMergeMessageWritable curMsg = new BubbleMergeMessageWritable();
+//    private Set<BubbleMergeMessageWritable> unchangedSet = new HashSet<BubbleMergeMessageWritable>();
+//    private Set<BubbleMergeMessageWritable> deletedSet = new HashSet<BubbleMergeMessageWritable>();
     private EdgeWritable tmpEdge = new EdgeWritable();
     
-    private static Set<BubbleMergeMessageWritable> allDeletedSet = Collections.synchronizedSet(new HashSet<BubbleMergeMessageWritable>());
+//    private static Set<BubbleMergeMessageWritable> allDeletedSet = Collections.synchronizedSet(new HashSet<BubbleMergeMessageWritable>());
+    private static Set<VKmerBytesWritable> allDeletedSet = Collections.synchronizedSet(new HashSet<VKmerBytesWritable>());
     
-    private VKmerBytesWritable incomingKmer = new VKmerBytesWritable();
-    private VKmerBytesWritable outgoingKmer = new VKmerBytesWritable();
-    private VKmerBytesWritable majorVertexId = new VKmerBytesWritable();
-    private VKmerBytesWritable minorVertexId = new VKmerBytesWritable();
+//    private VKmerBytesWritable incomingKmer = new VKmerBytesWritable();
+//    private VKmerBytesWritable outgoingKmer = new VKmerBytesWritable();
+//    private VKmerBytesWritable majorVertexId = new VKmerBytesWritable();
+//    private VKmerBytesWritable minorVertexId = new VKmerBytesWritable();
     
     /**
      * initiate kmerSize, maxIteration
@@ -86,27 +88,40 @@
     
     public void sendBubbleAndMajorVertexMsgToMinorVertex(){
         for(int i = 0; i < 4; i++){
-            /** set edgeList and edgeDir based on connectedTable **/
-            setEdgeListAndEdgeDir(i);
+            // set edgeList and edgeDir based on connectedTable 
+            setEdgeListAndEdgeType(i);
             
             for(EdgeWritable incomingEdge : incomingEdgeList){
                 for(EdgeWritable outgoingEdge : outgoingEdgeList){
-                    /** get majorVertex and minorVertex and meToMajorDir and meToMinorDir **/
-                    incomingKmer.setAsCopy(incomingEdge.getKey());
-                    outgoingKmer.setAsCopy(outgoingEdge.getKey());
-                    majorVertexId.setAsCopy(incomingKmer.compareTo(outgoingKmer) >= 0 ? incomingKmer : outgoingKmer);
-                    minorVertexId.setAsCopy(incomingKmer.compareTo(outgoingKmer) < 0 ? incomingKmer : outgoingKmer);
-                    byte majorToMeDir = (incomingKmer.compareTo(outgoingKmer) >= 0 ? incomingEdgeDir : outgoingEdgeDir);
-                    byte meToMajorDir = mirrorDirection(majorToMeDir);
-                    byte minorToMeDir = (incomingKmer.compareTo(outgoingKmer) < 0 ? incomingEdgeDir : outgoingEdgeDir);
-                    byte meToMinorDir = mirrorDirection(minorToMeDir);
-                    
-                    /** setup outgoingMsg **/
+                    // get majorVertex and minorVertex and meToMajorDir and meToMinorDir
+                    VKmerBytesWritable incomingKmer = incomingEdge.getKey();
+                    VKmerBytesWritable outgoingKmer = outgoingEdge.getKey();
+                    VKmerBytesWritable majorVertexId = null;
+                    EDGETYPE majorToMeEdgetype = null; 
+                    EDGETYPE minorToMeEdgetype = null; 
+                    VKmerBytesWritable minorVertexId = null;
+                    if(incomingKmer.compareTo(outgoingKmer) >= 0){
+                        majorVertexId = incomingKmer;
+                        majorToMeEdgetype = incomingEdgeType;
+                        minorVertexId = outgoingKmer;
+                        minorToMeEdgetype = outgoingEdgeType;
+                    } else{
+                        majorVertexId = outgoingKmer;
+                        majorToMeEdgetype = outgoingEdgeType;
+                        minorVertexId = incomingKmer;
+                        minorToMeEdgetype = incomingEdgeType;
+                    }
+                    if(majorVertexId == minorVertexId)
+                        throw new IllegalArgumentException("majorVertexId is equal to minorVertexId, this is not allowd!");
+                    EDGETYPE meToMajorEdgetype = majorToMeEdgetype.mirror();
+                    EDGETYPE meToMinorEdgetype = minorToMeEdgetype.mirror();
+
+                    // setup outgoingMsg
                     outgoingMsg.setMajorVertexId(majorVertexId);
                     outgoingMsg.setSourceVertexId(getVertexId());
                     outgoingMsg.setNode(getVertexValue().getNode());
-                    outgoingMsg.setMeToMajorDir(meToMajorDir);
-                    outgoingMsg.setMeToMinorDir(meToMinorDir);
+                    outgoingMsg.setMeToMajorEdgetype(meToMajorEdgetype.get());
+                    outgoingMsg.setMeToMinorEdgetype(meToMinorEdgetype.get());
                     sendMsg(minorVertexId, outgoingMsg);
                 }
             }
@@ -131,28 +146,12 @@
         }
     }
     
-    public byte getEdgeTypeFromDir(byte dir){
-        switch(dir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
-                return EdgeType.OUTGOINGEDGE;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
-                return EdgeType.INCOMINGEDGE;
-        }
-        return 0;
-    }
-    
-    public boolean isSameEdgeType(byte edgeDir1, byte edgeDir2){
-        return getEdgeTypeFromDir(edgeDir1) == getEdgeTypeFromDir(edgeDir2);
-    }
-    
     public boolean isValidMajorAndMinor(){
-        byte topBubbleToMajorDir = topCoverageMessage.getMeToMajorDir();
-        byte curBubbleToMajorDir = curMessage.getMeToMajorDir();
-        byte topBubbleToMinorDir = topCoverageMessage.getMeToMinorDir();
-        byte curBubbleToMinorDir = curMessage.getMeToMinorDir();
-        return isSameEdgeType(topBubbleToMajorDir, curBubbleToMajorDir) && isSameEdgeType(topBubbleToMinorDir, curBubbleToMinorDir);
+        EDGETYPE topBubbleToMajorEdgetype = EDGETYPE.fromByte(topMsg.getMeToMajorEdgetype());
+        EDGETYPE curBubbleToMajorEdgetype = EDGETYPE.fromByte(curMsg.getMeToMajorEdgetype());
+        EDGETYPE topBubbleToMinorEdgetype = EDGETYPE.fromByte(topMsg.getMeToMinorEdgetype());
+        EDGETYPE curBubbleToMinorEdgetype = EDGETYPE.fromByte(curMsg.getMeToMinorEdgetype());
+        return (topBubbleToMajorEdgetype.dir() == curBubbleToMajorEdgetype.dir()) && topBubbleToMinorEdgetype.dir() == curBubbleToMinorEdgetype.dir();
     }
     
     public boolean isFlipRelativeToMajor(BubbleMergeMessageWritable msg1, BubbleMergeMessageWritable msg2){
@@ -160,75 +159,101 @@
     }
     
     public void processSimilarSetToUnchangeSetAndDeletedSet(){
-        unchangedSet.clear();
-        deletedSet.clear();
-        topCoverageMessage.reset();
-        curMessage.reset();
-        Iterator<BubbleMergeMessageWritable> it;
+//        unchangedSet.clear();
+//        deletedSet.clear();
+        topMsg.reset();
+        curMsg.reset();
         while(!receivedMsgList.isEmpty()){
-            it = receivedMsgList.iterator();
-            topCoverageMessage.set(it.next());
+            Iterator<BubbleMergeMessageWritable> it = receivedMsgList.iterator();
+            topMsg.set(it.next());
             it.remove(); //delete topCoverage node
+            NodeWritable topNode = topMsg.getNode();
             while(it.hasNext()){
-                curMessage.set(it.next());
+                curMsg.set(it.next());
                 //check if the vertex is valid minor and if it comes from valid major
                 if(!isValidMajorAndMinor())
                     continue;
+                
                 //compute the similarity
-                float fracDissimilar = topCoverageMessage.computeDissimilar(curMessage);
-                if(fracDissimilar < dissimilarThreshold){ //if similar with top node, delete this node and put it in deletedSet 
-                    //add coverage to top node
-                    topCoverageMessage.getNode().addFromNode(isFlipRelativeToMajor(topCoverageMessage, curMessage), 
-                            curMessage.getNode()); 
-                    boolean flip = curMessage.isFlip(topCoverageMessage);
-                    curMessage.setFlip(flip);
-                    curMessage.setTopCoverageVertexId(topCoverageMessage.getSourceVertexId());
-                    curMessage.setMinorVertexId(getVertexId());
-                    deletedSet.add(new BubbleMergeMessageWritable(curMessage));
-                    allDeletedSet.add(new BubbleMergeMessageWritable(curMessage));
+                float fracDissimilar = topMsg.computeDissimilar(curMsg);
+                
+                if(fracDissimilar < dissimilarThreshold){ //if similar with top node, delete this node and put it in deletedSet
+                    // 1. update my own(minor's) edges
+                    EDGETYPE bubbleToMinor = EDGETYPE.fromByte(curMsg.getMeToMinorEdgetype());
+                    getVertexValue().getEdgeList(bubbleToMinor).remove(curMsg.getSourceVertexId());
+                    activate();
+                    
+                    // 2. add coverage to top node -- for unchangedSet
+                    topNode.addFromNode(isFlipRelativeToMajor(topMsg, curMsg), 
+                            curMsg.getNode()); 
+                    
+                    // 3. treat msg as a bubble vertex, broadcast kill self message to major vertex to update their edges
+                    EDGETYPE bubbleToMajor = EDGETYPE.fromByte(curMsg.getMeToMajorEdgetype());
+                    EDGETYPE majorToBubble = bubbleToMajor.mirror();
+                    outgoingMsg.reset();
+                    outFlag = 0;
+                    outFlag |= majorToBubble.get() | MessageFlag.UPDATE;
+                    outgoingMsg.setFlag(outFlag);
+                    sendMsg(curMsg.getMajorVertexId(), outgoingMsg);
+//                    boolean flip = curMsg.isFlip(topCoverageVertexMsg);
+//                    curMsg.setFlip(flip);
+//                    curMsg.setTopCoverageVertexId(topCoverageVertexMsg.getSourceVertexId());
+//                    curMsg.setMinorVertexId(getVertexId());
+//                    deletedSet.add(new BubbleMergeMessageWritable(curMsg));
+                    
+                    // 4. store deleted vertices -- for deletedSet
+                    allDeletedSet.add(new VKmerBytesWritable(curMsg.getSourceVertexId()));
                     it.remove();
                 }
             }
-            unchangedSet.add(new BubbleMergeMessageWritable(topCoverageMessage));
-        }
-    }
-    
-    public void processUnchangedSet(){
-        for(BubbleMergeMessageWritable msg : unchangedSet){
-            outFlag = MessageFlag.UNCHANGE;
+            
+            //process unchangedSet -- send message to topVertex to update their coverage
+            outgoingMsg.reset();
+            outFlag = 0;
+            outFlag |= MessageFlag.UNCHANGE;
+            outgoingMsg.setNode(topNode);
             outgoingMsg.setFlag(outFlag);
-            outgoingMsg.setNode(msg.getNode());
-            sendMsg(msg.getSourceVertexId(), outgoingMsg);
+            sendMsg(topMsg.getSourceVertexId(), outgoingMsg);
+//            unchangedSet.add(new BubbleMergeMessageWritable(topCoverageVertexMsg));
         }
     }
     
-    public void processDeletedSet(){
-        for(BubbleMergeMessageWritable msg : deletedSet){
-            outgoingMsg.set(msg);
-            outFlag = MessageFlag.KILL;
-            outgoingMsg.setFlag(outFlag);
-            outgoingMsg.setSourceVertexId(msg.getMinorVertexId());
-            sendMsg(msg.getSourceVertexId(), outgoingMsg);
-        }
-    }
+//    public void processUnchangedSet(){
+//        for(BubbleMergeMessageWritable msg : unchangedSet){
+//            outFlag = MessageFlag.UNCHANGE;
+//            outgoingMsg.setFlag(outFlag);
+//            outgoingMsg.setNode(msg.getNode());
+//            sendMsg(msg.getSourceVertexId(), outgoingMsg);
+//        }
+//    }
+//    
+//    public void processDeletedSet(){
+//        for(BubbleMergeMessageWritable msg : deletedSet){
+//            outgoingMsg.set(msg);
+//            outFlag = MessageFlag.KILL;
+//            outgoingMsg.setFlag(outFlag);
+//            outgoingMsg.setSourceVertexId(msg.getMinorVertexId());
+//            sendMsg(msg.getSourceVertexId(), outgoingMsg);
+//        }
+//    }
     
-    public void processAllDeletedSet(){
-        synchronized(allDeletedSet){
-            for(BubbleMergeMessageWritable msg : allDeletedSet){
-                outgoingMsg.set(msg);
-                outFlag = MessageFlag.KILL;
-                outgoingMsg.setFlag(outFlag);
-                outgoingMsg.setSourceVertexId(msg.getMinorVertexId());
-                sendMsg(msg.getSourceVertexId(), outgoingMsg);
-            }
-        }
-    }
+//    public void processAllDeletedSet(){
+//        synchronized(allDeletedSet){
+//            for(BubbleMergeMessageWritable msg : allDeletedSet){
+//                outgoingMsg.set(msg);
+//                outFlag = MessageFlag.KILL;
+//                outgoingMsg.setFlag(outFlag);
+//                outgoingMsg.setSourceVertexId(msg.getMinorVertexId());
+//                sendMsg(msg.getSourceVertexId(), outgoingMsg);
+//            }
+//        }
+//    }
     
     public void removeEdgesToMajorAndMinor(){
-        byte meToMajorDir = incomingMsg.getMeToMajorDir();
-        byte majorToMeDir = mirrorDirection(meToMajorDir);
-        byte meToMinorDir = incomingMsg.getMeToMinorDir();
-        byte minorToMeDir = mirrorDirection(meToMinorDir);
+        EDGETYPE meToMajorDir = EDGETYPE.fromByte(incomingMsg.getMeToMajorEdgetype());
+        EDGETYPE majorToMeDir = meToMajorDir.mirror();
+        EDGETYPE meToMinorDir = EDGETYPE.fromByte(incomingMsg.getMeToMinorEdgetype());
+        EDGETYPE minorToMeDir = meToMinorDir.mirror();
         getVertexValue().getEdgeList(majorToMeDir).remove(incomingMsg.getMajorVertexId());
         getVertexValue().getEdgeList(minorToMeDir).remove(incomingMsg.getSourceVertexId());
     }
@@ -262,8 +287,8 @@
      * do some remove operations on adjMap after receiving the info about dead Vertex
      */
     public void responseToDeadVertexAndUpdateEdges(){
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         
         if(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()) != null){
             tmpEdge.setAsCopy(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()));
@@ -271,7 +296,7 @@
             getVertexValue().getEdgeList(neighborToMeDir).remove(incomingMsg.getSourceVertexId());
         }
         tmpEdge.setKey(incomingMsg.getTopCoverageVertexId());
-        byte updateDir = flipDirection(neighborToMeDir, incomingMsg.isFlip());
+        EDGETYPE updateDir = incomingMsg.isFlip() ? neighborToMeDir.flip() : neighborToMeDir;
         getVertexValue().getEdgeList(updateDir).unionAdd(tmpEdge);
     }
     
@@ -280,80 +305,96 @@
         initVertex();
         if (getSuperstep() == 1) {
             if(VertexUtil.isBubbleVertex(getVertexValue())){
-                /** clean allDeleteSet **/
+                // clean allDeleteSet 
                 allDeletedSet.clear();
-                /** add a fake node **/
-                addFakeVertex();
-                /** send bubble and major vertex msg to minor vertex **/
+//                // add a fake node
+//                addFakeVertex();
+                // send bubble and major vertex msg to minor vertex 
                 sendBubbleAndMajorVertexMsgToMinorVertex();
             }
         } else if (getSuperstep() == 2){
             if(!isFakeVertex()){
-                /** aggregate bubble nodes and grouped by major vertex **/
+                // aggregate bubble nodes and grouped by major vertex
                 aggregateBubbleNodesByMajorNode(msgIterator);
                 
-                for(VKmerBytesWritable prevId : receivedMsgMap.keySet()){
+                for(VKmerBytesWritable majorVertexId : receivedMsgMap.keySet()){
                     receivedMsgList.clear();
-                    receivedMsgList.addAll(receivedMsgMap.get(prevId));
+                    receivedMsgList = receivedMsgMap.get(majorVertexId);
+//                    receivedMsgList.addAll(receivedMsgMap.get(majorVertexId));
                     if(receivedMsgList.size() > 1){ // filter bubble
-                        /** for each majorVertex, sort the node by decreasing order of coverage **/
-                        receivedMsgList = receivedMsgMap.get(prevId);
+                        // for each majorVertex, sort the node by decreasing order of coverage
                         Collections.sort(receivedMsgList, new BubbleMergeMessageWritable.SortByCoverage());
                         
-                        /** process similarSet, keep the unchanged set and deleted set & add coverage to unchange node **/
+                        // process similarSet, keep the unchanged set and deleted set & add coverage to unchange node 
                         processSimilarSetToUnchangeSetAndDeletedSet();
                         
-                        /** send message to the unchanged set for updating coverage & send kill message to the deleted set **/ 
-                        processUnchangedSet();
-                        processDeletedSet();
+//                        // send message to the unchanged set for updating coverage & send kill message to the deleted set
+//                        processUnchangedSet();
+//                        processDeletedSet();
                     }
                 }
             }
         } else if (getSuperstep() == 3){
-            if(!isFakeVertex()){
-                while(msgIterator.hasNext()) {
-                    incomingMsg = msgIterator.next();
-                    if(incomingMsg.getFlag() == MessageFlag.KILL){
-                        broadcaseUpdateEdges();
-                    } else 
-                    if(incomingMsg.getFlag() == MessageFlag.UNCHANGE){
-                        /** update Node including average coverage **/
-                        getVertexValue().setNode(incomingMsg.getNode());
-                    }
-                }
-            }
-        } else if(getSuperstep() == 4){
-            if(!isFakeVertex()){
-                while(msgIterator.hasNext()) {
-                    incomingMsg = msgIterator.next();
-                    if(isResponseKillMsg()){
-                        responseToDeadVertexAndUpdateEdges();
-                    }
-                }
-            }else{
-                processAllDeletedSet();
+            if(allDeletedSet.contains(getVertexId()))
                 deleteVertex(getVertexId());
+            else{
+                while(msgIterator.hasNext()){
+                    incomingMsg = msgIterator.next();
+                    short msgType = (short) (incomingMsg.getFlag() & MessageFlag.MSG_TYPE_MASK);
+                    switch(msgType){
+                        case MessageFlag.UPDATE:
+                            break;
+                        case MessageFlag.UNCHANGE:
+                            break;
+                    }
+                }
             }
-        } else if(getSuperstep() == 5){
-            while(msgIterator.hasNext()) {
-                incomingMsg = msgIterator.next();
-                if(incomingMsg.getFlag() == MessageFlag.KILL){
+            
+//            if(!isFakeVertex()){
+//                while(msgIterator.hasNext()) {
+//                    incomingMsg = msgIterator.next();
+//                    if(incomingMsg.getFlag() == MessageFlag.KILL){
+//                        broadcaseUpdateEdges();
+//                    } else 
+//                    if(incomingMsg.getFlag() == MessageFlag.UNCHANGE){
+//                        // update Node including average coverage 
+//                        getVertexValue().setNode(incomingMsg.getNode());
+//                    }
+//                }
+//            }
+        } 
+//        else if(getSuperstep() == 4){
+//            if(!isFakeVertex()){
+//                while(msgIterator.hasNext()) {
+//                    incomingMsg = msgIterator.next();
+//                    if(isResponseKillMsg()){
+//                        responseToDeadVertexAndUpdateEdges();
+//                    }
+//                }
+//            }else{
+//                processAllDeletedSet();
+//                deleteVertex(getVertexId());
+//            }
+//        } else if(getSuperstep() == 5){
+//            while(msgIterator.hasNext()) {
+//                incomingMsg = msgIterator.next();
+//                if(incomingMsg.getFlag() == MessageFlag.KILL){
                     broadcaseKillselfAndNoticeToUpdateEdges();
-                    //set statistics counter: Num_RemovedBubbles
-                    updateStatisticsCounter(StatisticsCounter.Num_RemovedBubbles);
-                    getVertexValue().setCounters(counters);
-                }
-            }
-        } else if(getSuperstep() == 6){
-            while(msgIterator.hasNext()) {
-                incomingMsg = msgIterator.next();
-                if(isResponseKillMsg()){
+//                    //set statistics counter: Num_RemovedBubbles
+//                    updateStatisticsCounter(StatisticsCounter.Num_RemovedBubbles);
+//                    getVertexValue().setCounters(counters);
+//                }
+//            }
+//        } else if(getSuperstep() == 6){
+//            while(msgIterator.hasNext()) {
+//                incomingMsg = msgIterator.next();
+//                if(isResponseKillMsg()){
                     responseToDeadVertexAndUpdateEdges();
-                }
-            }
-        }
-        if(!isFakeVertex())
-            voteToHalt();
+//                }
+//            }
+//        }
+//        if(!isFakeVertex())
+//            voteToHalt();
     }
     
     public static void main(String[] args) throws Exception {
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
index ce770e3..47b71a1 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
@@ -1,26 +1,31 @@
 package edu.uci.ics.genomix.pregelix.operator.pathmerge;
 
+import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.Iterator;
+import java.util.logging.Logger;
+
+import org.apache.commons.lang3.StringUtils;
 
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.P4State;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
 import edu.uci.ics.genomix.pregelix.io.message.PathMergeMessageWritable;
 import edu.uci.ics.genomix.pregelix.log.LogUtil;
 import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-import edu.uci.ics.genomix.pregelix.util.VertexUtil;
 import edu.uci.ics.genomix.type.EdgeWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.NodeWritable.DIR;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
-import edu.uci.ics.genomix.type.NodeWritable.OutgoingListFlag;
-import edu.uci.ics.genomix.type.NodeWritable.IncomingListFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 
 public abstract class BasicPathMergeVertex<V extends VertexValueWritable, M extends PathMergeMessageWritable> extends
 	BasicGraphCleanVertex<V, M>{
+    
+    private static final Logger LOG = Logger.getLogger(BasicPathMergeVertex.class.getName());
+    
     protected static final boolean isP1 = true;
     protected static final boolean isP2 = false;
     protected static final boolean isP4 = true;
@@ -32,22 +37,9 @@
     public byte getMsgMergeDir(){
         return (byte) (incomingMsg.getFlag() & MessageFlag.HEAD_CAN_MERGE_MASK);
     }
-
-    public void setHeadMergeDir(){
-        byte state = 0;
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
-        switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
-                state |= State.HEAD_CAN_MERGEWITHPREV;
-                break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
-                state |= State.HEAD_CAN_MERGEWITHNEXT;
-                break;
-        }
-        getVertexValue().setState(state);
+    
+    public byte getAggregatingMsgMergeDir(){
+        return (byte) (aggregatingMsg.getFlag() & MessageFlag.HEAD_CAN_MERGE_MASK);
     }
     
     public boolean isHeadUnableToMerge(){
@@ -55,28 +47,154 @@
         return state == State.HEAD_CANNOT_MERGE;
     }
     
-    public void setStateAsMergeDir(DIR direction){
-        short state = getVertexValue().getState();
-        state &= State.CAN_MERGE_CLEAR;
-        state |= direction == DIR.PREVIOUS ? State.CAN_MERGEWITHPREV : State.CAN_MERGEWITHNEXT;
-        getVertexValue().setState(state);
-        activate();
+    public DIR revert(DIR direction){
+        return direction == DIR.PREVIOUS ? DIR.NEXT : DIR.PREVIOUS;
     }
+
+    /**
+     * send UPDATE msg   boolean: true == P4, false == P2
+     */
+    public void sendUpdateMsg(boolean isP4, DIR direction){ 
+     // TODO pass in the vertexId rather than isP4 (removes this block)
+//        if(isP4)
+//            outgoingMsg.setFlip(ifFlipWithNeighbor(revertDirection)); //ifFilpWithSuccessor()
+//        else 
+//            outgoingMsg.setFlip(ifFilpWithSuccessor(incomingMsg.getSourceVertexId()));
         
+        DIR revertDirection = revert(direction);
+        EnumSet<EDGETYPE> mergeDirs = direction == DIR.PREVIOUS ? EDGETYPE.OUTGOING : EDGETYPE.INCOMING;
+        EnumSet<EDGETYPE> updateDirs = direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING;
+        
+        //set deleteKmer
+        outgoingMsg.setSourceVertexId(getVertexId());
+        
+        //set replaceDir
+        setReplaceDir(mergeDirs);
+                
+        for(EDGETYPE dir : updateDirs){
+            kmerIterator = getVertexValue().getEdgeList(dir).getKeyIterator();
+            while(kmerIterator.hasNext()){
+                //set deleteDir
+                EDGETYPE deleteDir = setDeleteDir(dir);
+                //set mergeDir, so it won't need flip
+                setMergeDir(deleteDir, revertDirection);
+                outgoingMsg.setFlag(outFlag);
+                destVertexId = kmerIterator.next(); //TODO does destVertexId need deep copy?
+                sendMsg(destVertexId, outgoingMsg);
+            }
+        }
+    }
+    
     /**
      * updateAdjList
      */
     public void processUpdate(M msg){
     	// A -> B -> C with B merging with C
         inFlag = msg.getFlag();
-        byte meToNeighborDir = (byte) (inFlag & MessageFlag.DIR_MASK);  // A -> B dir
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);  // B -> A dir
+        EDGETYPE deleteDir = EDGETYPE.fromByte((short) ((inFlag & MessageFlag.DELETE_DIR_MASK) >> 11)); // B -> A dir
+        EDGETYPE mergeDir = EDGETYPE.fromByte((short) ((inFlag & MessageFlag.MERGE_DIR_MASK) >> 9)); // C -> A dir
+        EDGETYPE replaceDir = EDGETYPE.fromByte((short)(inFlag & MessageFlag.REPLACE_DIR_MASK)); // C -> B dir
         
-        // TODO if you want, this logic could be figured out when sending the update from B
-        byte neighborToMergeDir = flipDirection(neighborToMeDir, msg.isFlip());  // A -> C after the merge
-        byte replaceDir = mirrorDirection(neighborToMeDir); // C -> A dir
-        getVertexValue().getNode().updateEdges(neighborToMeDir, msg.getSourceVertexId(), 
-                neighborToMergeDir, replaceDir, msg.getNode(), true);
+        getVertexValue().getNode().updateEdges(deleteDir, msg.getSourceVertexId(), 
+                mergeDir, replaceDir, msg.getNode(), true);
+    }
+    
+    /**
+     * send MERGE msg
+     */
+    public void sendMergeMsg(boolean isP4){
+        byte restrictedDirs = (byte)(getVertexValue().getState() & DIR.MASK);
+        outFlag |= restrictedDirs;
+        
+        DIR direction = null;
+        byte mergeDir = (byte)(getVertexValue().getState() & State.CAN_MERGE_MASK);
+        if(mergeDir == State.CAN_MERGEWITHPREV)
+            direction = DIR.PREVIOUS;
+        else if(mergeDir == State.CAN_MERGEWITHNEXT)
+            direction = DIR.NEXT;
+        if(direction != null){
+            setNeighborToMeDir(direction);
+            outgoingMsg.setFlag(outFlag);
+            outgoingMsg.setSourceVertexId(getVertexId());
+            outgoingMsg.setNode(getVertexValue().getNode()); //half of edges are enough
+            destVertexId = getDestVertexId(direction);
+            sendMsg(destVertexId, outgoingMsg);
+            
+            if(isP4)
+                deleteVertex(getVertexId());
+            else{
+                getVertexValue().setState(State.IS_DEAD);
+                activate();
+            }
+        }
+    }
+    
+    public void aggregateMsg(Iterator<M> msgIterator){
+        while (msgIterator.hasNext()) {
+            incomingMsg = msgIterator.next();
+            //aggregate all the incomingMsgs first
+            switch(getAggregatingMsgMergeDir()){
+                case State.PATH_NON_HEAD:
+                    aggregatingMsg.setFlag(getMsgMergeDir());
+                    activate();
+                    break;
+                case State.HEAD_CAN_MERGEWITHPREV:
+                case State.HEAD_CAN_MERGEWITHNEXT:
+                    if (getAggregatingMsgMergeDir() != getMsgMergeDir())
+                        aggregatingMsg.setFlag(State.HEAD_CANNOT_MERGE);
+                    break;
+                case State.HEAD_CANNOT_MERGE:
+                    break;
+            }
+        }
+    }
+    
+    public void updateState(){
+        switch(getHeadMergeDir()){
+            case State.PATH_NON_HEAD:
+                getVertexValue().setState(getAggregatingMsgMergeDir());
+                activate();
+                break;
+            case State.HEAD_CAN_MERGEWITHPREV:
+            case State.HEAD_CAN_MERGEWITHNEXT:
+                if (getHeadMergeDir() != getAggregatingMsgMergeDir()){
+                    getVertexValue().setState(State.HEAD_CANNOT_MERGE);
+                    voteToHalt();
+                }
+                break;
+            case State.HEAD_CANNOT_MERGE:
+                voteToHalt();
+                break;
+        }
+    }
+    
+    public void setReplaceDir(EnumSet<EDGETYPE> mergeDirs){
+        EDGETYPE replaceDir = null;
+        for(EDGETYPE dir : mergeDirs){
+            int num = getVertexValue().getEdgeList(dir).getCountOfPosition();
+            if(num > 0){
+                if(num != 1)
+                    throw new IllegalStateException("Only can sendUpdateMsg to degree = 1 direction!");
+                outgoingMsg.getNode().setEdgeList(dir, getVertexValue().getEdgeList(dir));
+                replaceDir = dir;
+                break;
+            }
+        }
+        outFlag &= MessageFlag.REPLACE_DIR_CLEAR;
+        outFlag |= replaceDir.get();
+    }
+    
+    public EDGETYPE setDeleteDir(EDGETYPE dir){
+        EDGETYPE deleteDir = dir.mirror();
+        outFlag &= MessageFlag.DELETE_DIR_CLEAR;
+        outFlag |= deleteDir.get();
+        return deleteDir;
+    }
+    
+    public void setMergeDir(EDGETYPE deleteDir, DIR revertDirection){
+        EDGETYPE mergeDir = ifFlipWithNeighbor(revertDirection) ? deleteDir.flip() : deleteDir;
+        outFlag &= MessageFlag.MERGE_DIR_CLEAR;
+        outFlag |= mergeDir.get();
     }
     
     /**
@@ -84,10 +202,10 @@
      */
     public void processFinalUpdate(){
         inFlag = incomingMsg.getFlag();
-        byte meToNeighborDir = (byte) (inFlag & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         
-        byte neighborToMergeDir = flipDirection(neighborToMeDir, incomingMsg.isFlip());
+        EDGETYPE neighborToMergeDir = incomingMsg.isFlip() ? neighborToMeDir.flip() : neighborToMeDir;
         getVertexValue().processFinalUpdates(neighborToMeDir, neighborToMergeDir, incomingMsg.getNode());
     }
     
@@ -96,8 +214,8 @@
      */
     public void processFinalUpdate2(){
         inFlag = incomingMsg.getFlag();
-        byte meToNeighborDir = (byte) (inFlag & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(inFlag);
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         
         EdgeWritable edge = new EdgeWritable();
         edge.setKey(incomingMsg.getSourceVertexId());
@@ -105,20 +223,6 @@
         getVertexValue().getEdgeList(neighborToMeDir).unionAdd(edge);
     }
     
-    public byte flipHeadMergeDir(byte d, boolean isFlip){
-        if(isFlip){
-            switch(d){
-                case State.HEAD_CAN_MERGEWITHPREV:
-                    return State.HEAD_CAN_MERGEWITHNEXT;
-                case State.HEAD_CAN_MERGEWITHNEXT:
-                    return State.HEAD_CAN_MERGEWITHPREV;
-                    default:
-                        return 0;
-            }
-        } else
-            return d;
-    }
-    
     public boolean isDifferentDirWithMergeKmer(byte neighborToMeDir){
         return neighborToMeDir == MessageFlag.DIR_FR || neighborToMeDir == MessageFlag.DIR_RF;
     }
@@ -144,50 +248,16 @@
      */
     public void processMerge(PathMergeMessageWritable msg){
         inFlag = msg.getFlag();
-        byte meToNeighborDir = (byte) (inFlag & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(inFlag);
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
 
-        if(isNonHeadReceivedFromHead()){ // TODO? why sepcial-case the path vs heads?  just aggregate your state flags
-            short state = getVertexValue().getState();
-            state &= State.HEAD_CAN_MERGE_CLEAR;
-            byte headMergeDir = flipHeadMergeDir((byte)(inFlag & MessageFlag.HEAD_CAN_MERGE_MASK), isDifferentDirWithMergeKmer(neighborToMeDir));
-            state |= headMergeDir;
-            getVertexValue().setState(state);
-        }
+        short state = getVertexValue().getState();  
+//        state |= flipHeadMergeDir((byte)(inFlag & DIR.MASK), isDifferentDirWithMergeKmer(neighborToMeDir));
+        getVertexValue().setState(state);
         
         getVertexValue().processMerges(neighborToMeDir, msg.getNode(), kmerSize);
     }
     
-    
-    /**
-     * send UPDATE msg   boolean: true == P4, false == P2
-     */
-    public void sendUpdateMsg(boolean isP4, DIR direction){ 
-        outgoingMsg.setSourceVertexId(getVertexId());
-        // TODO pass in the vertexId rather than isP4 (removes this block)
-        if(isP4)
-            outgoingMsg.setFlip(ifFlipWithNeighbor(direction == DIR.NEXT)); //ifFilpWithSuccessor()
-        else 
-            outgoingMsg.setFlip(ifFilpWithSuccessor(incomingMsg.getSourceVertexId()));
-        
-        byte[] mergeDirs = direction == DIR.PREVIOUS ? OutgoingListFlag.values : IncomingListFlag.values;
-        byte[] updateDirs = direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
-        
-        for(byte dir : mergeDirs)
-            outgoingMsg.getNode().setEdgeList(dir, getVertexValue().getEdgeList(dir));
-        
-        for(byte dir : updateDirs){
-            kmerIterator = getVertexValue().getEdgeList(dir).getKeyIterator();
-            while(kmerIterator.hasNext()){
-                outFlag &= MessageFlag.DIR_CLEAR;
-                outFlag |= dir;
-                outgoingMsg.setFlag(outFlag);
-                destVertexId.setAsCopy(kmerIterator.next()); //TODO does destVertexId need deep copy?
-                sendMsg(destVertexId, outgoingMsg);
-            }
-        }
-    }
-
     /**
      * override sendUpdateMsg and use incomingMsg as parameter automatically
      */
@@ -206,15 +276,15 @@
     public void sendUpdateMsgForP2(MessageWritable msg){
         outgoingMsg.reset();
         outgoingMsg.setUpdateMsg(true);
-        byte meToNeighborDir = (byte) (msg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 sendUpdateMsg(isP2, DIR.PREVIOUS);
                 break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR: 
+            case RF:
+            case RR: 
                 sendUpdateMsg(isP2, DIR.NEXT);
                 break;
         }
@@ -240,57 +310,43 @@
         else
             outgoingMsg.setFlip(false);
         outgoingMsg.setFlag(outFlag);
-//        outgoingMsg.setNeighberNode(getVertexValue().getIncomingList());
-        for(byte d: IncomingListFlag.values)
+        for(EDGETYPE d: EDGETYPE.INCOMING)
         	outgoingMsg.setEdgeList(d, getVertexValue().getEdgeList(d));
         outgoingMsg.setSourceVertexId(getVertexId());
         outgoingMsg.setInternalKmer(getVertexValue().getInternalKmer());
-        sendMsg(getNextDestVertexId(), outgoingMsg);
+        sendMsg(getDestVertexId(DIR.NEXT), outgoingMsg);
     }
     
     public boolean canMergeWithHead(MessageWritable msg){
-        byte meToNeighborDir = (byte) (msg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(msg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 return getVertexValue().outDegree() == 1;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
+            case RF:
+            case RR:
                 return getVertexValue().inDegree() == 1;    
         }
         return false;
     }
     
     public void sendMergeMsgByIncomingMsgDir(){
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 configureMergeMsgForSuccessor(incomingMsg.getSourceVertexId());
                 break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
+            case RF:
+            case RR:
                 configureMergeMsgForPredecessor(incomingMsg.getSourceVertexId()); 
                 break; 
         }
     }
     
     /**
-     * send MERGE msg
-     */
-    public void sendMergeMsg(boolean toPredecessor, VKmerBytesWritable mergeDest){
-        setNeighborToMeDir(DIR.PREVIOUS);
-        outgoingMsg.setFlag(outFlag);
-        outgoingMsg.setSourceVertexId(getVertexId());
-//        for(byte d: OutgoingListFlag.values)
-//            outgoingMsg.setEdgeList(d, getVertexValue().getEdgeList(d));
-        outgoingMsg.setNode(getVertexValue().getNode());
-        sendMsg(mergeDest, outgoingMsg);
-    }
-    
-    /**
      * configure MERGE msg  TODO: delete edgelist, merge configureMergeMsgForPredecessor and configureMergeMsgForPredecessorByIn...
      */
     public void configureMergeMsgForPredecessor(VKmerBytesWritable mergeDest){
@@ -313,36 +369,6 @@
         sendMsg(mergeDest, outgoingMsg);
     }
     
-    
-    /**
-     * send merge message to neighber for P4, send message to the merge object and kill self
-     */
-    public void broadcastMergeMsg(boolean isP4){
-        outFlag |= getHeadMergeDir();
-        switch(getVertexValue().getState() & State.CAN_MERGE_MASK) {
-            case State.CAN_MERGEWITHNEXT:
-                // configure merge msg for successor
-                configureMergeMsgForSuccessor(getNextDestVertexId()); // TODO getDestVertexId(DIRECTION), then remove the switch statement, sendMergeMsg(DIRECTION)
-                if(isP4)
-                    deleteVertex(getVertexId());
-                else{
-                    getVertexValue().setState(State.IS_DEAD);
-                    activate();
-                }
-                break;
-            case State.CAN_MERGEWITHPREV:
-                // configure merge msg for predecessor
-                configureMergeMsgForPredecessor(getPrevDestVertexId());
-                if(isP4)
-                    deleteVertex(getVertexId());
-                else{
-                    getVertexValue().setState(State.IS_DEAD);
-                    activate();
-                }
-                break; 
-        }
-    }
-    
     public byte revertHeadMergeDir(byte headMergeDir){
         switch(headMergeDir){
             case MessageFlag.HEAD_CAN_MERGEWITHPREV:
@@ -369,4 +395,249 @@
         String logMessage = LogUtil.getMessageLog(loggingType, getSuperstep(), getVertexId(), msg, dest);
         logger.fine(logMessage);
     }
+    
+    /*
+     * garbage
+     */
+    public void setHeadMergeDir(){
+        byte state = 0;
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
+        switch(neighborToMeDir){
+            case FF:
+            case FR:
+                state |= State.HEAD_CAN_MERGEWITHPREV;
+                break;
+            case RF:
+            case RR:
+                state |= State.HEAD_CAN_MERGEWITHNEXT;
+                break;
+        }
+        getVertexValue().setState(state);
+    }
+    
+// 2013.9.21 --------------------------------------------------------------------------------------------------//
+    /**
+     * Send merge restrictions to my neighbor nodes
+     */
+    public void restrictNeighbors() {
+        EnumSet<DIR> dirsToRestrict;
+        VertexValueWritable vertex = getVertexValue();
+        short state = vertex.getState();
+        boolean updated = false;
+        if(isTandemRepeat(vertex)) {
+            // tandem repeats are not allowed to merge at all
+            dirsToRestrict = EnumSet.of(DIR.NEXT, DIR.PREVIOUS);
+            state |= DIR.NEXT.get();
+            state |= DIR.PREVIOUS.get();
+            updated = true;
+        }
+        else {
+            // degree > 1 can't merge in that direction; == 0 means we are a tip 
+            dirsToRestrict = EnumSet.noneOf(DIR.class);
+            for (DIR dir : DIR.values()) {
+                if (vertex.getDegree(dir) > 1 || vertex.getDegree(dir) == 0) {
+                    dirsToRestrict.add(dir);
+                    state |= dir.get();
+                    updated = true;
+                }
+            }
+        }
+        if (updated) {
+            vertex.setState(state);
+            if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class)))
+                voteToHalt();
+            else 
+                activate();
+        }
+        
+        // send a message to each neighbor indicating they can't merge towards me
+        for (DIR dir : dirsToRestrict) {
+            for (EDGETYPE et : dir.edgeType()) {
+                for (VKmerBytesWritable destId : vertex.getEdgeList(et).getKeys()) {
+                    if (debug)
+                        for (VKmerBytesWritable problemKmer : problemKmers)
+                            verbose |= destId.equals(problemKmer);
+                    outgoingMsg.reset();
+                    outgoingMsg.setFlag(et.mirror().dir().get());
+                    
+                    if (verbose)
+                        LOG.fine("send restriction from " + getVertexId() + " to " + destId + 
+                                " in my " + et + " and their " + et.mirror() + 
+                                " (" + EDGETYPE.dir(et.mirror()) + 
+                                "); I am " + getVertexValue());
+                    sendMsg(destId, outgoingMsg);
+                }
+            }
+        }
+    }
+    
+    /**
+     * initiate head, rear and path node
+     */
+    public void recieveRestrictions(Iterator<M> msgIterator) {
+        short restrictedDirs = getVertexValue().getState();  // the directions (NEXT/PREVIOUS) that I'm not allowed to merge in
+        boolean updated = false;
+        while (msgIterator.hasNext()) {
+            if (verbose)
+                LOG.fine("before restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
+            incomingMsg = msgIterator.next();
+            restrictedDirs |= incomingMsg.getFlag();
+            if (verbose)
+                LOG.fine("after restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
+            updated = true;
+        }
+        if (updated) {
+            getVertexValue().setState(restrictedDirs);
+            if (DIR.enumSetFromByte(restrictedDirs).containsAll(EnumSet.allOf(DIR.class)))
+                voteToHalt();
+            else 
+                activate();
+        }
+    }
+    
+    public void updateNeighbors() {
+        VertexValueWritable vertex = getVertexValue();
+        short state = vertex.getState();
+        EDGETYPE edgeType = EDGETYPE.fromByte(state);
+        if ((state & P4State.MERGE) == 0) {
+            return;  // no merge requested; don't have to update neighbors
+        }
+        
+        DIR mergeDir = edgeType.dir(); 
+        EnumSet<EDGETYPE> mergeEdges = mergeDir.edgeType();
+        
+        DIR updateDir = mergeDir.mirror();
+        EnumSet<EDGETYPE> updateEdges = updateDir.edgeType();
+        
+        // prepare the update message s.t. the receiver can do a simple unionupdate
+        // that means we figure out any hops and place our merge-dir edges in the appropriate list of the outgoing msg
+        for (EDGETYPE updateEdge : updateEdges) {
+            outgoingMsg.reset();
+            outgoingMsg.setSourceVertexId(getVertexId());
+            outFlag = 0;
+            outFlag |= MessageFlag.TO_UPDATE | updateEdge.mirror().get(); // neighbor's edge to me (so he can remove me)
+            outgoingMsg.setFlag(outFlag);
+            for (EDGETYPE mergeEdge : mergeEdges) {
+                EDGETYPE newEdgetype = EDGETYPE.resolveLinkThroughMiddleNode(updateEdge, mergeEdge);
+                outgoingMsg.getNode().setEdgeList(newEdgetype, getVertexValue().getEdgeList(mergeEdge));  // copy into outgoingMsg
+            }
+            if (debug)
+                for (VKmerBytesWritable problemKmer : problemKmers)
+                    verbose |= outgoingMsg.getNode().findEdge(problemKmer) != null;
+            
+            // send the update to all kmers in this list // TODO perhaps we could skip all this if there are no neighbors here
+            for (VKmerBytesWritable dest : vertex.getEdgeList(updateEdge).getKeys()) {
+                if (verbose)
+                    LOG.fine("send update message from " + getVertexId() + " to " + dest + ": " + outgoingMsg);
+                sendMsg(dest, outgoingMsg);
+            }
+        }
+    }
+    
+    public void receiveUpdates(Iterator<M> msgIterator){
+        VertexValueWritable vertex = getVertexValue(); 
+        NodeWritable node = vertex.getNode();
+        boolean updated = false;
+        ArrayList<PathMergeMessageWritable> allSeenMsgs = new ArrayList<PathMergeMessageWritable>();
+        while (msgIterator.hasNext()) {
+            incomingMsg = msgIterator.next();
+            if (debug)
+                for (VKmerBytesWritable problemKmer : problemKmers)
+                    verbose |= incomingMsg.getNode().findEdge(problemKmer) != null || incomingMsg.getSourceVertexId().equals(problemKmer);
+            if (verbose)
+                LOG.fine("before update from neighbor: " + getVertexValue());
+            // remove the edge to the node that will merge elsewhere
+            node.getEdgeList(EDGETYPE.fromByte(incomingMsg.getFlag())).remove(incomingMsg.getSourceVertexId());
+            // add the node this neighbor will merge into
+            for (EDGETYPE edgeType : EnumSet.allOf(EDGETYPE.class)) {
+                node.getEdgeList(edgeType).unionUpdate(incomingMsg.getEdgeList(edgeType));
+            }
+            updated = true;
+            if (verbose) { 
+                LOG.fine("after update from neighbor: " + getVertexValue());
+                allSeenMsgs.add(incomingMsg);
+            }
+        }
+        if (verbose)
+            LOG.fine("All recieved updates:  \n{\n" + StringUtils.join(allSeenMsgs, "\n") + "\n}\n");
+        if (updated) {
+            if (DIR.enumSetFromByte(vertex.getState()).containsAll(EnumSet.allOf(DIR.class)))
+                voteToHalt();
+            else 
+                activate();
+        }
+    }
+    
+    public void sendMergeMsg() {
+        VertexValueWritable vertex = getVertexValue();
+        short state = vertex.getState();
+        if ((state & P4State.MERGE) != 0) {
+            outgoingMsg.reset();
+            // tell neighbor where this is coming from (so they can merge kmers and delete)
+            EDGETYPE mergeEdgetype = EDGETYPE.fromByte(vertex.getState());
+            byte neighborRestrictions = DIR.fromSet(mergeEdgetype.causesFlip() ? DIR.flipSetFromByte(state) : DIR.enumSetFromByte(state));
+            
+            outgoingMsg.setFlag((short) (mergeEdgetype.mirror().get() | neighborRestrictions));
+            outgoingMsg.setSourceVertexId(getVertexId());
+            outgoingMsg.setNode(vertex.getNode());
+            if (vertex.getDegree(mergeEdgetype.dir()) != 1)
+                throw new IllegalStateException("Merge attempted in node with degree in " + mergeEdgetype + " direction != 1!\n" + vertex);
+            VKmerBytesWritable dest = vertex.getEdgeList(mergeEdgetype).get(0).getKey();
+            sendMsg(dest, outgoingMsg);
+            deleteVertex(getVertexId());
+            
+            if (verbose) {
+                LOG.fine("send merge mesage from " + getVertexId() + " to " + dest + ": " + outgoingMsg + "; my restrictions are: " + DIR.enumSetFromByte(vertex.getState()) + ", their restrictions are: " + DIR.enumSetFromByte(outgoingMsg.getFlag()));
+                LOG.fine("killing self: " + getVertexId());
+            }
+        }
+    }
+    
+    /**
+     * step4: receive and process Merges 
+     */
+    public void receiveMerges(Iterator<M> msgIterator) {
+        VertexValueWritable vertex = getVertexValue();
+        NodeWritable node = vertex.getNode();
+        short state = vertex.getState();
+        boolean updated = false;
+        EDGETYPE senderEdgetype;
+        @SuppressWarnings("unused")
+        int numMerged = 0;
+        while (msgIterator.hasNext()) {
+            incomingMsg = msgIterator.next();
+            if (debug)
+                for (VKmerBytesWritable problemKmer : problemKmers)
+                    verbose |= incomingMsg.getNode().findEdge(problemKmer) != null;
+            if (verbose)
+                LOG.fine("before merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
+            senderEdgetype = EDGETYPE.fromByte(incomingMsg.getFlag());
+            node.mergeWithNode(senderEdgetype, incomingMsg.getNode());
+            state |= (byte) (incomingMsg.getFlag() & DIR.MASK);  // update incoming restricted directions
+            numMerged++;
+            updated = true;
+            if (verbose)
+                LOG.fine("after merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
+        }
+        if(isTandemRepeat(getVertexValue())) {
+            // tandem repeats can't merge anymore; restrict all future merges
+            state |= DIR.NEXT.get();
+            state |= DIR.PREVIOUS.get();
+            updated = true;
+            if (verbose)
+                LOG.fine("recieveMerges is a tandem repeat: " + getVertexId() + " " + getVertexValue());
+//          updateStatisticsCounter(StatisticsCounter.Num_Cycles); 
+        }
+//      updateStatisticsCounter(StatisticsCounter.Num_MergedNodes);
+//      getVertexValue().setCounters(counters);
+        if (updated) {
+            vertex.setState(state);
+            if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class)))
+                voteToHalt();
+            else 
+                activate();
+        }
+    }
+    
 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P0ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P0ForPathMergeVertex.java
new file mode 100644
index 0000000..672d9ac
--- /dev/null
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P0ForPathMergeVertex.java
@@ -0,0 +1,393 @@
+package edu.uci.ics.genomix.pregelix.operator.pathmerge;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
+import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.VKmerListWritable;
+import edu.uci.ics.genomix.type.NodeWritable.DIR;
+import edu.uci.ics.genomix.pregelix.client.Client;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
+import edu.uci.ics.genomix.pregelix.io.message.PathMergeMessageWritable;
+import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
+import edu.uci.ics.genomix.pregelix.type.MessageFlag;
+import edu.uci.ics.genomix.pregelix.util.VertexUtil;
+
+/**
+ * Graph clean pattern: P1(Naive-algorithm) for path merge 
+ * @author anbangx
+ *
+ */
+public class P0ForPathMergeVertex extends
+    MapReduceVertex<VertexValueWritable, PathMergeMessageWritable> {
+    
+    private ArrayList<PathMergeMessageWritable> receivedMsg = new ArrayList<PathMergeMessageWritable>();
+    private HashMap<VKmerBytesWritable, ArrayList<Byte>> dirMapper = new HashMap<VKmerBytesWritable, ArrayList<Byte>>();
+    
+    private EdgeWritable tmpEdge = new EdgeWritable();
+    /**
+     * initiate kmerSize, maxIteration
+     */
+    public void initVertex() {
+        super.initVertex();
+        if(incomingMsg == null)
+            incomingMsg = new PathMergeMessageWritable();
+        if(outgoingMsg == null)
+            outgoingMsg = new PathMergeMessageWritable();
+        else
+            outgoingMsg.reset();
+        if(destVertexId == null)
+            destVertexId = new VKmerBytesWritable();
+        inFlag = 0;
+        outFlag = 0;
+        if(repeatKmer == null)
+            repeatKmer = new VKmerBytesWritable();
+        tmpValue.reset();
+        synchronized(lock){
+            if(fakeVertex == null){
+                fakeVertex = new VKmerBytesWritable();
+                String fake = generateString(kmerSize + 1);//generaterRandomString(kmerSize + 1);
+                fakeVertex.setByRead(kmerSize + 1, fake.getBytes(), 0); 
+            }
+        }
+        if(tmpKmer == null)
+            tmpKmer = new VKmerBytesWritable();
+        if(reverseKmer == null)
+            reverseKmer = new VKmerBytesWritable();
+        if(kmerList == null)
+            kmerList = new VKmerListWritable();
+        else
+            kmerList.reset();
+        if(getSuperstep() == 1)
+            StatisticsAggregator.preGlobalCounters.clear();
+//        else
+//            StatisticsAggregator.preGlobalCounters = BasicGraphCleanVertex.readStatisticsCounterResult(getContext().getConfiguration());
+        counters.clear();
+        getVertexValue().getCounters().clear();
+    }
+    
+    /**
+     * map reduce in FakeNode
+     */
+    public void aggregateMsgAndGroupInFakeNode(Iterator<PathMergeMessageWritable> msgIterator){
+        kmerMapper.clear();
+        dirMapper.clear();
+        /** Mapper **/
+        mapKeyByInternalKmer(msgIterator);
+        /** Reducer **/
+        reduceKeyByInternalKmer();
+    }
+    
+    /**
+     * typical for P1
+     */
+    @Override
+    public void mapKeyByInternalKmer(Iterator<PathMergeMessageWritable> msgIterator){
+        byte dir = 0;
+        while(msgIterator.hasNext()){
+            incomingMsg = msgIterator.next();
+            String kmerString = incomingMsg.getInternalKmer().toString();
+            tmpKmer.setByRead(kmerString.length(), kmerString.getBytes(), 0);
+            reverseKmer.setByReadReverse(kmerString.length(), kmerString.getBytes(), 0);
+
+            VKmerBytesWritable kmer = new VKmerBytesWritable();
+            kmerList = new VKmerListWritable();
+            if(reverseKmer.compareTo(tmpKmer) > 0){
+                dir = KmerDir.FORWARD;
+                kmer.setAsCopy(tmpKmer);
+            }
+            else{
+                dir = KmerDir.REVERSE;
+                kmer.setAsCopy(reverseKmer);
+            }
+            if(!kmerMapper.containsKey(kmer)){
+                //kmerList.reset();
+                kmerList.append(incomingMsg.getSourceVertexId());
+                kmerMapper.put(kmer, kmerList);
+            } else{
+                kmerList.setCopy(kmerMapper.get(kmer));
+                kmerList.append(incomingMsg.getSourceVertexId());
+                kmerMapper.put(kmer, kmerList);
+            }
+            //dirMapper
+            ArrayList<Byte> dirList = new ArrayList<Byte>();
+            if(!dirMapper.containsKey(kmer)){
+                dirList.clear();
+                dirList.add(dir);
+                dirMapper.put(kmer, dirList);
+            } else{
+                dirList.clear();
+                dirList.addAll(dirMapper.get(kmer));
+                dirList.add(dir);
+                dirMapper.put(kmer, dirList);
+            }
+        }
+    }
+    
+    /**
+     * typical for P1
+     */
+    @Override
+    public void reduceKeyByInternalKmer(){
+        for (VKmerBytesWritable key : kmerMapper.keySet()) {
+            kmerList = kmerMapper.get(key);
+            //always delete kmerList(1), keep kmerList(0)
+
+            //send kill message to kmerList(1), and carry with kmerList(0) to update edgeLists of kmerList(1)'s neighbor
+            outgoingMsg.setFlag(MessageFlag.KILL);
+            outgoingMsg.getNode().setInternalKmer(kmerList.getPosition(0));
+            boolean isFlip = dirMapper.get(key).get(0) == dirMapper.get(key).get(1) ? false : true;
+            outgoingMsg.setFlip(isFlip);
+            destVertexId.setAsCopy(kmerList.getPosition(1));
+            sendMsg(destVertexId, outgoingMsg);
+        }
+    }
+ 
+    /**
+     * typical for P1
+     * do some remove operations on adjMap after receiving the info about dead Vertex
+     */
+    public void responseToDeadVertexAndUpdateEdges(){
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
+        
+        if(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()) != null){
+            tmpEdge.setAsCopy(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()));
+            
+            getVertexValue().getEdgeList(neighborToMeDir).remove(incomingMsg.getSourceVertexId());
+        }
+        tmpEdge.setKey(incomingMsg.getNode().getInternalKmer());
+        EDGETYPE updateDir = incomingMsg.isFlip() ? neighborToMeDir.flip() : neighborToMeDir; 
+        getVertexValue().getEdgeList(updateDir).unionAdd(tmpEdge);
+    }
+    
+    /**
+     * head send update message
+     */
+    public void headSendUpdateMsg(){
+        if(isHeadNode()){
+            byte headMergeDir = (byte)(getVertexValue().getState() & State.HEAD_CAN_MERGE_MASK);
+            switch(headMergeDir){
+                case State.HEAD_CAN_MERGEWITHPREV:
+                    sendUpdateMsg(isP1, DIR.NEXT);
+                    break;
+                case State.HEAD_CAN_MERGEWITHNEXT:
+                    sendUpdateMsg(isP1, DIR.PREVIOUS);
+                    break;
+            }
+        } else
+            voteToHalt();
+    }
+    
+    /**
+     * process update when receiving update msg
+     */
+    public void processUpdateOnceReceiveMsg(Iterator<PathMergeMessageWritable> msgIterator){
+        while(msgIterator.hasNext()){
+            incomingMsg = msgIterator.next();
+            processUpdate(incomingMsg);
+            if(isHaltNode())
+                voteToHalt();
+            else
+                activate();
+        }
+    }
+    /**
+     * aggregate received msg
+     */
+    public void aggregateReceivedMsg(Iterator<PathMergeMessageWritable> msgIterator){
+        receivedMsg.clear();
+        while(msgIterator.hasNext()){
+            incomingMsg = msgIterator.next();
+            receivedMsg.add(incomingMsg);
+        }
+    }
+    
+    /**
+     * process message directly
+     */
+    public void processMessageDirectly(){
+        for(int i = 0; i < 2; i++)
+            processMerge(receivedMsg.get(i));
+        //final vertex
+        getVertexValue().setState(MessageFlag.IS_HALT);
+        voteToHalt();
+    }
+    
+    /**
+     * processMerge and sendMsgToFake
+     */
+    public void processMergeAndSendMsgToFake(){
+        boolean isHead = isHeadNode();
+        boolean isDead = isDeadNode();
+        processMerge(receivedMsg.get(0));
+        if(isHead || isDead){
+            // NON-FAKE and Final vertice send msg to FAKE vertex 
+            sendMsgToFakeVertex();
+            //final vertex
+            getVertexValue().setState(MessageFlag.IS_HALT);
+            voteToHalt();
+        } else
+            activate();
+    }
+    
+    /**
+     * if receive kill msg, broadcaseKillself
+     */
+    public void broadcaseKillselfOnceReceiveKillMsg(Iterator<PathMergeMessageWritable> msgIterator){
+        while(msgIterator.hasNext()){
+            incomingMsg = msgIterator.next();
+            if(isReceiveKillMsg()){
+                outgoingMsg.setInternalKmer(incomingMsg.getNode().getInternalKmer());
+                outgoingMsg.setFlip(incomingMsg.isFlip());
+                broadcaseKillself();
+            } 
+        }
+    }
+    
+    /**
+     * if receive dead msg, responseToDeadVertexAndUpdateEdges
+     */
+    public void responseToDeadVertexAndUpdateEdgesOnceReceiveDeadMsg(Iterator<PathMergeMessageWritable> msgIterator){
+        while(msgIterator.hasNext()){
+            incomingMsg = msgIterator.next();
+            if(isResponseKillMsg())
+                responseToDeadVertexAndUpdateEdges();
+        } 
+        if(isHeadNode())
+            activate();
+        else
+            voteToHalt();
+    }
+    
+    /**
+     * start sending message
+     */
+    public void startSendMsg() {
+        if(isTandemRepeat(getVertexValue())){
+            copyWithoutTandemRepeats(getVertexValue(), tmpValue);
+            outFlag = 0;
+            sendSettledMsgToAllNeighborNodes(tmpValue);
+            voteToHalt();
+        } else{
+            /** check incoming **/
+            // update internal state
+            if (VertexUtil.isVertexWithOnlyOneIncoming(getVertexValue())){
+                byte state = 0;
+                state |= State.HEAD_CAN_MERGEWITHPREV;
+                getVertexValue().setState(state);
+                activate();
+            } 
+            // send to neighbors
+            else if (VertexUtil.isVertexWithManyIncoming(getVertexValue())){
+                outFlag = 0;
+                sendSettledMsgs(DIR.PREVIOUS, getVertexValue());
+                 }
+            
+            /** check outgoing **/
+            // update internal state
+            if (VertexUtil.isVertexWithOnlyOneOutgoing(getVertexValue())){
+                byte state = 0;
+                state |= State.HEAD_CAN_MERGEWITHNEXT;
+                getVertexValue().setState(state);
+                activate();
+            } 
+            // send to neighbors
+            else if (VertexUtil.isVertexWithManyOutgoing(getVertexValue())){
+                outFlag = 0;
+                sendSettledMsgs(DIR.NEXT, getVertexValue());
+                 }
+            
+            if(VertexUtil.isUnMergeVertex(getVertexValue()))
+                voteToHalt();
+         }
+     }
+    
+        public void initState(Iterator<PathMergeMessageWritable> msgIterator) {
+                if(isInactiveNode())
+                    voteToHalt();
+                else{
+                    while (msgIterator.hasNext()) {
+                        incomingMsg = msgIterator.next();
+                        switch(getHeadMergeDir()){
+                            case State.PATH_NON_HEAD: // TODO Change name to Path
+                                setHeadMergeDir();
+                                activate();
+                                break;
+                            case State.HEAD_CAN_MERGEWITHPREV: // TODO aggregate all the incomingMsgs first, then make a decision about halting
+                            case State.HEAD_CAN_MERGEWITHNEXT:
+                                if(true){ //if (getHeadFlagAndMergeDir() != getMsgFlagAndMergeDir()){
+                                    getVertexValue().setState(State.HEAD_CANNOT_MERGE);
+                                    voteToHalt();
+                                }
+                                break;
+                            case State.HEAD_CANNOT_MERGE:
+                                voteToHalt();
+                                break;
+                        }
+                    }
+                }
+        }
+
+    
+    @Override
+    public void compute(Iterator<PathMergeMessageWritable> msgIterator) {
+        initVertex();
+        if (getSuperstep() == 1) {
+            addFakeVertex();
+            startSendMsg();
+        } else if (getSuperstep() == 2)
+            if(!isFakeVertex())
+                initState(msgIterator);
+            else voteToHalt();
+        else if (getSuperstep() % 7 == 3 && getSuperstep() <= maxIteration) {
+            //head send update message
+            headSendUpdateMsg();
+        } else if (getSuperstep() % 7 == 4 && getSuperstep() <= maxIteration) {
+            //process update when receiving updateMsg
+            processUpdateOnceReceiveMsg(msgIterator);
+        } else if (getSuperstep() % 7 == 5 && getSuperstep() <= maxIteration) {
+            //head broadcastMergeMsg, while non-head voteToHalt
+            if(isHeadNode())
+                sendMergeMsg(isP1);
+            else
+                voteToHalt();
+        } else if (getSuperstep() % 7 == 6 && getSuperstep() <= maxIteration) {
+            if(!msgIterator.hasNext() && isDeadNode())
+                deleteVertex(getVertexId());
+            else{
+                //aggregate received msg
+                aggregateReceivedMsg(msgIterator);
+                if(receivedMsg.size() == 2){ //#incomingMsg == even
+                    //processMerge directly
+                    processMessageDirectly();
+                } else if(receivedMsg.size() == 1){
+                    //processMerge and sendMsgToFake
+                    processMergeAndSendMsgToFake();
+                }
+            }
+        } else if (getSuperstep() % 7 == 0 && getSuperstep() <= maxIteration){
+            if(isFakeVertex()){//is FakeVertex
+                // Fake vertex agregates message and group them by actual kmer (1) 
+                aggregateMsgAndGroupInFakeNode(msgIterator);
+                voteToHalt();
+            }
+        } else if (getSuperstep() % 7 == 1 && getSuperstep() <= maxIteration){
+            //if receive kill msg, broadcaseKillself
+            broadcaseKillselfOnceReceiveKillMsg(msgIterator);
+        } else if (getSuperstep() % 7 == 2 && getSuperstep() <= maxIteration){
+            //if receive dead msg, responseToDeadVertexAndUpdateEdges
+            responseToDeadVertexAndUpdateEdgesOnceReceiveDeadMsg(msgIterator);
+        }
+        else
+            voteToHalt();
+    }
+
+    public static void main(String[] args) throws Exception {
+        Client.run(args, getConfiguredJob(null, P0ForPathMergeVertex.class));
+    }
+}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P1ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P1ForPathMergeVertex.java
index d6e488c..3210698 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P1ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P1ForPathMergeVertex.java
@@ -1,36 +1,32 @@
 package edu.uci.ics.genomix.pregelix.operator.pathmerge;
 
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.EnumSet;
+import java.util.HashSet;
 import java.util.Iterator;
 
-import edu.uci.ics.genomix.type.EdgeWritable;
-import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.VKmerListWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DIR;
 import edu.uci.ics.genomix.pregelix.client.Client;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
-import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.P4State;
 import edu.uci.ics.genomix.pregelix.io.message.PathMergeMessageWritable;
 import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-import edu.uci.ics.genomix.pregelix.util.VertexUtil;
+import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
+import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.DIR;
 
-/**
- * Graph clean pattern: P1(Naive-algorithm) for path merge 
- * @author anbangx
- *
- */
 public class P1ForPathMergeVertex extends
-    MapReduceVertex<VertexValueWritable, PathMergeMessageWritable> {
+    BasicPathMergeVertex<VertexValueWritable, PathMergeMessageWritable> {
     
-    private ArrayList<PathMergeMessageWritable> receivedMsg = new ArrayList<PathMergeMessageWritable>();
-    private HashMap<VKmerBytesWritable, ArrayList<Byte>> dirMapper = new HashMap<VKmerBytesWritable, ArrayList<Byte>>();
-    
-    private EdgeWritable tmpEdge = new EdgeWritable();
+    private HashSet<PathMergeMessageWritable> updateMsgs = new HashSet<PathMergeMessageWritable>();
+    private HashSet<PathMergeMessageWritable> otherMsgs = new HashSet<PathMergeMessageWritable>();
+    private HashSet<PathMergeMessageWritable> neighborMsgs = new HashSet<PathMergeMessageWritable>();
     /**
      * initiate kmerSize, maxIteration
      */
+    @Override
     public void initVertex() {
         super.initVertex();
         if(incomingMsg == null)
@@ -41,26 +37,8 @@
             outgoingMsg.reset();
         if(destVertexId == null)
             destVertexId = new VKmerBytesWritable();
-        inFlag = 0;
-        outFlag = 0;
         if(repeatKmer == null)
             repeatKmer = new VKmerBytesWritable();
-        tmpValue.reset();
-        synchronized(lock){
-            if(fakeVertex == null){
-                fakeVertex = new VKmerBytesWritable();
-                String fake = generateString(kmerSize + 1);//generaterRandomString(kmerSize + 1);
-                fakeVertex.setByRead(kmerSize + 1, fake.getBytes(), 0); 
-            }
-        }
-        if(tmpKmer == null)
-            tmpKmer = new VKmerBytesWritable();
-        if(reverseKmer == null)
-            reverseKmer = new VKmerBytesWritable();
-        if(kmerList == null)
-            kmerList = new VKmerListWritable();
-        else
-            kmerList.reset();
         if(getSuperstep() == 1)
             StatisticsAggregator.preGlobalCounters.clear();
 //        else
@@ -69,321 +47,212 @@
         getVertexValue().getCounters().clear();
     }
     
-    /**
-     * map reduce in FakeNode
-     */
-    public void aggregateMsgAndGroupInFakeNode(Iterator<PathMergeMessageWritable> msgIterator){
-        kmerMapper.clear();
-        dirMapper.clear();
-        /** Mapper **/
-        mapKeyByInternalKmer(msgIterator);
-        /** Reducer **/
-        reduceKeyByInternalKmer();
-    }
-    
-    /**
-     * typical for P1
-     */
-    @Override
-    public void mapKeyByInternalKmer(Iterator<PathMergeMessageWritable> msgIterator){
-        byte dir = 0;
-        while(msgIterator.hasNext()){
-            incomingMsg = msgIterator.next();
-            String kmerString = incomingMsg.getInternalKmer().toString();
-            tmpKmer.setByRead(kmerString.length(), kmerString.getBytes(), 0);
-            reverseKmer.setByReadReverse(kmerString.length(), kmerString.getBytes(), 0);
-
-            VKmerBytesWritable kmer = new VKmerBytesWritable();
-            kmerList = new VKmerListWritable();
-            if(reverseKmer.compareTo(tmpKmer) > 0){
-                dir = KmerDir.FORWARD;
-                kmer.setAsCopy(tmpKmer);
-            }
-            else{
-                dir = KmerDir.REVERSE;
-                kmer.setAsCopy(reverseKmer);
-            }
-            if(!kmerMapper.containsKey(kmer)){
-                //kmerList.reset();
-                kmerList.append(incomingMsg.getSourceVertexId());
-                kmerMapper.put(kmer, kmerList);
-            } else{
-                kmerList.setCopy(kmerMapper.get(kmer));
-                kmerList.append(incomingMsg.getSourceVertexId());
-                kmerMapper.put(kmer, kmerList);
-            }
-            //dirMapper
-            ArrayList<Byte> dirList = new ArrayList<Byte>();
-            if(!dirMapper.containsKey(kmer)){
-                dirList.clear();
-                dirList.add(dir);
-                dirMapper.put(kmer, dirList);
-            } else{
-                dirList.clear();
-                dirList.addAll(dirMapper.get(kmer));
-                dirList.add(dir);
-                dirMapper.put(kmer, dirList);
-            }
-        }
-    }
-    
-    /**
-     * typical for P1
-     */
-    @Override
-    public void reduceKeyByInternalKmer(){
-        for (VKmerBytesWritable key : kmerMapper.keySet()) {
-            kmerList = kmerMapper.get(key);
-            //always delete kmerList(1), keep kmerList(0)
-
-            //send kill message to kmerList(1), and carry with kmerList(0) to update edgeLists of kmerList(1)'s neighbor
-            outgoingMsg.setFlag(MessageFlag.KILL);
-            outgoingMsg.getNode().setInternalKmer(kmerList.getPosition(0));
-            boolean isFlip = dirMapper.get(key).get(0) == dirMapper.get(key).get(1) ? false : true;
-            outgoingMsg.setFlip(isFlip);
-            destVertexId.setAsCopy(kmerList.getPosition(1));
-            sendMsg(destVertexId, outgoingMsg);
-        }
-    }
- 
-    /**
-     * typical for P1
-     * do some remove operations on adjMap after receiving the info about dead Vertex
-     */
-    public void responseToDeadVertexAndUpdateEdges(){
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+    public void chooseMergeDir() {
+        VertexValueWritable vertex = getVertexValue();
+        short state = vertex.getState();
+        EnumSet<DIR> restrictedDirs = DIR.enumSetFromByte(state);
+        boolean updated = false;
+        //initiate merge dir
+        state &= P4State.MERGE_CLEAR;
+        state |= P4State.NO_MERGE;   //setMerge(P4State.NO_MERGE);
         
-        if(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()) != null){
-            tmpEdge.setAsCopy(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()));
-            
-            getVertexValue().getEdgeList(neighborToMeDir).remove(incomingMsg.getSourceVertexId());
+        //choose merge dir -- principle: only merge with nextDir
+        if(restrictedDirs.size() == 1){
+        	if((restrictedDirs.contains(DIR.PREVIOUS) && vertex.getDegree(DIR.NEXT) == 1) 
+        			|| (restrictedDirs.contains(DIR.NEXT) && vertex.getDegree(DIR.PREVIOUS) == 1)){
+	            EDGETYPE edgeType = restrictedDirs.contains(DIR.PREVIOUS) ? vertex.getEdgetypeFromDir(DIR.NEXT) : vertex.getEdgetypeFromDir(DIR.PREVIOUS);
+	            state |= P4State.MERGE | edgeType.get();
+	            updated = true;
+        	}
         }
-        tmpEdge.setKey(incomingMsg.getNode().getInternalKmer());
-        byte updateDir = flipDirection(neighborToMeDir, incomingMsg.isFlip());
-        getVertexValue().getEdgeList(updateDir).unionAdd(tmpEdge);
-    }
-    
-    /**
-     * head send update message
-     */
-    public void headSendUpdateMsg(){
-        if(isHeadNode()){
-            byte headMergeDir = (byte)(getVertexValue().getState() & State.HEAD_CAN_MERGE_MASK);
-            switch(headMergeDir){
-                case State.HEAD_CAN_MERGEWITHPREV:
-                    sendUpdateMsg(isP1, DIR.NEXT);
-                    break;
-                case State.HEAD_CAN_MERGEWITHNEXT:
-                    sendUpdateMsg(isP1, DIR.PREVIOUS);
-                    break;
-            }
-        } else
+        
+        getVertexValue().setState(state);
+        if (updated)
+            activate();
+        else 
             voteToHalt();
     }
     
     /**
-     * process update when receiving update msg
+     * step4: receive and process Merges  for P0
      */
-    public void processUpdateOnceReceiveMsg(Iterator<PathMergeMessageWritable> msgIterator){
-        while(msgIterator.hasNext()){
-            incomingMsg = msgIterator.next();
-            processUpdate(incomingMsg);
-            if(isHaltNode())
+    public void receiveMerges(Iterator<PathMergeMessageWritable> msgIterator) {
+        VertexValueWritable vertex = getVertexValue();
+        NodeWritable node = vertex.getNode();
+        short state = vertex.getState();
+        boolean updated = false;
+        EDGETYPE senderEdgetype;
+        @SuppressWarnings("unused")
+        int numMerged = 0;
+        // aggregate incomingMsg
+        ArrayList<PathMergeMessageWritable> receivedMsgList = new ArrayList<PathMergeMessageWritable>();
+        while(msgIterator.hasNext())
+            receivedMsgList.add(new PathMergeMessageWritable(msgIterator.next()));
+        
+        if(receivedMsgList.size() > 2)
+            throw new IllegalStateException("In path merge, it is impossible to receive more than 2 messages!");
+        
+        // odd number of nodes
+        if(receivedMsgList.size() == 2){
+            for(PathMergeMessageWritable msg : receivedMsgList){
+              senderEdgetype = EDGETYPE.fromByte(msg.getFlag());
+              node.mergeWithNode(senderEdgetype, msg.getNode());
+              state |= (byte) (msg.getFlag() & DIR.MASK);  // update incoming restricted directions
+              numMerged++;
+              updated = true;
+              deleteVertex(msg.getSourceVertexId());
+            }
+        } else if(receivedMsgList.size() == 1){ // even number of nodes
+            PathMergeMessageWritable msg = receivedMsgList.get(0);
+            senderEdgetype = EDGETYPE.fromByte(msg.getFlag());
+            state |= (byte) (msg.getFlag() & DIR.MASK);  // update incoming restricted directions
+            VKmerBytesWritable me = getVertexId();
+            VKmerBytesWritable other = msg.getSourceVertexId();
+            // determine if merge. if head msg meets head and #receiveMsg = 1
+            if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class))){
+                if(me.compareTo(other) < 0){
+                    node.mergeWithNode(senderEdgetype, msg.getNode());
+                    numMerged++;
+                    updated = true;
+                    deleteVertex(other);
+                } else{
+                    // broadcast kill self and update pointer to new kmer, update edge from toMe to toOther
+                    node.mergeWithNode(senderEdgetype, msg.getNode());
+                    outgoingMsg.setSourceVertexId(me);
+                    outgoingMsg.getNode().setInternalKmer(other);
+                    outFlag = 0;
+                    outFlag |= MessageFlag.TO_NEIGHBOR;
+                    for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+                        for(VKmerBytesWritable kmer : vertex.getEdgeList(et).getKeys()){
+                            EDGETYPE meToNeighbor = et.mirror();
+                            EDGETYPE otherToNeighbor = senderEdgetype.causesFlip() ? meToNeighbor.flip() : meToNeighbor;
+                            outFlag &= EDGETYPE.CLEAR;
+                            outFlag &= MessageFlag.MERGE_DIR_CLEAR;
+                            outFlag |= meToNeighbor.get() | otherToNeighbor.get() << 9;
+                            outgoingMsg.setFlag(outFlag);
+                            destVertexId = kmer;
+                            sendMsg(destVertexId, outgoingMsg);
+                        }
+                    }
+                    
+                    state |= P4State.NO_MERGE;
+                    vertex.setState(state);
+                    voteToHalt();
+                }
+            } else{
+                node.mergeWithNode(senderEdgetype, msg.getNode());
+                numMerged++;
+                updated = true;
+                deleteVertex(other);
+            }
+        }
+        
+        if(isTandemRepeat(getVertexValue())) {
+            // tandem repeats can't merge anymore; restrict all future merges
+            state |= DIR.NEXT.get();
+            state |= DIR.PREVIOUS.get();
+            updated = true;
+//          updateStatisticsCounter(StatisticsCounter.Num_Cycles); 
+        }
+//      updateStatisticsCounter(StatisticsCounter.Num_MergedNodes);
+//      getVertexValue().setCounters(counters);
+        if (updated) {
+            vertex.setState(state);
+            if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class)))
                 voteToHalt();
-            else
+            else 
                 activate();
         }
     }
-    /**
-     * aggregate received msg
-     */
-    public void aggregateReceivedMsg(Iterator<PathMergeMessageWritable> msgIterator){
-        receivedMsg.clear();
+    
+    public void catagorizeMsg(Iterator<PathMergeMessageWritable> msgIterator){
+        updateMsgs.clear();
+        otherMsgs.clear();
+        neighborMsgs.clear();
         while(msgIterator.hasNext()){
             incomingMsg = msgIterator.next();
-            receivedMsg.add(incomingMsg);
-        }
-    }
-    
-    /**
-     * process message directly
-     */
-    public void processMessageDirectly(){
-        for(int i = 0; i < 2; i++)
-            processMerge(receivedMsg.get(i));
-        //final vertex
-        getVertexValue().setState(MessageFlag.IS_HALT);
-        voteToHalt();
-    }
-    
-    /**
-     * processMerge and sendMsgToFake
-     */
-    public void processMergeAndSendMsgToFake(){
-        boolean isHead = isHeadNode();
-        boolean isDead = isDeadNode();
-        processMerge(receivedMsg.get(0));
-        if(isHead || isDead){
-            // NON-FAKE and Final vertice send msg to FAKE vertex 
-            sendMsgToFakeVertex();
-            //final vertex
-            getVertexValue().setState(MessageFlag.IS_HALT);
-            voteToHalt();
-        } else
-            activate();
-    }
-    
-    /**
-     * if receive kill msg, broadcaseKillself
-     */
-    public void broadcaseKillselfOnceReceiveKillMsg(Iterator<PathMergeMessageWritable> msgIterator){
-        while(msgIterator.hasNext()){
-            incomingMsg = msgIterator.next();
-            if(isReceiveKillMsg()){
-                outgoingMsg.setInternalKmer(incomingMsg.getNode().getInternalKmer());
-                outgoingMsg.setFlip(incomingMsg.isFlip());
-                broadcaseKillself();
-            } 
-        }
-    }
-    
-    /**
-     * if receive dead msg, responseToDeadVertexAndUpdateEdges
-     */
-    public void responseToDeadVertexAndUpdateEdgesOnceReceiveDeadMsg(Iterator<PathMergeMessageWritable> msgIterator){
-        while(msgIterator.hasNext()){
-            incomingMsg = msgIterator.next();
-            if(isResponseKillMsg())
-                responseToDeadVertexAndUpdateEdges();
-        } 
-        if(isHeadNode())
-            activate();
-        else
-            voteToHalt();
-    }
-    
-        /**
-         * start sending message
-         */
-        public void startSendMsg() {
-            if(isTandemRepeat(getVertexValue())){
-                copyWithoutTandemRepeats(getVertexValue(), tmpValue);
-                outFlag = 0;
-                sendSettledMsgToAllNeighborNodes(tmpValue);
-                voteToHalt();
-            } else{
-                /** check incoming **/
-                // update internal state
-                if (VertexUtil.isVertexWithOnlyOneIncoming(getVertexValue())){
-                    byte state = 0;
-                    state |= State.HEAD_CAN_MERGEWITHPREV;
-                    getVertexValue().setState(state);
-                    activate();
-                } 
-                // send to neighbors
-                else if (VertexUtil.isVertexWithManyIncoming(getVertexValue())){
-                    outFlag = 0;
-                    sendSettledMsgs(DIR.PREVIOUS, getVertexValue());
-                     }
-                
-                /** check outgoing **/
-                // update internal state
-                if (VertexUtil.isVertexWithOnlyOneOutgoing(getVertexValue())){
-                    byte state = 0;
-                    state |= State.HEAD_CAN_MERGEWITHNEXT;
-                    getVertexValue().setState(state);
-                    activate();
-                } 
-                // send to neighbors
-                else if (VertexUtil.isVertexWithManyOutgoing(getVertexValue())){
-                    outFlag = 0;
-                    sendSettledMsgs(DIR.NEXT, getVertexValue());
-                     }
-                
-                if(VertexUtil.isUnMergeVertex(getVertexValue()))
-                    voteToHalt();
-             }
-         }
-        
-            public void initState(Iterator<PathMergeMessageWritable> msgIterator) {
-                    if(isInactiveNode())
-                        voteToHalt();
-                    else{
-                        while (msgIterator.hasNext()) {
-                            incomingMsg = msgIterator.next();
-                            switch(getHeadMergeDir()){
-                                case State.NON_HEAD: // TODO Change name to Path
-                                    setHeadMergeDir();
-                                    activate();
-                                    break;
-                                case State.HEAD_CAN_MERGEWITHPREV: // TODO aggregate all the incomingMsgs first, then make a decision about halting
-                                case State.HEAD_CAN_MERGEWITHNEXT:
-                                    if (getHeadFlagAndMergeDir() != getMsgFlagAndMergeDir()){
-                                        getVertexValue().setState(State.HEAD_CANNOT_MERGE);
-                                        voteToHalt();
-                                    }
-                                    break;
-                                case State.HEAD_CANNOT_MERGE:
-                                    voteToHalt();
-                                    break;
-                            }
-                        }
-                    }
+            byte msgType = (byte) (incomingMsg.getFlag() & MessageFlag.MSG_MASK);
+            switch(msgType){
+                case MessageFlag.TO_UPDATE:
+                    updateMsgs.add(new PathMergeMessageWritable(incomingMsg));
+                    break;
+                case MessageFlag.TO_NEIGHBOR:
+                    neighborMsgs.add(new PathMergeMessageWritable(incomingMsg));
+                    break;
+                default:
+                    throw new IllegalStateException("Message types are allowd for only TO_UPDATE, TO_OTHER and TO_NEIGHBOR!");
             }
-
+        }
+    }
+    
+    public void receiveToNeighbor(Iterator<PathMergeMessageWritable> msgIterator){
+        VertexValueWritable value = getVertexValue();
+        while(msgIterator.hasNext()){
+            incomingMsg = msgIterator.next();
+            EDGETYPE deleteToMe = EDGETYPE.fromByte(incomingMsg.getFlag());
+            EDGETYPE aliveToMe =  EDGETYPE.fromByte((short) (incomingMsg.getFlag() >> 9));
+            
+            VKmerBytesWritable deletedKmer = incomingMsg.getSourceVertexId();
+            if(value.getEdgeList(deleteToMe).contains(deletedKmer)){
+                EdgeWritable deletedEdge = value.getEdgeList(deleteToMe).getEdge(deletedKmer);
+                value.getEdgeList(deleteToMe).remove(deletedKmer);
+                
+                deletedEdge.setKey(incomingMsg.getInternalKmer());
+                value.getEdgeList(aliveToMe).unionAdd(deletedEdge);
+            }
+            voteToHalt();
+        }
+    }
+    
+    /**
+     * for P0
+     */
+    public void sendMergeMsg() {
+        VertexValueWritable vertex = getVertexValue();
+        short state = vertex.getState();
+        if ((state & P4State.MERGE) != 0) {
+            outgoingMsg.reset();
+            // tell neighbor where this is coming from (so they can merge kmers and delete)
+            EDGETYPE mergeEdgetype = EDGETYPE.fromByte(vertex.getState());
+            byte neighborRestrictions = DIR.fromSet(mergeEdgetype.causesFlip() ? DIR.flipSetFromByte(state) : DIR.enumSetFromByte(state));
+            
+            outgoingMsg.setFlag((short) (mergeEdgetype.mirror().get() | neighborRestrictions));
+            outgoingMsg.setSourceVertexId(getVertexId());
+            outgoingMsg.setNode(vertex.getNode());
+            if (vertex.getDegree(mergeEdgetype.dir()) != 1)
+                throw new IllegalStateException("Merge attempted in node with degree in " + mergeEdgetype + " direction != 1!\n" + vertex);
+            VKmerBytesWritable dest = vertex.getEdgeList(mergeEdgetype).get(0).getKey();
+//            LOG.info("send merge mesage from " + getVertexId() + " to " + dest + ": " + outgoingMsg + "; my restrictions are: " + DIR.enumSetFromByte(vertex.getState()) + ", their restrictions are: " + DIR.enumSetFromByte(outgoingMsg.getFlag()));
+            sendMsg(dest, outgoingMsg);
+            
+//            LOG.info("killing self: " + getVertexId());
+            state |= P4State.NO_MERGE;
+            vertex.setState(state);
+            voteToHalt();
+        }
+    }
     
     @Override
-    public void compute(Iterator<PathMergeMessageWritable> msgIterator) {
+    public void compute(Iterator<PathMergeMessageWritable> msgIterator) throws Exception {
         initVertex();
+        
         if (getSuperstep() == 1) {
-            addFakeVertex();
-            startSendMsg();
-        } else if (getSuperstep() == 2)
-            if(!isFakeVertex())
-                initState(msgIterator);
-            else voteToHalt();
-        else if (getSuperstep() % 7 == 3 && getSuperstep() <= maxIteration) {
-            //head send update message
-            headSendUpdateMsg();
-        } else if (getSuperstep() % 7 == 4 && getSuperstep() <= maxIteration) {
-            //process update when receiving updateMsg
-            processUpdateOnceReceiveMsg(msgIterator);
-        } else if (getSuperstep() % 7 == 5 && getSuperstep() <= maxIteration) {
-            //head broadcastMergeMsg, while non-head voteToHalt
-            if(isHeadNode())
-                broadcastMergeMsg(false);
+            restrictNeighbors();
+        } else if (getSuperstep() % 2 == 0) {
+            if (getSuperstep() == 2)
+                recieveRestrictions(msgIterator);
             else
-                voteToHalt();
-        } else if (getSuperstep() % 7 == 6 && getSuperstep() <= maxIteration) {
-            if(!msgIterator.hasNext() && isDeadNode())
-                deleteVertex(getVertexId());
-            else{
-                //aggregate received msg
-                aggregateReceivedMsg(msgIterator);
-                if(receivedMsg.size() == 2){ //#incomingMsg == even
-                    //processMerge directly
-                    processMessageDirectly();
-                } else if(receivedMsg.size() == 1){
-                    //processMerge and sendMsgToFake
-                    processMergeAndSendMsgToFake();
-                }
-            }
-        } else if (getSuperstep() % 7 == 0 && getSuperstep() <= maxIteration){
-            if(isFakeVertex()){//is FakeVertex
-                // Fake vertex agregates message and group them by actual kmer (1) 
-                aggregateMsgAndGroupInFakeNode(msgIterator);
-                voteToHalt();
-            }
-        } else if (getSuperstep() % 7 == 1 && getSuperstep() <= maxIteration){
-            //if receive kill msg, broadcaseKillself
-            broadcaseKillselfOnceReceiveKillMsg(msgIterator);
-        } else if (getSuperstep() % 7 == 2 && getSuperstep() <= maxIteration){
-            //if receive dead msg, responseToDeadVertexAndUpdateEdges
-            responseToDeadVertexAndUpdateEdgesOnceReceiveDeadMsg(msgIterator);
-        }
-        else
-            voteToHalt();
+                receiveMerges(msgIterator);
+            chooseMergeDir();
+            updateNeighbors();
+        } else if (getSuperstep() % 2 == 1) {
+            catagorizeMsg(msgIterator);
+            
+            receiveUpdates(updateMsgs.iterator());
+            receiveToNeighbor(neighborMsgs.iterator());
+            
+            sendMergeMsg();
+        } 
     }
 
     public static void main(String[] args) throws Exception {
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P2ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P2ForPathMergeVertex.java
index 7b97260..4a168af 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P2ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P2ForPathMergeVertex.java
@@ -21,6 +21,7 @@
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.pregelix.type.MessageType;
 import edu.uci.ics.genomix.type.NodeWritable.DIR;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerListWritable;
 import edu.uci.ics.pregelix.api.graph.Vertex;
@@ -227,25 +228,25 @@
     }
     
     public void sendP2MergeMsgByIncomingMsgDir(){
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
         switch(meToNeighborDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 outgoingMsg.setMessageType(P2MessageType.FROM_SUCCESSOR);
                 break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
+            case RF:
+            case RR:
                 outgoingMsg.setMessageType(P2MessageType.FROM_PREDECESSOR);
                 break;
         }
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 configureP2MergeMsgForSuccessor(incomingMsg.getSourceVertexId());
                 break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
+            case RF:
+            case RR:
                 configureP2MergeMsgForPredecessor(incomingMsg.getSourceVertexId()); 
                 break; 
         }
@@ -276,8 +277,8 @@
      * final merge and updateAdjList  having parameter for p2
      */
     public void processP2Merge(P2PathMergeMessageWritable msg){
-        byte meToNeighborDir = (byte) (msg.getFlag() & MessageFlag.DIR_MASK); 
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(msg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         
         getVertexValue().getMergeNode(msg.getMessageType()).mergeWithNode(neighborToMeDir, msg.getNode());
         getVertexValue().getNode().mergeWithNodeWithoutKmer(neighborToMeDir, msg.getNode());
@@ -291,32 +292,32 @@
         outFlag |= MessageFlag.IS_FINAL;
         outgoingMsg.setUpdateMsg(false);
         outgoingMsg.setApexMap(getVertexValue().getApexMap());
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
         switch(meToNeighborDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 outgoingMsg.setMessageType(P2MessageType.FROM_SUCCESSOR);
                 break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
+            case RF:
+            case RR:
                 outgoingMsg.setMessageType(P2MessageType.FROM_PREDECESSOR);
                 break;
         }
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 outFlag &= MessageFlag.DIR_CLEAR;
-                outFlag |= neighborToMeDir;
+                outFlag |= neighborToMeDir.get();
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setSourceVertexId(getVertexId());
                 outgoingMsg.setNode(getVertexValue().getPrependMergeNode());
                 sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg);
                 break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
+            case RF:
+            case RR:
                 outFlag &= MessageFlag.DIR_CLEAR;
-                outFlag |= neighborToMeDir;       
+                outFlag |= neighborToMeDir.get();       
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setSourceVertexId(getVertexId());
                 outgoingMsg.setNode(getVertexValue().getAppendMergeNode());
@@ -405,16 +406,16 @@
      * check if it is a valid update node
      */
     public boolean isValidUpateNode(){
-        byte meToNeighborDir = (byte)(incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         boolean flag = false;
         switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 flag = ((getVertexValue().getState() & MessageFlag.HEAD_CAN_MERGE_MASK) == MessageFlag.HEAD_CAN_MERGEWITHPREV);
                 break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
+            case RF:
+            case RR:
                 flag = ((getVertexValue().getState() & MessageFlag.HEAD_CAN_MERGE_MASK) == MessageFlag.HEAD_CAN_MERGEWITHNEXT);
                 break;
         }
@@ -430,7 +431,7 @@
             if(isHaltNode())
                 voteToHalt();
             else if(isHeadNode() && !isTandemRepeat(getVertexValue())){
-                if(isValidPath()){
+                if(true){ //isValidPath()
                     setHeadMergeDir();
                     //set deleteKmer and deleteDir
                     KmerAndDirWritable kmerAndDir = new KmerAndDirWritable();
@@ -444,7 +445,7 @@
                     getVertexValue().setState(MessageFlag.IS_HALT);
                     voteToHalt();
                 }
-            } else if(getHeadFlagAndMergeDir() == getMsgFlagAndMergeDir()){
+            } else if(isHeadNode()){ //getHeadFlagAndMergeDir() == getMsgFlagAndMergeDir()
                 activate();
             } else{ // already set up
                 // if headMergeDir are not the same
@@ -459,8 +460,9 @@
      */
     public void updateApexEdges(){
         KmerAndDirWritable deleteEdge = incomingMsg.getApexMap().get(getVertexId());
-        if(deleteEdge != null && getVertexValue().getEdgeList(deleteEdge.getDeleteDir()).contains(deleteEdge.getDeleteKmer())) //avoid to delete twice
-            getVertexValue().getEdgeList(deleteEdge.getDeleteDir()).remove(deleteEdge.getDeleteKmer());
+        EDGETYPE deleteEdgeType = EDGETYPE.fromByte(deleteEdge.getDeleteDir());
+        if(deleteEdge != null && getVertexValue().getEdgeList(deleteEdgeType).contains(deleteEdge.getDeleteKmer())) //avoid to delete twice
+            getVertexValue().getEdgeList(deleteEdgeType).remove(deleteEdge.getDeleteKmer());
         processFinalUpdate2();
         getVertexValue().setState(MessageFlag.IS_HALT);
         voteToHalt();
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
index 6b4171e..824d0da 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
@@ -1,10 +1,8 @@
 package edu.uci.ics.genomix.pregelix.operator.pathmerge;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Random;
 import java.util.logging.Logger;
 
@@ -15,17 +13,10 @@
 import edu.uci.ics.genomix.pregelix.client.Client;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.P4State;
-import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.pregelix.io.message.PathMergeMessageWritable;
 import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
-import edu.uci.ics.genomix.pregelix.util.VertexUtil;
-import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.NodeWritable.DIR;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
-import edu.uci.ics.genomix.type.NodeWritable.IncomingListFlag;
-import edu.uci.ics.genomix.type.NodeWritable.OutgoingListFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 
@@ -51,20 +42,8 @@
     private boolean curHead;
     private boolean nextHead;
     private boolean prevHead;
-    private byte nextDir;
-    private byte prevDir;
-    
-    private static final List<VKmerBytesWritable> problemKmers = Arrays.asList(
-            new VKmerBytesWritable("CCCGGCCTCCAGCGTGGGATACGCGAAGATGCCGCCGTAGGTGAGAATCTGGTTC"),
-            new VKmerBytesWritable("GCAGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
-            new VKmerBytesWritable("GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
-            new VKmerBytesWritable("GAGCAGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
-            new VKmerBytesWritable("GGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
-            new VKmerBytesWritable("AGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
-            new VKmerBytesWritable("GCGACGTGCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),
-            new VKmerBytesWritable("GTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
-            );
-    private boolean verbose;
+    private EDGETYPE nextEdgetype;
+    private EDGETYPE prevEdgetype;
     
     /**
      * initiate kmerSize, maxIteration
@@ -102,88 +81,6 @@
 //            StatisticsAggregator.preGlobalCounters = BasicGraphCleanVertex.readStatisticsCounterResult(getContext().getConfiguration());
         counters.clear();
         getVertexValue().getCounters().clear();
-
-        verbose = false;
-        for (VKmerBytesWritable pk : problemKmers)
-            verbose |= getVertexValue().getNode().findEdge(pk) != null || getVertexId().equals(pk);
-        if (verbose)
-            LOG.fine("iteration " + getSuperstep());
-    }
-    
-    /**
-     * Send merge restrictions to my neighbor nodes
-     */
-    public void restrictNeighbors() {
-        EnumSet<DIR> dirsToRestrict;
-        VertexValueWritable vertex = getVertexValue();
-        short state = vertex.getState();
-        boolean updated = false;
-        if(isTandemRepeat(vertex)) {
-            // tandem repeats are not allowed to merge at all
-            dirsToRestrict = EnumSet.of(DIR.NEXT, DIR.PREVIOUS);
-            state |= DIR.NEXT.get();
-            state |= DIR.PREVIOUS.get();
-            updated = true;
-        }
-        else {
-            // degree > 1 can't merge in that direction; == 0 means we are a tip 
-            dirsToRestrict = EnumSet.noneOf(DIR.class);
-            for (DIR dir : DIR.values()) {
-                if (vertex.getDegree(dir) > 1 || vertex.getDegree(dir) == 0) {
-                    dirsToRestrict.add(dir);
-                    state |= dir.get();
-                    updated = true;
-                }
-            }
-        }
-        if (updated) {
-            vertex.setState(state);
-            if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class)))
-            	voteToHalt();
-            else 
-            	activate();
-        }
-        
-        // send a message to each neighbor indicating they can't merge towards me
-        for (DIR dir : dirsToRestrict) {
-            for (byte d : NodeWritable.edgeTypesInDir(dir)) {
-                for (VKmerBytesWritable destId : vertex.getEdgeList(d).getKeys()) {
-                    for (VKmerBytesWritable pk : problemKmers)
-                        verbose |= destId.equals(pk);
-                    outgoingMsg.reset();
-                    outgoingMsg.setFlag(DirectionFlag.dirFromEdgeType(DirectionFlag.mirrorEdge(d)).get());
-                    if (verbose)
-                        LOG.fine("send restriction from " + getVertexId() + " to " + destId + " in my " + d + " and their " + DirectionFlag.mirrorEdge(d) + " (" + DirectionFlag.dirFromEdgeType(DirectionFlag.mirrorEdge(d)) + "); I am " + getVertexValue());
-                    sendMsg(destId, outgoingMsg);
-                }
-            }
-        }
-    }
-    
-    /**
-     * initiate head, rear and path node
-     */
-    public void recieveRestrictions(Iterator<PathMergeMessageWritable> msgIterator) {
-        short restrictedDirs = 0;  // the directions (NEXT/PREVIOUS) that I'm not allowed to merge in
-        boolean updated = false;
-        while (msgIterator.hasNext()) {
-            incomingMsg = msgIterator.next();
-            for (VKmerBytesWritable pk : problemKmers)
-                verbose |= incomingMsg.getNode().findEdge(pk) != null || incomingMsg.getSourceVertexId().equals(pk);
-            if (verbose)
-                LOG.fine("before restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
-            restrictedDirs |= incomingMsg.getFlag();
-            if (verbose)
-                LOG.fine("after restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
-            updated = true;
-        }
-        if (updated) {
-            getVertexValue().setState(restrictedDirs);
-            if (DIR.enumSetFromByte(restrictedDirs).containsAll(EnumSet.allOf(DIR.class)))
-                voteToHalt();
-            else 
-                activate();
-        }
     }
 
     protected boolean isNodeRandomHead(VKmerBytesWritable nodeKmer) {
@@ -198,7 +95,7 @@
     }
     
     /**
-     * checks if there is a valid, mergeable neighbor in the given direction.  sets hasNext/Prev, next/prevDir, Kmer and Head
+     * checks if there is a valid, mergeable neighbor in the given direction.  sets hasNext/Prev, next/prevEdgetype, Kmer and Head
      */
     protected void checkNeighbors() {
         VertexValueWritable vertex = getVertexValue();
@@ -208,8 +105,8 @@
             hasNext = false;
         } else {
             hasNext = true;
-            nextDir = vertex.getEdgeList(DirectionFlag.DIR_FF).getCountOfPosition() > 0 ? DirectionFlag.DIR_FF : DirectionFlag.DIR_FR; 
-            nextKmer = vertex.getEdgeList(nextDir).get(0).getKey();
+            nextEdgetype = vertex.getEdgetypeFromDir(DIR.NEXT); //getEdgeList(EDGETYPE.FF).getCountOfPosition() > 0 ? EDGETYPE.FF : EDGETYPE.FR; 
+            nextKmer = vertex.getEdgeList(nextEdgetype).get(0).getKey();
             nextHead = isNodeRandomHead(nextKmer);
         }
 
@@ -218,8 +115,8 @@
             hasPrev = false;
         } else {
             hasPrev = true;
-            prevDir = vertex.getEdgeList(DirectionFlag.DIR_RF).getCountOfPosition() > 0 ? DirectionFlag.DIR_RF : DirectionFlag.DIR_RR; 
-            prevKmer = vertex.getEdgeList(prevDir).get(0).getKey();
+            prevEdgetype = vertex.getEdgetypeFromDir(DIR.PREVIOUS); //vertex.getEdgeList(EDGETYPE.RF).getCountOfPosition() > 0 ? EDGETYPE.RF : EDGETYPE.RR; 
+            prevKmer = vertex.getEdgeList(prevEdgetype).get(0).getKey();
             prevHead = isNodeRandomHead(prevKmer);
         }
     }
@@ -238,10 +135,10 @@
             if (curHead) {
                 if (hasNext && !nextHead) {
                     // compress this head to the forward tail
-                    setMerge((byte) (nextDir | P4State.MERGE));
+                    setMerge((byte) (nextEdgetype.get() | P4State.MERGE));
                 } else if (hasPrev && !prevHead) {
                     // compress this head to the reverse tail
-                    setMerge((byte) (prevDir | P4State.MERGE));
+                    setMerge((byte) (prevEdgetype.get() | P4State.MERGE));
                 } 
             }
             else {
@@ -250,177 +147,29 @@
                      if ((!nextHead && !prevHead) && (curKmer.compareTo(nextKmer) < 0 && curKmer.compareTo(prevKmer) < 0)) {
                         // tails on both sides, and I'm the "local minimum"
                         // compress me towards the tail in forward dir
-                        setMerge((byte) (nextDir | P4State.MERGE));
+                        setMerge((byte) (nextEdgetype.get() | P4State.MERGE));
                     }
                 } else if (!hasPrev) {
                     // no previous node
                     if (!nextHead && curKmer.compareTo(nextKmer) < 0) {
                         // merge towards tail in forward dir
-                        setMerge((byte) (nextDir | P4State.MERGE));
+                        setMerge((byte) (nextEdgetype.get() | P4State.MERGE));
                     }
                 } else if (!hasNext) {
                     // no next node
                     if (!prevHead && curKmer.compareTo(prevKmer) < 0) {
                         // merge towards tail in reverse dir
-                        setMerge((byte) (prevDir | P4State.MERGE));
+                        setMerge((byte) (prevEdgetype.get() | P4State.MERGE));
                     }
                 }
             }
         }
         if (verbose) {
-            if ((getVertexValue().getState() & P4State.MERGE) == 0) {
-                LOG.fine("No merge for " + getVertexId());
-            } else {
-                LOG.fine("Merge from " + getVertexId() + " towards " + (getVertexValue().getState() & DirectionFlag.DIR_MASK) + "; node is " + getVertexValue());
-            }
-        }
-    }
-    
-    public void updateNeighbors() {
-        VertexValueWritable vertex = getVertexValue();
-        short state = vertex.getState();
-        if ((state & P4State.MERGE) == 0) {
-            return;  // no merge requested; don't have to update neighbors
-        }
-        
-        DIR mergeDir = DirectionFlag.dirFromEdgeType((byte)state);
-        byte[] mergeEdges = NodeWritable.edgeTypesInDir(mergeDir);
-        
-        DIR updateDir = mergeDir.mirror();
-        byte[] updateEdges = NodeWritable.edgeTypesInDir(updateDir); // 
-        
-        // prepare the update message s.t. the receiver can do a simple unionupdate
-        // that means we figure out any hops and place our merge-dir edges in the appropriate list of the outgoing msg
-        for (byte updateEdge : updateEdges) {
-            outgoingMsg.reset();
-            outgoingMsg.setSourceVertexId(getVertexId());
-            outgoingMsg.setFlag(DirectionFlag.mirrorEdge(updateEdge));  // neighbor's edge to me (so he can remove me) 
-            for (byte mergeEdge : mergeEdges) {
-                byte newDir = DirectionFlag.resolveLinkThroughMiddleNode(updateEdge, mergeEdge);
-                outgoingMsg.getNode().setEdgeList(newDir, getVertexValue().getEdgeList(mergeEdge));  // copy into outgoingMsg
-            }
-            for (VKmerBytesWritable pk : problemKmers)
-                verbose |= outgoingMsg.getNode().findEdge(pk) != null;
-            
-            // send the update to all kmers in this list // TODO perhaps we could skip all this if there are no neighbors here
-            for (VKmerBytesWritable dest : vertex.getEdgeList(updateEdge).getKeys()) {
-                if (verbose)
-                    LOG.fine("send update message from " + getVertexId() + " to " + dest + ": " + outgoingMsg);
-                sendMsg(dest, outgoingMsg);
-            }
-        }
-    }
-    
-    public void receiveUpdates(Iterator<PathMergeMessageWritable> msgIterator) throws HyracksDataException{
-        VertexValueWritable vertex = getVertexValue(); 
-        NodeWritable node = vertex.getNode();
-        boolean updated = false;
-        ArrayList<PathMergeMessageWritable> allSeenMsgs = new ArrayList<PathMergeMessageWritable>();
-        while (msgIterator.hasNext()) {
-            incomingMsg = msgIterator.next();
-            for (VKmerBytesWritable pk : problemKmers)
-                verbose |= incomingMsg.getNode().findEdge(pk) != null || incomingMsg.getSourceVertexId().equals(pk);
-            if (verbose)
-                LOG.fine("before update from neighbor: " + getVertexValue());
-            // remove the edge to the node that will merge elsewhere
-            try {
-                node.getEdgeList((byte)(incomingMsg.getFlag() & DirectionFlag.DIR_MASK)).remove(incomingMsg.getSourceVertexId());
-            } catch (ArrayIndexOutOfBoundsException e) {
-                throw new HyracksDataException("In update, tried to remove an edge that doesn't exist...\nvertex: " + vertex + "\nremoving " + incomingMsg.getSourceVertexId() + " from dir " + (incomingMsg.getFlag() & DirectionFlag.DIR_MASK) + "\nupdate node: " + incomingMsg.getNode() + "\npreviously recieved messages this iteration: \n{\n" + StringUtils.join(allSeenMsgs, "\n") + "\n}\n", e);
-            }
-            // add the node this neighbor will merge into
-            for (byte dir : DirectionFlag.values) {
-                node.getEdgeList(dir).unionUpdate(incomingMsg.getEdgeList(dir));
-            }
-            updated = true;
-            allSeenMsgs.add(incomingMsg);
-            if (verbose) 
-                LOG.fine("after update from neighbor: " + getVertexValue());
-        }
-        if (verbose)
-            LOG.fine("All recieved updates:  \n{\n" + StringUtils.join(allSeenMsgs, "\n") + "\n}\n");
-        if (updated) {
-            if (DIR.enumSetFromByte(vertex.getState()).containsAll(EnumSet.allOf(DIR.class)))
-                voteToHalt();
-            else 
-                activate();
-        }
-            
-//            checkNeighbors();
-//            if (!hasNext && !hasPrev)
-//                voteToHalt();
-//            else
-//                activate();
-    }
-    
-    public void broadcastMerge() {
-        VertexValueWritable vertex = getVertexValue();
-        short state = vertex.getState();
-        if ((state & P4State.MERGE) != 0) {
-            outgoingMsg.reset();
-            // tell neighbor where this is coming from (so they can merge kmers and delete)
-            byte mergeDir = (byte)(vertex.getState() & DirectionFlag.DIR_MASK);
-            byte neighborRestrictions = DIR.fromSet(DirectionFlag.causesFlip(mergeDir) ? DIR.flipSetFromByte(state) : DIR.enumSetFromByte(state));
-            
-            outgoingMsg.setFlag((short) (DirectionFlag.mirrorEdge(mergeDir) | neighborRestrictions));
-            outgoingMsg.setSourceVertexId(getVertexId());
-            outgoingMsg.setNode(vertex.getNode());
-            if (vertex.getDegree(DirectionFlag.dirFromEdgeType(mergeDir)) != 1)
-                throw new IllegalStateException("Merge attempted in node with degree in " + mergeDir + " direction != 1!\n" + vertex);
-            VKmerBytesWritable dest = vertex.getEdgeList(mergeDir).get(0).getKey();
-            for (VKmerBytesWritable pk : problemKmers)
-                verbose |= outgoingMsg.getNode().findEdge(pk) != null || dest.equals(pk);
-            if (verbose)
-                LOG.fine("send merge mesage from " + getVertexId() + " to " + dest + ": " + outgoingMsg + "; my restrictions are: " + DIR.enumSetFromByte(vertex.getState()) + ", their restrictions are: " + DIR.enumSetFromByte(outgoingMsg.getFlag()));
-            sendMsg(dest, outgoingMsg);
-            
-            if (verbose)
-                LOG.fine("killing self: " + getVertexId());
-            deleteVertex(getVertexId());
-        }
-    }
-    
-    /**
-     * step4: processMerges 
-     */
-    public void receiveMerges(Iterator<PathMergeMessageWritable> msgIterator) {
-        VertexValueWritable vertex = getVertexValue();
-        NodeWritable node = vertex.getNode();
-        short state = vertex.getState();
-        boolean updated = false;
-        byte senderDir;
-        int numMerged = 0;
-        while (msgIterator.hasNext()) {
-            incomingMsg = msgIterator.next();
-            for (VKmerBytesWritable pk : problemKmers)
-                verbose |= incomingMsg.getNode().findEdge(pk) != null;
-            if (verbose)
-                LOG.fine("before merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
-            senderDir = (byte) (incomingMsg.getFlag() & DirectionFlag.DIR_MASK);
-            node.mergeWithNode(senderDir, incomingMsg.getNode());
-            state |= (byte) (incomingMsg.getFlag() & DIR.MASK);  // update incoming restricted directions
-            numMerged++;
-            updated = true;
-            if (verbose)
-                LOG.fine("after merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
-        }
-        if(isTandemRepeat(getVertexValue())) {
-            // tandem repeats can't merge anymore; restrict all future merges
-            state |= DIR.NEXT.get();
-            state |= DIR.PREVIOUS.get();
-            updated = true;
-            if (verbose)
-                LOG.fine("recieveMerges is a tandem repeat: " + getVertexId() + " " + getVertexValue());
-//          updateStatisticsCounter(StatisticsCounter.Num_Cycles); 
-        }
-//      updateStatisticsCounter(StatisticsCounter.Num_MergedNodes);
-//      getVertexValue().setCounters(counters);
-        if (updated) {
-            vertex.setState(state);
-            if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class)))
-                voteToHalt();
-            else 
-                activate();
+//            if ((getVertexValue().getState() & P4State.MERGE) == 0) {
+//                LOG.fine("No merge for " + getVertexId());
+//            } else {
+                LOG.fine("Merge from " + getVertexId() + " towards " + (EDGETYPE.fromByte(getVertexValue().getState())) + "; node is " + getVertexValue());
+//            }
         }
     }
     
@@ -439,7 +188,7 @@
             updateNeighbors();
         } else if (getSuperstep() % 2 == 1) {
             receiveUpdates(msgIterator);
-            broadcastMerge();
+            sendMergeMsg();
         }
     }
 
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
index cef3131..0696a53 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
@@ -5,12 +5,14 @@
 import java.util.Iterator;
 import java.util.Set;
 
+import edu.uci.ics.genomix.config.GenomixJobConf;
 import edu.uci.ics.genomix.pregelix.client.Client;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
 import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
 import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
 import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
 import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 
 /**
@@ -29,7 +31,9 @@
      */
     @Override
     public void initVertex() {
-        super.initVertex();
+        super.initVertex(); 
+        if (minAverageCoverage < 0)
+            minAverageCoverage = Float.parseFloat(getContext().getConfiguration().get(GenomixJobConf.REMOVE_LOW_COVERAGE_MAX_COVERAGE));
         if(incomingMsg == null)
             incomingMsg = new MessageWritable();
         if(outgoingMsg == null)
@@ -38,11 +42,6 @@
             outgoingMsg.reset();
         if(destVertexId == null)
             destVertexId = new VKmerBytesWritable();
-        if(fakeVertex == null){
-            fakeVertex = new VKmerBytesWritable();
-            String random = generaterRandomString(kmerSize + 1);
-            fakeVertex.setByRead(kmerSize + 1, random.getBytes(), 0); 
-        }
         if(getSuperstep() == 1)
             StatisticsAggregator.preGlobalCounters.clear();
 //        else
@@ -51,32 +50,42 @@
         getVertexValue().getCounters().clear();
     }
     
+    public void detectLowCoverageVertex(){
+        if(getVertexValue().getAvgCoverage() <= minAverageCoverage){
+            //broadcase kill self
+            broadcastKillself();
+            deadNodeSet.add(new VKmerBytesWritable(getVertexId()));
+        }
+    }
+    
+    public void cleanupDeadVertex(){
+        deleteVertex(getVertexId());
+        //set statistics counter: Num_RemovedLowCoverageNodes
+        updateStatisticsCounter(StatisticsCounter.Num_RemovedLowCoverageNodes);
+        getVertexValue().setCounters(counters);
+    }
+    
+    public void responseToDeadVertex(Iterator<MessageWritable> msgIterator){
+        while(msgIterator.hasNext()){
+            incomingMsg = msgIterator.next();
+            //response to dead node
+            EDGETYPE deadToMeEdgetype = EDGETYPE.fromByte(incomingMsg.getFlag());
+            getVertexValue().getEdgeList(deadToMeEdgetype).remove(incomingMsg.getSourceVertexId());
+        }
+    }
+    
     @Override
     public void compute(Iterator<MessageWritable> msgIterator) {
         initVertex(); 
-        if(getSuperstep() == 1){
-            if(getVertexValue().getAvgCoverage() <= minAverageCoverage){
-                broadcaseReallyKillself();
-                deadNodeSet.add(new VKmerBytesWritable(getVertexId()));
-            }
+        if(getSuperstep() == 1)
+            detectLowCoverageVertex();
+        else if(getSuperstep() == 2){
+            if(deadNodeSet.contains(getVertexId()))
+                cleanupDeadVertex();
             else
-                voteToHalt();
-        } else if(getSuperstep() == 2){
-            if(deadNodeSet.contains(getVertexId())){
-                deleteVertex(getVertexId());
-                //set statistics counter: Num_RemovedLowCoverageNodes
-                updateStatisticsCounter(StatisticsCounter.Num_RemovedLowCoverageNodes);
-                getVertexValue().setCounters(counters);
-            }
-            else{
-                while(msgIterator.hasNext()){
-                    incomingMsg = msgIterator.next();
-                    if(isResponseKillMsg())
-                        responseToDeadVertex();
-                }
-            }
-            voteToHalt();
+                responseToDeadVertex(msgIterator);
         } 
+        voteToHalt();
     }
     
     public static void main(String[] args) throws Exception {
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/BFSTraverseVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/BFSTraverseVertex.java
index ad85a90..74629d4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/BFSTraverseVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/BFSTraverseVertex.java
@@ -8,10 +8,10 @@
 import edu.uci.ics.genomix.pregelix.io.message.BFSTraverseMessageWritable;
 import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
 import edu.uci.ics.genomix.pregelix.type.EdgeDirs;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerListWritable;
 import edu.uci.ics.genomix.type.NodeWritable.DIR;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 
 public class BFSTraverseVertex extends
     BasicGraphCleanVertex<VertexValueWritable, BFSTraverseMessageWritable> {
@@ -86,54 +86,54 @@
         kmerList.append(getVertexId());
         outgoingMsg.setPathList(kmerList);
         outgoingMsg.setReadId(incomingMsg.getReadId()); //only one readId
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror(); 
         /** set edgeDirs **/
         setEdgeDirs(meToNeighborDir, neighborToMeDir);
         switch(neighborToMeDir){
-            case MessageFlag.DIR_FF:
-            case MessageFlag.DIR_FR:
+            case FF:
+            case FR:
                 sendSettledMsgs(DIR.PREVIOUS ,getVertexValue());
                 break;
-            case MessageFlag.DIR_RF:
-            case MessageFlag.DIR_RR:
+            case RF:
+            case RR:
                 sendSettledMsgs(DIR.NEXT, getVertexValue());
                 break;
         }
     }
     
-    public void setEdgeDirs(byte meToNeighborDir, byte neighborToMeDir){
+    public void setEdgeDirs(EDGETYPE meToNeighborDir, EDGETYPE neighborToMeDir){
         edgeDirsList.clear();
         edgeDirsList.addAll(incomingMsg.getEdgeDirsList());
         if(edgeDirsList.isEmpty()){ //first time from srcNode
             /** set srcNode's next dir **/
             edgeDirs.reset();
-            edgeDirs.setNextToMeDir(meToNeighborDir);
+            edgeDirs.setNextToMeDir(meToNeighborDir.get());
             edgeDirsList.add(new EdgeDirs(edgeDirs)); 
             /** set curNode's prev dir **/
             edgeDirs.reset();
-            edgeDirs.setPrevToMeDir(neighborToMeDir);
+            edgeDirs.setPrevToMeDir(neighborToMeDir.get());
             edgeDirsList.add(new EdgeDirs(edgeDirs));
         } else {
             /** set preNode's next dir **/
             edgeDirs.set(edgeDirsList.get(edgeDirsList.size() - 1));
-            edgeDirs.setNextToMeDir(meToNeighborDir);
+            edgeDirs.setNextToMeDir(meToNeighborDir.get());
             edgeDirsList.set(edgeDirsList.size() - 1, new EdgeDirs(edgeDirs));
             /** set curNode's prev dir **/
             edgeDirs.reset();
-            edgeDirs.setPrevToMeDir(neighborToMeDir);
+            edgeDirs.setPrevToMeDir(neighborToMeDir.get());
             edgeDirsList.add(new EdgeDirs(edgeDirs));
         }
         outgoingMsg.setEdgeDirsList(edgeDirsList);
     }
     
     public boolean isValidDestination(){
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror(); 
         if(incomingMsg.isDestFlip())
-            return neighborToMeDir == MessageFlag.DIR_RF || neighborToMeDir == MessageFlag.DIR_RR;
+            return neighborToMeDir == EDGETYPE.RF || neighborToMeDir == EDGETYPE.RR;
         else
-            return neighborToMeDir == MessageFlag.DIR_FF || neighborToMeDir == MessageFlag.DIR_FR;
+            return neighborToMeDir == EDGETYPE.FF || neighborToMeDir == EDGETYPE.FR;
     }
     
     public void sendMsgToPathNodeToAddCommondReadId(){
@@ -164,8 +164,8 @@
         kmerList.setCopy(incomingMsg.getPathList());
         kmerList.append(getVertexId());
         incomingMsg.setPathList(kmerList);
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         setEdgeDirs(meToNeighborDir, neighborToMeDir);
         incomingMsg.setEdgeDirsList(outgoingMsg.getEdgeDirsList());
     }
@@ -176,12 +176,12 @@
         byte prevToMeDir = incomingMsg.getEdgeDirsList().get(0).getPrevToMeDir();
         tmpKmer.setAsCopy(incomingMsg.getPathList().getPosition(0));
         if(tmpKmer.getKmerLetterLength() != 0)
-            getVertexValue().getEdgeList(prevToMeDir).getReadIDs(tmpKmer).appendReadId(readId);
+            getVertexValue().getEdgeList(EDGETYPE.fromByte(prevToMeDir)).getReadIDs(tmpKmer).appendReadId(readId);
         //set readId to next edge
         byte nextToMeDir = incomingMsg.getEdgeDirsList().get(0).getNextToMeDir();
         tmpKmer.setAsCopy(incomingMsg.getPathList().getPosition(1));
         if(tmpKmer.getKmerLetterLength() != 0)
-            getVertexValue().getEdgeList(nextToMeDir).getReadIDs(tmpKmer).appendReadId(readId);
+            getVertexValue().getEdgeList(EDGETYPE.fromByte(nextToMeDir)).getReadIDs(tmpKmer).appendReadId(readId);
     }
     
     @Override
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java
index 2bbe758..c00078c 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java
@@ -11,10 +11,10 @@
 import edu.uci.ics.genomix.pregelix.io.message.SplitRepeatMessageWritable;
 import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
 import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.pregelix.api.graph.Vertex;
 import edu.uci.ics.pregelix.api.util.BspUtils;
@@ -28,20 +28,20 @@
     BasicGraphCleanVertex<VertexValueWritable, SplitRepeatMessageWritable>{
     
     public class EdgeAndDir{
-        private byte dir;
+        private EDGETYPE edgeType;
         private EdgeWritable edge;
         
         public EdgeAndDir(){
-            dir = 0;
+            edgeType = null;
             edge = new EdgeWritable();
         }
 
-        public byte getDir() {
-            return dir;
+        public EDGETYPE getDir() {
+            return edgeType;
         }
 
-        public void setDir(byte dir) {
-            this.dir = dir;
+        public void setDir(EDGETYPE dir) {
+            this.edgeType = dir;
         }
 
         public EdgeWritable getEdge() {
@@ -174,11 +174,11 @@
         deletedEdge.setReadIDs(neighborEdgeIntersection);
         outgoingMsg.setDeletedEdge(deletedEdge);
         
-        outgoingMsg.setFlag(incomingEdgeDir);
+        outgoingMsg.setFlag(incomingEdgeType.get());
         destVertexId.setAsCopy(incomingEdge.getKey());
         sendMsg(destVertexId, outgoingMsg);
         
-        outgoingMsg.setFlag(outgoingEdgeDir);
+        outgoingMsg.setFlag(outgoingEdgeType.get());
         destVertexId.setAsCopy(outgoingEdge.getKey());
         sendMsg(destVertexId, outgoingMsg);
     }
@@ -199,15 +199,15 @@
     }
     
     public void deleteEdgeFromOldVertex(EdgeAndDir deleteEdge){
-        getVertexValue().getEdgeList(deleteEdge.dir).removeSubEdge(deleteEdge.getEdge());
+        getVertexValue().getEdgeList(deleteEdge.edgeType).removeSubEdge(deleteEdge.getEdge());
     }
     
     public void updateEdgeListPointToNewVertex(){
-        byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.VERTEX_MASK);
-        byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+        EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());//(byte) (incomingMsg.getFlag() & MessageFlag.VERTEX_MASK);
+        EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
         
         getVertexValue().getEdgeList(neighborToMeDir).removeSubEdge(incomingMsg.getDeletedEdge());
-        getVertexValue().getEdgeList(neighborToMeDir).add(incomingMsg.getCreatedEdge());
+        getVertexValue().getEdgeList(neighborToMeDir).add(new EdgeWritable(incomingMsg.getCreatedEdge()));
     }
     
     @Override
@@ -216,47 +216,47 @@
         if(getSuperstep() == 1){
             if(getVertexValue().getDegree() > 2){
                 deletedEdges.clear();
-                /** process connectedTable **/
+                // process connectedTable
                 for(int i = 0; i < 4; i++){
-                    /** set edgeList and edgeDir based on connectedTable **/
-                    setEdgeListAndEdgeDir(i);
+                    // set edgeList and edgeType based on connectedTable
+                    setEdgeListAndEdgeType(i);
                     
                     for(EdgeWritable incomingEdge : incomingEdgeList){
                         for(EdgeWritable outgoingEdge : outgoingEdgeList){
-                            /** set neighborEdge readId intersection **/
+                            // set neighborEdge readId intersection
                             setNeighborEdgeIntersection(incomingEdge, outgoingEdge);
                             
                             if(!neighborEdgeIntersection.isEmpty()){
-                                /** random generate vertexId of new vertex **/
+                                // random generate vertexId of new vertex
                                 randomGenerateVertexId(3);
                                 
-                                /** change incomingEdge/outgoingEdge's edgeList to commondReadIdSet **/
+                                // change incomingEdge/outgoingEdge's edgeList to commondReadIdSet
                                 tmpIncomingEdge.setAsCopy(incomingEdge);
                                 tmpOutgoingEdge.setAsCopy(outgoingEdge);
                                 tmpIncomingEdge.setReadIDs(neighborEdgeIntersection);
                                 tmpOutgoingEdge.setReadIDs(neighborEdgeIntersection);
                                 
-                                /** create new/created vertex **/
+                                // create new/created vertex 
                                 createNewVertex(i, tmpIncomingEdge, tmpOutgoingEdge);
                                 //set statistics counter: Num_SplitRepeats
                                 updateStatisticsCounter(StatisticsCounter.Num_SplitRepeats);
                                 getVertexValue().setCounters(counters);
                                 
-                                /** send msg to neighbors to update their edges to new vertex **/
+                                // send msg to neighbors to update their edges to new vertex 
                                 sendMsgToUpdateEdge(tmpIncomingEdge, tmpOutgoingEdge);
                                 
-                                /** store deleted edge **/
+                                // store deleted edge
                                 storeDeletedEdge(i, tmpIncomingEdge, tmpOutgoingEdge, neighborEdgeIntersection);
                             }
                         }
                     }                
                 }
-                /** delete extra edges from old vertex **/
+                // delete extra edges from old vertex
                 for(EdgeAndDir deletedEdge : deletedEdges){
                     deleteEdgeFromOldVertex(deletedEdge);
                 }
                 
-                /** Old vertex delete or voteToHalt **/
+                // Old vertex delete or voteToHalt 
                 if(getVertexValue().getDegree() == 0)//if no any edge, delete
                     deleteVertex(getVertexId());
                 else
@@ -265,7 +265,7 @@
         } else if(getSuperstep() == 2){
             while(msgIterator.hasNext()){
                 incomingMsg = msgIterator.next();
-                /** update edgelist to new/created vertex **/
+                // update edgelist to new/created vertex
                 updateEdgeListPointToNewVertex();
             }
             voteToHalt();
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
index 8b3ee23..09be8e5 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
@@ -6,6 +6,7 @@
 
 import edu.uci.ics.genomix.type.EdgeListWritable;
 import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.pregelix.api.graph.Vertex;
 import edu.uci.ics.pregelix.api.job.PregelixJob;
@@ -16,38 +17,10 @@
 import edu.uci.ics.genomix.pregelix.format.GraphCleanOutputFormat;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
 import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 
-/*
- * vertexId: BytesWritable
- * vertexValue: ByteWritable
- * edgeValue: NullWritable
- * message: MessageWritable
- * 
- * DNA:
- * A: 00
- * C: 01
- * G: 10
- * T: 11
- * 
- * succeed node
- *  A 00000001 1
- *  G 00000010 2
- *  C 00000100 4
- *  T 00001000 8
- * precursor node
- *  A 00010000 16
- *  G 00100000 32
- *  C 01000000 64
- *  T 10000000 128
- *  
- * For example, ONE LINE in input file: 00,01,10    0001,0010,
- * That means that vertexId is ACG, its succeed node is A and its precursor node is C.
- * The succeed node and precursor node will be stored in vertexValue and we don't use edgeValue.
- * The details about message are in edu.uci.ics.pregelix.example.io.MessageWritable. 
- */
 /**
- *  Remove tip or single node when l > constant
+ * @author anbangx
+ * Add tip 
  */
 public class TipAddVertex extends
         Vertex<VKmerBytesWritable, VertexValueWritable, NullWritable, MessageWritable> {
@@ -55,7 +28,7 @@
    
     private VKmerBytesWritable splitNode = new VKmerBytesWritable("CTA");
     private VKmerBytesWritable insertedTip = new VKmerBytesWritable("AGC");
-    private byte tipToSplitDir = MessageFlag.DIR_RF;
+    private EDGETYPE tipToSplitDir = EDGETYPE.FR;
     /**
      * initiate kmerSize, length
      */
@@ -66,7 +39,7 @@
     }
     
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    public void insertTip(byte dir, EdgeListWritable edgeList, VKmerBytesWritable insertedTip){
+    public void insertTip(EDGETYPE dir, EdgeListWritable edgeList, VKmerBytesWritable insertedTip){
         Vertex vertex = (Vertex) BspUtils.createVertex(getContext().getConfiguration());
         vertex.getMsgList().clear();
         vertex.getEdges().clear();
@@ -94,7 +67,7 @@
         return edgeList;
     }
     
-    public void addEdgeToInsertedTip(byte dir, VKmerBytesWritable insertedTip){
+    public void addEdgeToInsertedTip(EDGETYPE dir, VKmerBytesWritable insertedTip){
         EdgeWritable newEdge = new EdgeWritable();
         newEdge.setKey(insertedTip);
         newEdge.appendReadID(0);
@@ -102,24 +75,6 @@
     }
     
     /**
-     * Returns the edge dir for B->A when the A->B edge is type @dir
-     */
-    public byte mirrorDirection(byte dir) {
-        switch (dir) {
-            case MessageFlag.DIR_FF:
-                return MessageFlag.DIR_RR;
-            case MessageFlag.DIR_FR:
-                return MessageFlag.DIR_FR;
-            case MessageFlag.DIR_RF:
-                return MessageFlag.DIR_RF;
-            case MessageFlag.DIR_RR:
-                return MessageFlag.DIR_FF;
-            default:
-                throw new RuntimeException("Unrecognized direction in flipDirection: " + dir);
-        }
-    }
-    
-    /**
      * create a new vertex point to split node
      */
     @Override
@@ -130,7 +85,7 @@
                 /** add edge pointing to insertedTip **/
                 addEdgeToInsertedTip(tipToSplitDir, insertedTip);
                 /** insert tip **/
-                byte splitToTipDir = mirrorDirection(tipToSplitDir);
+                EDGETYPE splitToTipDir = tipToSplitDir.mirror();
                 insertTip(splitToTipDir, getEdgeListFromKmer(splitNode), insertedTip);
             }
         }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
index d0c3a51..deff7db 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
@@ -8,8 +8,9 @@
 import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
 import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
 import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
-import edu.uci.ics.genomix.pregelix.util.VertexUtil;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.DIR;
 
 /**
  * Remove tip or single node when l > constant
@@ -41,44 +42,58 @@
         counters.clear();
         getVertexValue().getCounters().clear();
     }
-
+    
+    /**
+     * detect the tip and figure out what edgeType neighborToTip is
+     */
+    public EDGETYPE getTipEdgetype(){
+        VertexValueWritable vertex = getVertexValue();
+        if(vertex.getDegree(DIR.PREVIOUS) == 0 && vertex.getDegree(DIR.NEXT) == 1){ //INCOMING TIP
+            return vertex.getEdgetypeFromDir(DIR.NEXT);
+        } else if(vertex.getDegree(DIR.PREVIOUS) == 1 && vertex.getDegree(DIR.NEXT) == 0){ //OUTGOING TIP
+            return vertex.getEdgetypeFromDir(DIR.PREVIOUS);
+        } else
+            return null;
+    }
+    
+    /**
+     * step1
+     */
+    public void detectTip(){
+        EDGETYPE neighborToTipEdgetype = getTipEdgetype();
+        //I'm tip and my length is less than the minimum
+        if(neighborToTipEdgetype != null && getVertexValue().getKmerLength() <= length){ 
+            EDGETYPE tipToNeighborEdgetype = neighborToTipEdgetype.mirror();
+            outgoingMsg.setFlag(tipToNeighborEdgetype.get());
+            outgoingMsg.setSourceVertexId(getVertexId());
+            destVertexId = getDestVertexId(neighborToTipEdgetype.dir());
+            sendMsg(destVertexId, outgoingMsg);
+            deleteVertex(getVertexId());
+            
+            //set statistics counter: Num_RemovedTips
+            updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
+            getVertexValue().setCounters(counters);
+        }
+    }
+    
+    /**
+     * step2
+     */
+    public void responseToDeadTip(Iterator<MessageWritable> msgIterator){
+        while(msgIterator.hasNext()){
+            incomingMsg = msgIterator.next();
+            EDGETYPE tipToMeEdgetype = EDGETYPE.fromByte(incomingMsg.getFlag());
+            getVertexValue().getEdgeList(tipToMeEdgetype).remove(incomingMsg.getSourceVertexId());
+        }
+    }
+    
     @Override
     public void compute(Iterator<MessageWritable> msgIterator) {
         initVertex(); 
-        if(getSuperstep() == 1){
-            if(VertexUtil.isIncomingTipVertex(getVertexValue())){
-            	if(getVertexValue().getKmerLength() <= length){
-            	    sendSettledMsgToNextNode();
-            		deleteVertex(getVertexId());
-                    //set statistics counter: Num_RemovedTips
-                    updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
-                    getVertexValue().setCounters(counters);
-            	}
-            }
-            else if(VertexUtil.isOutgoingTipVertex(getVertexValue())){
-                if(getVertexValue().getKmerLength() <= length){
-                    sendSettledMsgToPrevNode();
-                    deleteVertex(getVertexId());
-                    //set statistics counter: Num_RemovedTips
-                    updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
-                    getVertexValue().setCounters(counters);
-                }
-            }
-            else if(VertexUtil.isSingleVertex(getVertexValue())){
-                if(getVertexValue().getKmerLength() <= length){
-                    deleteVertex(getVertexId());
-                    //set statistics counter: Num_RemovedTips
-                    updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
-                    getVertexValue().setCounters(counters);
-                }
-            }
-        }
-        else if(getSuperstep() == 2){
-        	while(msgIterator.hasNext()){
-        		incomingMsg = msgIterator.next();
-        		responseToDeadVertex();
-        	}
-        }
+        if(getSuperstep() == 1)
+            detectTip();
+        else if(getSuperstep() == 2)
+            responseToDeadTip(msgIterator);
         voteToHalt();
     }
 
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/unrolltandemrepeat/UnrollTandemRepeat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/unrolltandemrepeat/UnrollTandemRepeat.java
index 0820011..390e5fe 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/unrolltandemrepeat/UnrollTandemRepeat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/unrolltandemrepeat/UnrollTandemRepeat.java
@@ -1,5 +1,6 @@
 package edu.uci.ics.genomix.pregelix.operator.unrolltandemrepeat;
 
+import java.util.EnumSet;
 import java.util.Iterator;
 
 import edu.uci.ics.genomix.pregelix.client.Client;
@@ -7,12 +8,11 @@
 import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
 import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
 import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
 import edu.uci.ics.genomix.pregelix.util.VertexUtil;
 import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 
 /**
  * Graph clean pattern: Unroll TandemRepeat
@@ -21,6 +21,7 @@
  */
 public class UnrollTandemRepeat extends
     BasicGraphCleanVertex<VertexValueWritable, MessageWritable>{
+    
     private EdgeWritable tmpEdge = new EdgeWritable();
     
     /**
@@ -50,15 +51,15 @@
      */
     public boolean repeatCanBeMerged(){
         tmpValue.setAsCopy(getVertexValue());
-        tmpValue.getEdgeList(repeatDir).remove(repeatKmer);
+        tmpValue.getEdgeList(repeatEdgetype).remove(repeatKmer);
         boolean hasFlip = false;
-        /** pick one edge and flip **/
-        for(byte d : DirectionFlag.values){
-            for(EdgeWritable edge : tmpValue.getEdgeList(d)){
-                byte flipDir = flipDir(d);
+        // pick one edge and flip 
+        for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+            for(EdgeWritable edge : tmpValue.getEdgeList(et)){
+                EDGETYPE flipDir = et.flip();
                 tmpValue.getEdgeList(flipDir).add(edge);
-                tmpValue.getEdgeList(d).remove(edge);
-                /** setup hasFlip to go out of the loop **/
+                tmpValue.getEdgeList(et).remove(edge);
+                // setup hasFlip to go out of the loop 
                 hasFlip = true;
                 break;
             }
@@ -77,17 +78,17 @@
      * merge tandem repeat
      */
     public void mergeTandemRepeat(){
-        getVertexValue().getInternalKmer().mergeWithKmerInDir(repeatDir, kmerSize, getVertexId());
-        getVertexValue().getEdgeList(repeatDir).remove(getVertexId());
+        getVertexValue().getInternalKmer().mergeWithKmerInDir(repeatEdgetype, kmerSize, getVertexId());
+        getVertexValue().getEdgeList(repeatEdgetype).remove(getVertexId());
         boolean hasFlip = false;
         /** pick one edge and flip **/
-        for(byte d : DirectionFlag.values){
-            for(EdgeWritable edge : getVertexValue().getEdgeList(d)){
-                byte flipDir = flipDir(d);
+        for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+            for(EdgeWritable edge : getVertexValue().getEdgeList(et)){
+                EDGETYPE flipDir = et.flip();
                 getVertexValue().getEdgeList(flipDir).add(edge);
-                getVertexValue().getEdgeList(d).remove(edge);
+                getVertexValue().getEdgeList(et).remove(edge);
                 /** send flip message to node for updating edgeDir **/
-                outgoingMsg.setFlag(flipDir);
+                outgoingMsg.setFlag(flipDir.get());
                 outgoingMsg.setSourceVertexId(getVertexId());
                 sendMsg(edge.getKey(), outgoingMsg);
                 /** setup hasFlip to go out of the loop **/
@@ -103,9 +104,9 @@
      * update edges
      */
     public void updateEdges(){
-        byte flipDir = flipDir((byte)(incomingMsg.getFlag() & MessageFlag.DEAD_MASK));
-        byte prevNeighborToMe = mirrorDirection(flipDir);
-        byte curNeighborToMe = mirrorDirection((byte)(incomingMsg.getFlag() & MessageFlag.DEAD_MASK));
+        EDGETYPE flipDir = EDGETYPE.fromByte(incomingMsg.getFlag()); 
+        EDGETYPE prevNeighborToMe = flipDir.mirror();
+        EDGETYPE curNeighborToMe = flipDir.mirror(); //mirrorDirection((byte)(incomingMsg.getFlag() & MessageFlag.DEAD_MASK));
         tmpEdge.setAsCopy(getVertexValue().getEdgeList(prevNeighborToMe).getEdge(incomingMsg.getSourceVertexId()));
         getVertexValue().getEdgeList(prevNeighborToMe).remove(incomingMsg.getSourceVertexId());
         getVertexValue().getEdgeList(curNeighborToMe).add(tmpEdge);
@@ -117,8 +118,8 @@
         if(getSuperstep() == 1){
             if(isTandemRepeat(getVertexValue()) && repeatCanBeMerged()){
                 mergeTandemRepeat();
-                //set statistics counter: Num_RemovedTips
-                updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
+                //set statistics counter: Num_TandemRepeats
+                updateStatisticsCounter(StatisticsCounter.Num_TandemRepeats);
                 getVertexValue().setCounters(counters);
             }
             voteToHalt();
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
index fc38f4d..7905718 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
@@ -10,11 +10,18 @@
     public static final byte DIR_RR = 0b11 << 0;
     public static final byte DIR_MASK = 0b11 << 0;
     public static final byte DIR_CLEAR = 0b1111100 << 0;
+    public static final short REPLACE_DIR_MASK = 0b11 << 0;
+    public static final short REPLACE_DIR_CLEAR = 0b11111111111100 << 0;
     
     public static final byte[] values = { DIR_FF, DIR_FR, DIR_RF, DIR_RR };
     
-    public static final short UNCHANGE = 0b0 << 8;
+    public static final short UNCHANGE = 0b0 << 7;
     public static final short UPDATE = 0b01 << 7; //reuse 0b0 << 6, becasue UNCHANGE and UPDATE use for different patterns
+    public static final short MSG_TYPE_MASK = 0b1 << 7;
+    public static final short MSG_TYPE_CLEAR = 0b111111110111111;
+    
+//    public static final short UNCHANGE = 0b0 << 8;
+//    public static final short UPDATE = 0b01 << 7; //reuse 0b0 << 6, becasue UNCHANGE and UPDATE use for different patterns
     public static final short KILL = 0b1 << 8;
     public static final short KILL_MASK = 0b1 << 8;
     
@@ -22,6 +29,20 @@
     public static final short DIR_FROM_DEADVERTEX = 0b1 << 7;
     public static final short DEAD_MASK = 0b1 << 7;
     
+    public static final short MERGE_DIR_FF = 0b00 << 9;
+    public static final short MERGE_DIR_FR = 0b01 << 9;
+    public static final short MERGE_DIR_RF = 0b10 << 9;
+    public static final short MERGE_DIR_RR = 0b11 << 9;
+    public static final short MERGE_DIR_MASK = 0b11 << 9;
+    public static final short MERGE_DIR_CLEAR = 0b11100111111111;
+    
+    public static final short DELETE_DIR_FF = 0b00 << 11;
+    public static final short DELETE_DIR_FR = 0b01 << 11;
+    public static final short DELETE_DIR_RF = 0b10 << 11;
+    public static final short DELETE_DIR_RR = 0b11 << 11;
+    public static final short DELETE_DIR_MASK = 0b11 << 11;
+    public static final short DELETE_DIR_CLEAR = 0b10011111111111;
+    
     public static String getFlagAsString(byte code) {
         return "ERROR_BAD_MESSAGE";
     }
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
index a40e52b..e50cbc6 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
@@ -21,6 +21,7 @@
 import edu.uci.ics.genomix.pregelix.operator.bridgeremove.BridgeRemoveVertex;
 import edu.uci.ics.genomix.pregelix.operator.bubblemerge.BubbleAddVertex;
 import edu.uci.ics.genomix.pregelix.operator.bubblemerge.BubbleMergeVertex;
+import edu.uci.ics.genomix.pregelix.operator.pathmerge.P0ForPathMergeVertex;
 import edu.uci.ics.genomix.pregelix.operator.pathmerge.P1ForPathMergeVertex;
 import edu.uci.ics.genomix.pregelix.operator.pathmerge.P2ForPathMergeVertex;
 import edu.uci.ics.genomix.pregelix.operator.pathmerge.MapReduceVertex;
@@ -71,6 +72,23 @@
         generateMapReduceGraphJob("MapReduceGraph", outputBase + "MapReduceGraph.xml");
     }
     
+    private static void generateP0ForMergeGraphJob(String jobName, String outputPath) throws IOException {
+        PregelixJob job = new PregelixJob(new GenomixJobConf(3), jobName);
+        job.setVertexClass(P0ForPathMergeVertex.class);
+        job.setGlobalAggregatorClass(StatisticsAggregator.class);
+        job.setVertexInputFormatClass(InitialGraphCleanInputFormat.class);
+        job.setVertexOutputFormatClass(GraphCleanOutputFormat.class);
+        job.setDynamicVertexValueSize(true);
+        job.setOutputKeyClass(VKmerBytesWritable.class);
+        job.setOutputValueClass(VertexValueWritable.class);
+        job.getConfiguration().writeXml(new FileOutputStream(new File(outputPath)));
+    }
+
+    private static void genP0ForMergeGraph() throws IOException {
+        generateP0ForMergeGraphJob("P0ForMergeGraph", outputBase
+                + "P0ForMergeGraph.xml");
+    }
+    
     private static void generateP1ForMergeGraphJob(String jobName, String outputPath) throws IOException {
         PregelixJob job = new PregelixJob(new GenomixJobConf(3), jobName);
         job.setVertexClass(P1ForPathMergeVertex.class);
@@ -329,6 +347,7 @@
         FileUtils.forceMkdir(new File(outputBase));
         genUnrollTandemRepeatGraph();
         genMapReduceGraph();
+        genP0ForMergeGraph();
         genP1ForMergeGraph();
         genP2ForMergeGraph();
         genP4ForMergeGraph();
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeTestSuite.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeTestSuite.java
index 71444a6..a2a305e 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeTestSuite.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeTestSuite.java
@@ -6,8 +6,10 @@
 
     public static Test suite() throws Exception {
         String pattern ="PathMerge"; 
-        String testSet[] = {"ThreeNodesCycle", "RingPath", "SimpleTreePath", "RingPath", "CyclePath", "9", "P2_8", "ComplexTandemRepeat"
-//                "2", "3", "4", "5", "6", "7", "8", "9", "head_6", "head_7",
+        String testSet[] = {"9", "SimpleTreePath", "RingPath", "ThreeNodesCycle", "CyclePath", "P2_8", "ComplexTandemRepeat", "SimpleTreePath"
+//                "2", "3", "4", "5", "6", "7", "8",
+//                "9", 
+//                "head_6", "head_7",
 //                "P2_3", "P2_4", "P2_5", "P2_6", "P2_7", "P2_8",
 //                "LeftAdj", "RightAdj",
 //                "FR", "RF", "head_FR", "head_RF", "twohead_FR", "twohead_RF",
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/TipRemoveTestSuite.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/TipRemoveTestSuite.java
index 81dc9ba..eb4a099 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/TipRemoveTestSuite.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/TipRemoveTestSuite.java
@@ -6,7 +6,7 @@
 
     public static Test suite() throws Exception {
         String pattern ="TipRemove";
-        String testSet[] = {"SmallGenome", "FR_Tip", "RF_Tip"};
+        String testSet[] = {"FR_Tip", "RF_Tip"};
         init(pattern, testSet);
         BasicGraphCleanTestSuite testSuite = new BasicGraphCleanTestSuite();
         return makeTestSuite(testSuite);
diff --git a/genomix/genomix-pregelix/src/test/resources/conf/logging.properties b/genomix/genomix-pregelix/src/test/resources/conf/logging.properties
index 55f6060..0564c07 100644
--- a/genomix/genomix-pregelix/src/test/resources/conf/logging.properties
+++ b/genomix/genomix-pregelix/src/test/resources/conf/logging.properties
@@ -62,7 +62,7 @@
 # For example, set the com.xyz.foo logger to only log SEVERE
 # messages:
 
-edu.uci.ics.genomix.pregelix = FINE
+edu.uci.ics.genomix.pregel.level = FINE
 #edu.uci.ics.asterix.level = FINE
 #edu.uci.ics.algebricks.level = FINE
 edu.uci.ics.hyracks.level = SEVERE
diff --git a/genomix/genomix-pregelix/src/test/resources/only_PathMerge.txt b/genomix/genomix-pregelix/src/test/resources/only_PathMerge.txt
index 3d007d2..b27e516 100644
--- a/genomix/genomix-pregelix/src/test/resources/only_PathMerge.txt
+++ b/genomix/genomix-pregelix/src/test/resources/only_PathMerge.txt
@@ -1 +1 @@
-P4ForMergeGraph.xml
+P1ForMergeGraph.xml