simplified dns (no self-made recursion); merge PingScheduler and PingRotate; make...
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 23 Apr 2015 16:06:45 +0000 (18:06 +0200)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Mon, 4 May 2015 14:57:58 +0000 (16:57 +0200)
does not compile yet, work in progress!

18 files changed:
doc/pingcheck_icmp_distributor.graphml
src/CMakeLists.txt
src/dns/dnscache.cpp
src/dns/dnscache.h
src/dns/dnsresolver.cpp
src/dns/dnsresolver.h
src/dns/resolverbase.cpp
src/dns/resolverbase.h
src/dns/timetolive.h
src/host/pinger.h
src/host/pingerfactory.cpp
src/host/pingerfactory.h
src/host/pingscheduler.cpp
src/host/pingscheduler.h
src/icmp/icmppinger.cpp
src/icmp/icmppinger.h
src/tcp/tcppinger.cpp
src/tcp/tcppinger.h

index d6248fc..bca452a 100644 (file)
   <key for="edge" id="d10" yfiles.type="edgegraphics"/>
   <graph edgedefault="directed" id="G">
     <data key="d0"/>
-    <node id="n0">
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="81.552734375" x="396.8046875" y="-528.4126953124982"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="71.552734375" x="5.0" y="6.015625">IcmpPinger<y:LabelModel>
-              <y:SmartNodeLabelModel distance="4.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-            </y:ModelParameter>
-          </y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n1">
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="81.552734375" x="396.8046875" y="-450.41269531249816"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="71.552734375" x="5.0" y="6.015625">IcmpPinger<y:LabelModel>
-              <y:SmartNodeLabelModel distance="4.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-            </y:ModelParameter>
-          </y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n2">
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="38.0" width="147.669921875" x="63.41796875" y="-544.4126953124982"/>
-          <y:Fill color="#00FF00" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="137.669921875" x="5.0" y="3.03125">IcmpPacketDistributor
-(singleton)<y:LabelModel>
-              <y:SmartNodeLabelModel distance="4.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-            </y:ModelParameter>
-          </y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n3">
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="97.044921875" x="651.5" y="-614.4126953124982"/>
-          <y:Fill color="#FF99CC" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="87.044921875" x="5.0" y="6.015625">PingerFactory<y:LabelModel>
-              <y:SmartNodeLabelModel distance="4.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-            </y:ModelParameter>
-          </y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n4">
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="128.603515625" x="635.720703125" y="-371.41269531249816"/>
-          <y:Fill color="#00FFFF" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="118.603515625" x="5.0" y="6.015625">IcmpPacketFactory<y:LabelModel>
-              <y:SmartNodeLabelModel distance="4.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-            </y:ModelParameter>
-          </y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n5">
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="46.0" width="54.59375" x="148.494140625" y="-427.41269531249816"/>
-          <y:Fill color="#CCFFFF" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="44.59375" x="5.0" y="7.03125">ICMP
-Socket<y:LabelModel>
-              <y:SmartNodeLabelModel distance="4.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-            </y:ModelParameter>
-          </y:NodeLabel>
-          <y:Shape type="octagon"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n6">
-      <data key="d6">
-        <y:GenericNode configuration="com.yworks.flowchart.cloud">
-          <y:Geometry height="82.0" width="128.603515625" x="141.2099609375" y="-314.41269531249816"/>
-          <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="60.548828125" x="34.02734375" y="32.015625">the world<y:LabelModel>
-              <y:SmartNodeLabelModel distance="4.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-            </y:ModelParameter>
-          </y:NodeLabel>
-        </y:GenericNode>
-      </data>
-    </node>
-    <node id="n7">
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="117.828125" x="-4.8720703125" y="-419.41269531249816"/>
-          <y:Fill color="#CCFFFF" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="107.828125" x="5.0" y="6.015625">NetworkInterface<y:LabelModel>
-              <y:SmartNodeLabelModel distance="4.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-            </y:ModelParameter>
-          </y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n8" yfiles.foldertype="group">
+    <node id="n0" yfiles.foldertype="group">
       <data key="d6">
         <y:TableNode configuration="YED_TABLE_NODE">
-          <y:Geometry height="3993.263041797246" width="1845.0872599283853" x="-528.8031738281253" y="-78.83515624999995"/>
+          <y:Geometry height="3993.263041797246" width="2060.0647747188577" x="-1582.9935762048026" y="259.37818476704297"/>
           <y:Fill color="#ECF5FF" color2="#0042F440" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.453125" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="98.306640625" x="873.3903096516926" y="4.0">Time Course</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.453125" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="98.306640625" x="980.8790670469289" y="4.0">Time Course</y:NodeLabel>
           <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="33.982421875" x="137.8311767578125" y="33.0">main<y:LabelModel>
               <y:ColumnNodeLabelModel offset="3.0"/>
             </y:LabelModel>
@@ -165,7 +28,7 @@ Socket<y:LabelModel>
               <y:ColumnNodeLabelModelParameter id="column_0" inside="true" verticalPosition="0.0"/>
             </y:ModelParameter>
           </y:NodeLabel>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="145.146484375" x="390.97583007812494" y="33.0">PingScheduler (+timer)<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="145.146484375" x="390.975830078125" y="33.0">PingScheduler (+timer)<y:LabelModel>
               <y:ColumnNodeLabelModel offset="3.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -200,7 +63,7 @@ Socket<y:LabelModel>
               <y:ColumnNodeLabelModelParameter id="column_5" inside="true" verticalPosition="0.0"/>
             </y:ModelParameter>
           </y:NodeLabel>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="113.921875" x="1655.4514668782554" y="33.0">other components<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="113.921875" x="1762.9402242734914" y="33.0">other components<y:LabelModel>
               <y:ColumnNodeLabelModel offset="3.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -218,13 +81,13 @@ Socket<y:LabelModel>
           </y:StyleProperties>
           <y:State autoResize="true" closed="false" closedHeight="80.0" closedWidth="100.0"/>
           <y:Insets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-          <y:BorderInsets bottom="368" bottomF="368.44119714928" left="53" leftF="53.40576171875" right="27" rightF="26.526692708333485" top="18" topF="18.436230468749955"/>
+          <y:BorderInsets bottom="227" bottomF="226.59063350010365" left="53" leftF="53.40576171875" right="132" rightF="132.49182611363494" top="18" topF="18.436230468749955"/>
           <y:Table autoResizeTable="true" defaultColumnWidth="120.0" defaultMinimumColumnWidth="80.0" defaultMinimumRowHeight="50.0" defaultRowHeight="80.0">
             <y:DefaultColumnInsets bottom="0.0" left="0.0" right="0.0" top="24.0"/>
             <y:DefaultRowInsets bottom="0.0" left="0.0" right="0.0" top="0.0"/>
             <y:Insets bottom="0.0" left="0.0" right="0.0" top="30.0"/>
             <y:Columns>
-              <y:Column id="column_0" minimumWidth="80.0" width="309.64477539062494">
+              <y:Column id="column_0" minimumWidth="80.0" width="309.644775390625">
                 <y:Insets bottom="0.0" left="0.0" right="0.0" top="24.0"/>
               </y:Column>
               <y:Column id="column_1" minimumWidth="80.0" width="307.80859375">
@@ -242,7 +105,7 @@ Socket<y:LabelModel>
               <y:Column id="column_5" minimumWidth="80.0" width="147.4658203125">
                 <y:Insets bottom="0.0" left="0.0" right="0.0" top="24.0"/>
               </y:Column>
-              <y:Column id="column_6" minimumWidth="80.0" width="265.34971110026027">
+              <y:Column id="column_6" minimumWidth="80.0" width="480.32722589073273">
                 <y:Insets bottom="0.0" left="0.0" right="0.0" top="24.0"/>
               </y:Column>
             </y:Columns>
@@ -254,11 +117,11 @@ Socket<y:LabelModel>
           </y:Table>
         </y:TableNode>
       </data>
-      <graph edgedefault="directed" id="n8:">
-        <node id="n8::n0">
+      <graph edgedefault="directed" id="n0:">
+        <node id="n0::n0">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="92.6796875" x="-101.2091796875003" y="742.4464879473617"/>
+              <y:Geometry height="30.0" width="92.6796875" x="-1257.1492890954278" y="1133.9604050609246"/>
               <y:Fill color="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="82.6796875" x="5.0" y="6.015625">start_pinging<y:LabelModel>
@@ -272,30 +135,13 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n1">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="118.478515625" x="-114.1085937500003" y="853.3410191973619"/>
-              <y:Fill color="#FFFF00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="108.478515625" x="5.0" y="6.015625">resolve_and_ping<y:LabelModel>
-                  <y:SmartNodeLabelModel distance="4.0"/>
-                </y:LabelModel>
-                <y:ModelParameter>
-                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-                </y:ModelParameter>
-              </y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n8::n2">
+        <node id="n0::n1">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="40.173828125" x="-74.9562500000003" y="1056.5138239997384"/>
+              <y:Geometry height="30.0" width="40.173828125" x="-1230.8963594079278" y="1262.5323388756406"/>
               <y:Fill color="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="30.173828125" x="5.0" y="6.015625">ping<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="30.173828125" x="5.0" y="6.015624999999886">ping<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -306,10 +152,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n3">
+        <node id="n0::n2">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="43.982421875" x="-475.3974121093753" y="-6.39892578125"/>
+              <y:Geometry height="30.0" width="43.982421875" x="-1529.5878144860526" y="331.8144152357929"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="33.982421875" x="5.0" y="6.015625">main<y:LabelModel>
@@ -323,10 +169,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n4">
+        <node id="n0::n3">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="92.69140625" x="-379.9833496093753" y="703.9714879473618"/>
+              <y:Geometry height="30.0" width="92.69140625" x="-1421.460726465029" y="1098.8149503679072"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="82.69140625" x="5.0" y="6.015625">start_pingers<y:LabelModel>
@@ -340,10 +186,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n5">
+        <node id="n0::n4">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="127.953125" x="-217.58629150390698" y="2538.444545657081"/>
+              <y:Geometry height="30.0" width="127.953125" x="-1273.2522798180844" y="2812.5788080893662"/>
               <y:Fill color="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="117.953125" x="5.0" y="6.015625">ping_done_handler<y:LabelModel>
@@ -357,10 +203,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n6">
+        <node id="n0::n5">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="78.353515625" x="-94.0460937500003" y="803.5910191973619"/>
+              <y:Geometry height="30.0" width="78.353515625" x="-1249.9862031579278" y="1195.104936310925"/>
               <y:Fill color="#FF9900" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="68.353515625" x="5.0" y="6.015625">First Delay<y:LabelModel>
@@ -374,10 +220,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n7">
+        <node id="n0::n6">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="80.1171875" x="-146.04332275390698" y="2684.944545657082"/>
+              <y:Geometry height="30.0" width="80.1171875" x="-1201.7093110680844" y="3202.745130575656"/>
               <y:Fill color="#FF9900" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="70.1171875" x="5.0" y="6.015625">async_wait<y:LabelModel>
@@ -391,10 +237,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n8">
+        <node id="n0::n7">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="140.205078125" x="-59.63316650390698" y="2598.444545657081"/>
+              <y:Geometry height="30.0" width="140.205078125" x="-1115.2991548180844" y="2872.5788080893662"/>
               <y:Fill color="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="130.205078125" x="5.0" y="6.015625">update_ping_interval<y:LabelModel>
@@ -408,10 +254,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n9">
+        <node id="n0::n8">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="174.505859375" x="-93.93394775390698" y="2641.694545657082"/>
+              <y:Geometry height="30.0" width="174.505859375" x="-1149.5999360680844" y="2915.828808089367"/>
               <y:Fill color="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="164.505859375" x="5.0" y="6.015625">update_ping_elapsed_time<y:LabelModel>
@@ -425,10 +271,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n10">
+        <node id="n0::n9">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="83.720703125" x="-401.4149902343753" y="77.83336588541715"/>
+              <y:Geometry height="30.0" width="83.720703125" x="-1455.6053926110526" y="416.0467069024601"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="73.720703125" x="5.0" y="6.015625">init_pingers<y:LabelModel>
@@ -442,10 +288,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n11">
+        <node id="n0::n10">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="84.400390625" x="-120.45302734375025" y="97.20836588541715"/>
+              <y:Geometry height="30.0" width="84.400390625" x="-1174.6434297204278" y="435.4217069024601"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="74.400390625" x="5.0" y="6.015625">Constructor<y:LabelModel>
@@ -459,62 +305,11 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n12">
+        <node id="n0::n11">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="84.400390625" x="176.3552734374997" y="132.52086588541715"/>
-              <y:Fill color="#339966" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="74.400390625" x="5.0" y="6.015625">Constructor<y:LabelModel>
-                  <y:SmartNodeLabelModel distance="4.0"/>
-                </y:LabelModel>
-                <y:ModelParameter>
-                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-                </y:ModelParameter>
-              </y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n8::n13">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="40.173828125" x="99.49262609790833" y="1122.9117819974613"/>
-              <y:Fill color="#339966" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="30.173828125" x="5.0" y="6.015625">ping<y:LabelModel>
-                  <y:SmartNodeLabelModel distance="4.0"/>
-                </y:LabelModel>
-                <y:ModelParameter>
-                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-                </y:ModelParameter>
-              </y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n8::n14">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="155.59765625" x="194.08124999999973" y="1135.6800016379514"/>
-              <y:Fill color="#339966" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="145.59765625" x="5.0" y="6.015625">set_ping_done_callback<y:LabelModel>
-                  <y:SmartNodeLabelModel distance="4.0"/>
-                </y:LabelModel>
-                <y:ModelParameter>
-                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-                </y:ModelParameter>
-              </y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n8::n15">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="143.66796875" x="212.42369791666647" y="1182.9716683046188"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="143.66796875" x="-1118.7620454430844" y="2957.53115571733"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="133.66796875" x="5.0" y="6.015625">update_ping_protocol<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
@@ -527,11 +322,11 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n16">
+        <node id="n0::n12">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="153.88671875" x="193.3458984374996" y="237.64013584739416"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="153.88671875" x="-1155.3995820641776" y="547.9813418834485"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="143.88671875" x="5.0" y="6.015625">get_next_ping_protocol<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
@@ -544,10 +339,10 @@ Socket<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n17">
+        <node id="n0::n13">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="118.490234375" x="-117.19566650390698" y="2732.6281841661958"/>
+              <y:Geometry height="30.0" width="118.490234375" x="-1172.8616548180844" y="3250.4287690847696"/>
               <y:Fill color="#FF9900" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="108.490234375" x="5.0" y="-0.96875">timeout
@@ -562,10 +357,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n18">
+        <node id="n0::n14">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="90.658203125" x="-410.6318522135431" y="2987.7676861193213"/>
+              <y:Geometry height="30.0" width="90.658203125" x="-1464.8222545902204" y="3467.8315907855413"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="80.658203125" x="5.0" y="6.015625">stop_pingers<y:LabelModel>
@@ -579,10 +374,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n19">
+        <node id="n0::n15">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="90.646484375" x="-147.51890869140698" y="3003.262477785989"/>
+              <y:Geometry height="30.0" width="90.646484375" x="-1201.7093110680844" y="3483.326382452209"/>
               <y:Fill color="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="80.646484375" x="5.0" y="6.015625">stop_pinging<y:LabelModel>
@@ -596,10 +391,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n20">
+        <node id="n0::n16">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="43.982421875" x="-462.8798990885431" y="2939.6557069526552"/>
+              <y:Geometry height="30.0" width="43.982421875" x="-1517.0703014652204" y="3419.719611618875"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="33.982421875" x="5.0" y="6.015625">main<y:LabelModel>
@@ -613,27 +408,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n21">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="90.646484375" x="165.9949584960932" y="3021.7918356961454"/>
-              <y:Fill color="#339966" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="80.646484375" x="5.0" y="6.015625">stop_pinging<y:LabelModel>
-                  <y:SmartNodeLabelModel distance="4.0"/>
-                </y:LabelModel>
-                <y:ModelParameter>
-                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-                </y:ModelParameter>
-              </y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n8::n22">
+        <node id="n0::n17">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="52.87109375" x="-118.76402587890698" y="3342.3183086779163"/>
+              <y:Geometry height="30.0" width="52.87109375" x="-1172.9544282555844" y="3822.3822133441363"/>
               <y:Fill color="#FF9900" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="42.87109375" x="5.0" y="6.015625">cancel<y:LabelModel>
@@ -647,10 +425,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n23">
+        <node id="n0::n18">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="127.953125" x="-77.68199462890698" y="3232.9433086779163"/>
+              <y:Geometry height="30.0" width="127.953125" x="-1131.8723970055844" y="3713.0072133441363"/>
               <y:Fill color="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="117.953125" x="5.0" y="6.015625">ping_done_handler<y:LabelModel>
@@ -664,10 +442,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n24">
+        <node id="n0::n19">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="-26.427111816406978" y="3282.3183086779163"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-1080.6175141930844" y="3762.3822133441363"/>
               <y:Fill color="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
@@ -681,10 +459,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n25">
+        <node id="n0::n20">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="78.93359375" x="746.3961303710931" y="1689.8875144070819"/>
+              <y:Geometry height="30.0" width="78.93359375" x="-335.6351012949266" y="1964.021776839367"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="68.93359375" x="5.0" y="6.015625">get_socket<y:LabelModel>
@@ -698,10 +476,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n26">
+        <node id="n0::n21">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="162.48828125" x="725.7034505208328" y="448.9150585361966"/>
+              <y:Geometry height="30.0" width="162.48828125" x="-328.4869518558447" y="787.1283995532395"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="152.48828125" x="5.0" y="6.015625">register_receive_handler<y:LabelModel>
@@ -715,10 +493,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n27">
+        <node id="n0::n22">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="99.025390625" x="935.5458333333329" y="473.0830720453108"/>
+              <y:Geometry height="30.0" width="99.025390625" x="-118.64456904334463" y="811.2964130623537"/>
               <y:Fill color="#CCFFCC" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="89.025390625" x="5.0" y="6.015625">async_receive<y:LabelModel>
@@ -732,10 +510,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n28">
+        <node id="n0::n23">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="60.904296875" x="935.8635131835932" y="1756.8524029161956"/>
+              <y:Geometry height="30.0" width="60.904296875" x="-146.1677184824265" y="2030.9866653484803"/>
               <y:Fill color="#CCFFCC" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="50.904296875" x="5.0" y="6.015625">send_to<y:LabelModel>
@@ -749,10 +527,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n29">
+        <node id="n0::n24">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="105.013671875" x="740.6412475585931" y="2035.2578269070823"/>
+              <y:Geometry height="30.0" width="105.013671875" x="-341.3899841074266" y="2309.392089339367"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="95.013671875" x="5.0" y="6.015625">handle_receive<y:LabelModel>
@@ -766,10 +544,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n30">
+        <node id="n0::n25">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="162.48828125" x="711.9039428710931" y="2253.067960777525"/>
+              <y:Geometry height="30.0" width="162.48828125" x="-370.1272887949266" y="2527.2022232098097"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="152.48828125" x="5.0" y="6.015625">register_receive_handler<y:LabelModel>
@@ -783,10 +561,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n31">
+        <node id="n0::n26">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="229.091796875" x="1060.6655965169266" y="1630.3305279161962"/>
+              <y:Geometry height="30.0" width="229.091796875" x="21.77759401757328" y="1904.4647903484813"/>
               <y:Fill color="#00FFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="219.091796875" x="5.0" y="-0.96875">IcmpPacketFactory
@@ -801,10 +579,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n32">
+        <node id="n0::n27">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="142.28515625" x="1103.014880371093" y="2070.7289654161964"/>
+              <y:Geometry height="30.0" width="142.28515625" x="20.98364870507328" y="2344.863227848481"/>
               <y:Fill color="#00FFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="132.28515625" x="5.0" y="-0.96875">IcmpPacketFactory
@@ -819,10 +597,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n33">
+        <node id="n0::n28">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="156.03125" x="1086.040270996093" y="2587.4563091661958"/>
+              <y:Geometry height="30.0" width="156.03125" x="4.0090393300732785" y="2861.590571598481"/>
               <y:Fill color="#666699" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="146.03125" x="5.0" y="-0.96875">HostStatus
@@ -837,10 +615,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n34">
+        <node id="n0::n29">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="99.025390625" x="914.2463256835937" y="2286.3609742866383"/>
+              <y:Geometry height="30.0" width="99.025390625" x="-130.43015963781318" y="2560.4952367189235"/>
               <y:Fill color="#CCFFCC" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="89.025390625" x="5.0" y="6.015625">async_receive<y:LabelModel>
@@ -854,28 +632,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n35">
+        <node id="n0::n30">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="98.55078125" x="1123.6831746419266" y="119.03262939453134"/>
-              <y:Fill color="#FF99CC" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="88.55078125" x="5.0" y="-0.96875">Pingerfactory
-::createPinger<y:LabelModel>
-                  <y:SmartNodeLabelModel distance="4.0"/>
-                </y:LabelModel>
-                <y:ModelParameter>
-                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-                </y:ModelParameter>
-              </y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n8::n36">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="98.55078125" x="1139.5491251627598" y="290.6873160231738"/>
+              <y:Geometry height="30.0" width="98.55078125" x="85.35872278608224" y="628.9006570402167"/>
               <y:Fill color="#FF99CC" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="88.55078125" x="5.0" y="-0.96875">PingerFactory
@@ -890,10 +650,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n37">
+        <node id="n0::n31">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="40.173828125" x="505.1594116210932" y="1470.9875144070813"/>
+              <y:Geometry height="30.0" width="40.173828125" x="-576.8718200449265" y="1745.1217768393665"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="30.173828125" x="5.0" y="6.015625">ping<y:LabelModel>
@@ -907,10 +667,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n38">
+        <node id="n0::n32">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="76.806640625" x="575.3332397460932" y="1570.9875144070813"/>
+              <y:Geometry height="30.0" width="76.806640625" x="-506.6979919199265" y="1845.1217768393665"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="66.806640625" x="5.0" y="6.015625">start_send<y:LabelModel>
@@ -924,10 +684,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n39">
+        <node id="n0::n33">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="129.6640625" x="465.5012084960932" y="1669.3875144070819"/>
+              <y:Geometry height="30.0" width="129.6640625" x="-616.5300231699265" y="1943.521776839367"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="119.6640625" x="5.0" y="6.015625">send_echo_request<y:LabelModel>
@@ -941,10 +701,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n40">
+        <node id="n0::n34">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="191.837890625" x="434.4142944335932" y="1786.4031394070819"/>
+              <y:Geometry height="30.0" width="191.837890625" x="-647.6169372324265" y="2060.537401839367"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="181.837890625" x="5.0" y="6.015625">schedule_timeout_echo_reply<y:LabelModel>
@@ -958,10 +718,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n41">
+        <node id="n0::n35">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="186.857421875" x="444.1896850585932" y="2129.0078269070823"/>
+              <y:Geometry height="30.0" width="186.857421875" x="-637.8415466074265" y="2403.142089339367"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="176.857421875" x="5.0" y="6.015625">handle_receive_icmp_packet<y:LabelModel>
@@ -975,10 +735,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n42">
+        <node id="n0::n36">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="107.38671875" x="450.1550170898432" y="2189.0078269070823"/>
+              <y:Geometry height="30.0" width="107.38671875" x="-631.8762145761765" y="2463.142089339367"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="97.38671875" x="5.0" y="6.015625">set_ping_status<y:LabelModel>
@@ -992,10 +752,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n43">
+        <node id="n0::n37">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="107.38671875" x="437.9465209960932" y="1530.9875144070813"/>
+              <y:Geometry height="30.0" width="107.38671875" x="-644.0847106699265" y="1805.1217768393665"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="97.38671875" x="5.0" y="6.015625">set_ping_status<y:LabelModel>
@@ -1009,10 +769,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n44">
+        <node id="n0::n38">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="122.28125" x="498.6642944335932" y="2503.46104142531"/>
+              <y:Geometry height="30.0" width="122.28125" x="-583.3669372324265" y="2777.5953038575954"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="112.28125" x="5.0" y="6.015625">PingDoneCallback<y:LabelModel>
@@ -1026,10 +786,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n45">
+        <node id="n0::n39">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="80.1171875" x="497.5598022460932" y="1835.7312644070819"/>
+              <y:Geometry height="30.0" width="80.1171875" x="-584.4714294199265" y="2109.865526839367"/>
               <y:Fill color="#FF9900" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="70.1171875" x="5.0" y="6.015625">async_wait<y:LabelModel>
@@ -1043,10 +803,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n46">
+        <node id="n0::n40">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="52.87109375" x="572.7033569335932" y="2227.7031394070823"/>
+              <y:Geometry height="30.0" width="52.87109375" x="-509.3278747324265" y="2501.837401839367"/>
               <y:Fill color="#FF9900" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="42.87109375" x="5.0" y="6.015625">cancel<y:LabelModel>
@@ -1060,10 +820,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n47">
+        <node id="n0::n41">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="107.662109375" x="439.9157592773432" y="2411.612514407082"/>
+              <y:Geometry height="30.0" width="107.662109375" x="-642.1154723886765" y="2685.746776839367"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="97.662109375" x="5.0" y="6.015625">handle_timeout<y:LabelModel>
@@ -1077,10 +837,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n48">
+        <node id="n0::n42">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="107.38671875" x="562.5741984049465" y="2463.309780032082"/>
+              <y:Geometry height="30.0" width="107.38671875" x="-519.4570332610732" y="2737.444042464367"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="97.38671875" x="5.0" y="6.015625">set_ping_status<y:LabelModel>
@@ -1094,10 +854,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n49">
+        <node id="n0::n43">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="84.400390625" x="492.4960286458329" y="499.1899079828098"/>
+              <y:Geometry height="30.0" width="84.400390625" x="-561.6943737308446" y="837.4032489998527"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="74.400390625" x="5.0" y="6.015625">Constructor<y:LabelModel>
@@ -1111,10 +871,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n50">
+        <node id="n0::n44">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="126.2890625" x="553.1230265299465" y="2365.5820904161956"/>
+              <y:Geometry height="30.0" width="126.2890625" x="-528.9082051360732" y="2639.7163528484807"/>
               <y:Fill color="#FF9900" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="116.2890625" x="5.0" y="6.015625">EchoReplyTimeout<y:LabelModel>
@@ -1128,10 +888,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n51">
+        <node id="n0::n45">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="98.48046875" x="434.46751302083317" y="320.8432608473944"/>
+              <y:Geometry height="30.0" width="98.48046875" x="-619.7228893558444" y="659.0566018644373"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="88.48046875" x="5.0" y="6.015625">create (static)<y:LabelModel>
@@ -1145,10 +905,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n52">
+        <node id="n0::n46">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="148.208984375" x="725.7034505208328" y="355.1650585361966"/>
+              <y:Geometry height="30.0" width="148.208984375" x="-328.4869518558447" y="693.3783995532395"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="138.208984375" x="5.0" y="6.015625">get_distributor (static)<y:LabelModel>
@@ -1162,10 +922,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n53">
+        <node id="n0::n47">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="84.400390625" x="757.6077473958328" y="402.0400585361966"/>
+              <y:Geometry height="30.0" width="84.400390625" x="-296.5826549808447" y="740.2533995532395"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="74.400390625" x="5.0" y="6.015625">Constructor<y:LabelModel>
@@ -1179,10 +939,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n54">
+        <node id="n0::n48">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="84.400390625" x="931.0829427083329" y="413.08307204531036"/>
+              <y:Geometry height="30.0" width="84.400390625" x="-123.10745966834463" y="751.2964130623533"/>
               <y:Fill color="#CCFFCC" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="74.400390625" x="5.0" y="6.015625">Constructor<y:LabelModel>
@@ -1196,10 +956,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n55">
+        <node id="n0::n49">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="105.03125" x="740.3147786458328" y="542.6650585361966"/>
+              <y:Geometry height="30.0" width="105.03125" x="-313.8756237308447" y="880.8783995532395"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="95.03125" x="5.0" y="6.015625">register_pinger<y:LabelModel>
@@ -1213,10 +973,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n56">
+        <node id="n0::n50">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="133.642578125" x="729.4615315755201" y="3436.5921571479657"/>
+              <y:Geometry height="30.0" width="133.642578125" x="-324.7288708011574" y="3916.6560618141853"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="123.642578125" x="5.0" y="6.015625">clean_up_all (static)<y:LabelModel>
@@ -1230,10 +990,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n57">
+        <node id="n0::n51">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="90.646484375" x="487.8140706380201" y="3054.7605856961454"/>
+              <y:Geometry height="30.0" width="90.646484375" x="-566.3763317386575" y="3534.8244903623654"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="80.646484375" x="5.0" y="6.015625">stop_pinging<y:LabelModel>
@@ -1247,10 +1007,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n58">
+        <node id="n0::n52">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="120.2421875" x="729.4615315755201" y="3147.8812196479657"/>
+              <y:Geometry height="30.0" width="120.2421875" x="-324.7288708011574" y="3627.9451243141857"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="110.2421875" x="5.0" y="6.015625">unregister_pinger<y:LabelModel>
@@ -1264,10 +1024,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n59">
+        <node id="n0::n53">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="67.49609375" x="788.9078206380201" y="3496.5921571479657"/>
+              <y:Geometry height="30.0" width="67.49609375" x="-265.2825817386574" y="3976.6560618141853"/>
               <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="57.49609375" x="5.0" y="6.015625">clean_up<y:LabelModel>
@@ -1281,10 +1041,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n60">
+        <node id="n0::n54">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="44.908203125" x="952.0513753255201" y="3515.9866883979657"/>
+              <y:Geometry height="30.0" width="44.908203125" x="-102.13902705115743" y="3996.0505930641853"/>
               <y:Fill color="#CCFFCC" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="34.908203125" x="5.0" y="6.015625">close<y:LabelModel>
@@ -1298,10 +1058,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n61">
+        <node id="n0::n55">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="52.87109375" x="536.8898661295567" y="3106.6355856961454"/>
+              <y:Geometry height="30.0" width="52.87109375" x="-517.3005362471208" y="3586.6994903623654"/>
               <y:Fill color="#FF9900" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="42.87109375" x="5.0" y="6.015625">cancel<y:LabelModel>
@@ -1315,10 +1075,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n62">
+        <node id="n0::n56">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="107.662109375" x="460.2463114420567" y="3182.3183086779163"/>
+              <y:Geometry height="30.0" width="107.662109375" x="-593.9440909346209" y="3662.3822133441363"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="97.662109375" x="5.0" y="6.015625">handle_timeout<y:LabelModel>
@@ -1332,10 +1092,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n63">
+        <node id="n0::n57">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="476.78672688801964" y="3232.9433086779163"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-577.403675488658" y="3713.0072133441363"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
@@ -1349,10 +1109,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n64">
+        <node id="n0::n58">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="-372.27631835937535" y="27.833528645834917"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-1426.466720736053" y="366.04686966287784"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
@@ -1366,10 +1126,10 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n65">
+        <node id="n0::n59">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="-346.35932617187535" y="633.1657587806953"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-1387.8367030275294" y="1028.0092212012407"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
@@ -1383,13 +1143,15 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n66">
+        <node id="n0::n60">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="75.693359375" x="-23.872265625000296" y="959.5861740286357"/>
-              <y:Fill color="#FF9900" transparent="false"/>
+              <y:Geometry height="55.0" width="196.478515625" x="33.08032839257328" y="1323.848313799498"/>
+              <y:Fill color="#666699" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="65.693359375" x="5.0" y="6.015625">DNS timer<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="custom" textColor="#000000" visible="true" width="186.478515625" x="5.0" y="4.546875">HostStatus
+::set_resovled_ip_count
+::report_dns_resolution_failure<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1400,15 +1162,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n67">
+        <node id="n0::n61">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="55.0" width="196.478515625" x="1088.940244133419" y="1037.9117819974613"/>
+              <y:Geometry height="30.0" width="184.3671875" x="-10.158929419926721" y="2921.590571598481"/>
               <y:Fill color="#666699" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="custom" textColor="#000000" visible="true" width="186.478515625" x="5.0" y="4.546875">HostStatus
-::set_resovled_ip_count
-::report_dns_resolution_failure<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="174.3671875" x="5.0" y="-0.96875">HostStatus
+::exceeded_ping_failed_limit<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1419,14 +1180,13 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n68">
+        <node id="n0::n62">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="184.3671875" x="1071.872302246093" y="2647.4563091661958"/>
-              <y:Fill color="#666699" transparent="false"/>
+              <y:Geometry height="30.0" width="120.365234375" x="-1138.6388398766776" y="495.4217069024601"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="174.3671875" x="5.0" y="-0.96875">HostStatus
-::exceeded_ping_failed_limit<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="110.365234375" x="5.0" y="6.015625">init_ping_protocol<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1437,13 +1197,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n69">
+        <node id="n0::n63">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="120.365234375" x="210.1066406249996" y="185.08050086640566"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="153.88671875" x="-1123.8714204430844" y="3017.53115571733"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="110.365234375" x="5.0" y="6.015625">init_ping_protocol<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="143.88671875" x="5.0" y="-0.96875">get_next_ping_protocol
+... (see above) ...<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1454,14 +1215,13 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n70">
+        <node id="n0::n64">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="153.88671875" x="207.31432291666647" y="1242.9716683046188"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="138.41796875" x="-1134.4696015954278" y="915.7642395532033"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="143.88671875" x="5.0" y="-0.96875">get_next_ping_protocol
-... (see above) ...<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="128.41796875" x="5.0" y="6.015625">update_dns_resolver<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1472,13 +1232,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n71">
+        <node id="n0::n65">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="138.41796875" x="208.8146484374996" y="587.5721393130148"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="110.8671875" x="39.87427370507328" y="937.2892395532035"/>
+              <y:Fill color="#C0C0C0" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="128.41796875" x="5.0" y="6.015625">update_dns_resolver<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="100.8671875" x="5.0" y="-0.96875">DnsMaster::
+get_resolver_for<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1489,14 +1250,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n72">
+        <node id="n0::n66">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="134.099609375" x="1083.1529012044266" y="587.5721393130148"/>
-              <y:Fill color="#C0C0C0" transparent="false"/>
+              <y:Geometry height="30.0" width="102.8515625" x="-1116.6863984704278" y="996.6163416372983"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="124.099609375" x="5.0" y="-0.96875">DnsResolverFactory
-::createResolver<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="92.8515625" x="5.0" y="-0.96875">start_resolving
+_ping_address<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1507,13 +1268,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n73">
+        <node id="n0::n67">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="143.310546875" x="206.36835937499973" y="647.5721393130148"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="106.724609375" x="34.78540651757328" y="1081.023197017049"/>
+              <y:Fill color="#C0C0C0" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="133.310546875" x="5.0" y="6.015625">resolve_ping_address<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="96.724609375" x="5.0" y="-0.96875">DnsReesolver
+::async_resolve<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1524,14 +1286,13 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n74">
+        <node id="n0::n68">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="96.546875" x="1094.0646760817508" y="647.5721393130148"/>
+              <y:Geometry height="30.0" width="147.857421875" x="46.08814089257328" y="1263.848313799498"/>
               <y:Fill color="#C0C0C0" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="86.546875" x="5.0" y="-0.96875">DnsReesolver
-::resolve<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="137.857421875" x="5.0" y="6.015625">get_resolved_ip_count<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1542,13 +1303,13 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n75">
+        <node id="n0::n69">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="143.310546875" x="187.0193359374996" y="935.6721986641279"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-602.068796794182" y="3061.790809340543"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="133.310546875" x="5.0" y="6.015625">resolve_ping_address<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1559,13 +1320,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n76">
+        <node id="n0::n70">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="147.857421875" x="184.7458984374996" y="977.9117819974612"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="98.55078125" x="19.448816355507915" y="3061.790809340543"/>
+              <y:Fill color="#FF99CC" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="137.857421875" x="5.0" y="6.015625">get_resolved_ip_count<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="88.55078125" x="5.0" y="-0.96875">PingerFactory
+::createPinger<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1576,13 +1338,13 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n77">
+        <node id="n0::n71">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="132.72265625" x="192.3132812499996" y="884.4569626028557"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-321.5392777200128" y="3096.790809340543"/>
+              <y:Fill color="#00FF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="122.72265625" x="5.0" y="6.015625">have_up_to_date_ip<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1593,14 +1355,13 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n78">
+        <node id="n0::n72">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="96.546875" x="1144.393387019251" y="935.6721986641279"/>
-              <y:Fill color="#C0C0C0" transparent="false"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-130.43015963781318" y="3116.7296630591745"/>
+              <y:Fill color="#CCFFCC" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="86.546875" x="5.0" y="-0.96875">DnsReesolver
-::resolve<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1611,13 +1372,13 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n79">
+        <node id="n0::n73">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="132.72265625" x="1126.305496394251" y="884.4569626028557"/>
+              <y:Geometry height="30.0" width="25.443359375" x="56.002527293007915" y="3149.8743767712185"/>
               <y:Fill color="#C0C0C0" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="122.72265625" x="5.0" y="6.015625">have_up_to_date_ip<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1628,13 +1389,13 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n80">
+        <node id="n0::n74">
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="147.857421875" x="1124.7052449544267" y="977.9117819974612"/>
-              <y:Fill color="#C0C0C0" transparent="false"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-1059.6497407555844" y="3116.7296630591745"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="137.857421875" x="5.0" y="6.015625">get_resolved_ip_count<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1645,14 +1406,15 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n81">
+        <node id="n0::n75">
+          <data key="d5"/>
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="91.537109375" x="1137.9041113209191" y="1453.2514246819078"/>
+              <y:Geometry height="30.0" width="114.681640625" x="26.82837526757328" y="1124.0724963223506"/>
               <y:Fill color="#C0C0C0" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="81.537109375" x="5.0" y="-0.96875">DnsResolver
-::get_next_ip<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="104.681640625" x="5.0" y="-0.96875">DnsResolver
+::finalize_resolve<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1663,13 +1425,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n82">
+        <node id="n0::n76">
+          <data key="d5"/>
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="499.5792048841636" y="1287.2313219278317"/>
+              <y:Geometry height="30.0" width="140.33984375" x="-1116.6863984704278" y="1133.9604050609246"/>
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="130.33984375" x="5.0" y="6.015625">dns_resolve_callback<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1680,14 +1443,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n83">
+        <node id="n0::n77">
+          <data key="d5"/>
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="98.55078125" x="1121.0968180338537" y="1287.2313219278317"/>
-              <y:Fill color="#FF99CC" transparent="false"/>
+              <y:Geometry height="30.0" width="80.9609375" x="-1086.9969453454278" y="1358.3890702216547"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="88.55078125" x="5.0" y="-0.96875">PingerFactory
-::createPinger<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="70.9609375" x="5.0" y="6.015625">try_to_ping<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1698,13 +1461,14 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n84">
+        <node id="n0::n78">
+          <data key="d5"/>
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="780.1087239583328" y="1322.2313219278317"/>
-              <y:Fill color="#00FF00" transparent="false"/>
+              <y:Geometry height="30.0" width="80.9609375" x="-1230.8963594079278" y="1358.3890702216547"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="70.9609375" x="5.0" y="6.015625">try_to_ping<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
@@ -1715,29 +1479,157 @@ PingIntervalInSec<y:LabelModel>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n85">
+        <node id="n0::n79">
+          <data key="d5"/>
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="971.2178420405324" y="1342.1701756464631"/>
-              <y:Fill color="#CCFFCC" transparent="false"/>
+              <y:Geometry height="71.46774098582364" width="93.50116782449732" x="-1165.2167675389264" y="1418.3890702216547"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="custom" textColor="#000000" visible="true" width="51.35546875" x="21.072849537248658" y="12.78074549291182">when 
+both
+finished<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
                 <y:ModelParameter>
                   <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
                 </y:ModelParameter>
               </y:NodeLabel>
-              <y:Shape type="rectangle"/>
+              <y:Shape type="triangle"/>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n86">
+        <node id="n0::n80">
+          <data key="d5"/>
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="1157.6505289713537" y="1375.3148893585071"/>
+              <y:Geometry height="30.0" width="147.060546875" x="21.77759401757328" y="997.2892395532036"/>
               <y:Fill color="#C0C0C0" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="137.060546875" x="5.0" y="-0.96875">DnsResolver
+::have_up_to_date_ips<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n0::n81">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="43.443359375" x="-1207.9129609704278" y="956.1902905952509"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="33.443359375" x="5.0" y="-0.96875">have
+IPs?<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="triangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n0::n82">
+          <data key="d6">
+            <y:GenericNode configuration="com.yworks.flowchart.cloud">
+              <y:Geometry height="55.0" width="48.294921875" x="296.2844505254202" y="1090.9049645989076"/>
+              <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="38.294921875" x="5.0" y="18.515625">get IP<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+            </y:GenericNode>
+          </data>
+        </node>
+        <node id="n0::n83">
+          <data key="d6">
+            <y:GenericNode configuration="com.yworks.flowchart.cloud">
+              <y:Geometry height="72.48975640804383" width="143.66796875" x="125.82837526757328" y="2229.39993270065"/>
+              <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="custom" textColor="#000000" visible="true" width="115.041015625" x="14.3134765625" y="13.291753204022143">send request
+receive echo reply
+or destin. unreach<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+            </y:GenericNode>
+          </data>
+        </node>
+        <node id="n0::n84">
+          <data key="d6">
+            <y:GenericNode configuration="com.yworks.flowchart.cloud">
+              <y:Geometry height="47.17671003729447" width="75.693359375" x="156.78345339257328" y="2598.193521065047"/>
+              <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="53.130859375" x="11.28125" y="14.603980018647235">no reply<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+            </y:GenericNode>
+          </data>
+        </node>
+        <node id="n0::n85">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="31.783203125" x="288.4344433984078" y="2436.146238846486"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="21.783203125" x="5.0" y="6.015625">OR<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="triangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n0::n86">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="67.30859375" x="-1080.1707734704278" y="1193.9604050609244"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="57.30859375" x="5.0" y="6.015625">success?<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="triangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n0::n87">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="25.443359375" x="-1059.2381562829278" y="1271.3044684845509"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
                 </y:LabelModel>
@@ -1745,15 +1637,35 @@ PingIntervalInSec<y:LabelModel>
                   <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
                 </y:ModelParameter>
               </y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n0::n88">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="91.537109375" x="43.99352118234219" y="1660.1875174077268"/>
+              <y:Fill color="#C0C0C0" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="81.537109375" x="5.0" y="-0.96875">DnsResolver
+::get_next_ip<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
           </data>
         </node>
-        <node id="n8::n87">
+        <node id="n0::n89">
+          <data key="d5"/>
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="25.443359375" x="271.5360026041667" y="1342.1701756464631"/>
-              <y:Fill color="#339966" transparent="false"/>
+              <y:Geometry height="30.0" width="25.443359375" x="-1001.5164765954278" y="1241.3044684845509"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
               <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="15.443359375" x="5.0" y="6.015625">...<y:LabelModel>
                   <y:SmartNodeLabelModel distance="4.0"/>
@@ -1762,19 +1674,94 @@ PingIntervalInSec<y:LabelModel>
                   <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
                 </y:ModelParameter>
               </y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n0::n90">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="91.876953125" x="24.765096638232762" y="1193.9604050609244"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="81.876953125" x="5.0" y="-0.96875">DnsResolver
+::get_skipper<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n0::n91">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="80.9609375" x="-1089.6868501305844" y="3176.729663059174"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="70.9609375" x="5.0" y="6.015625">try_to_ping<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
           </data>
         </node>
+        <node id="n0::n92">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="102.599609375" x="30.724859642573392" y="3483.326382452209"/>
+              <y:Fill color="#C0C0C0" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="92.599609375" x="5.0" y="-0.96875">DnsResolver::
+cancel_resolve<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n0::n93">
+          <data key="d5"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="58.92919585228492" width="68.05859375" x="180.25942878040712" y="3356.576129494021"/>
+              <y:Fill hasColor="false" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="58.05859375" x="5.0" y="13.495847926142233">SIGTERM
+SIGKILL<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="octagon"/>
+            </y:ShapeNode>
+          </data>
+        </node>
       </graph>
     </node>
-    <node id="n9">
+    <node id="n1">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="30.0" width="103.671875" x="343.2451171875" y="-598.1626953124982"/>
-          <y:Fill color="#FF9900" transparent="false"/>
+          <y:Geometry height="30.0" width="81.552734375" x="396.8046875" y="-528.4126953124982"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="93.671875" x="5.0" y="6.015625">deadline_timer<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="71.552734375" x="5.0" y="6.015625">IcmpPinger<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -1785,13 +1772,13 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n10">
+    <node id="n2">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="30.0" width="103.671875" x="343.2451171875" y="-382.91269531249816"/>
-          <y:Fill color="#FF9900" transparent="false"/>
+          <y:Geometry height="30.0" width="81.552734375" x="396.8046875" y="-450.41269531249816"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="93.671875" x="5.0" y="6.015625">deadline_timer<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="71.552734375" x="5.0" y="6.015625">IcmpPinger<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -1802,13 +1789,14 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n11">
+    <node id="n3">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="30.0" width="99.869140625" x="602.4694010416667" y="-741.612695312498"/>
-          <y:Fill color="#FFFF00" transparent="false"/>
+          <y:Geometry height="38.0" width="147.669921875" x="63.41796875" y="-544.4126953124982"/>
+          <y:Fill color="#00FF00" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="89.869140625" x="5.0" y="6.015625">PingScheduler<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="137.669921875" x="5.0" y="3.03125">IcmpPacketDistributor
+(singleton)<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -1819,13 +1807,13 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n12">
+    <node id="n4">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="30.0" width="99.869140625" x="604.9694010416667" y="-231.0955078124981"/>
-          <y:Fill color="#FFFF00" transparent="false"/>
+          <y:Geometry height="30.0" width="97.044921875" x="651.5" y="-614.4126953124982"/>
+          <y:Fill color="#FF99CC" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="89.869140625" x="5.0" y="6.015625">PingScheduler<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="87.044921875" x="5.0" y="6.015625">PingerFactory<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -1836,10 +1824,78 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n13">
+    <node id="n5">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="30.0" width="103.671875" x="427.525390625" y="-709.112695312498"/>
+          <y:Geometry height="30.0" width="128.603515625" x="635.720703125" y="-371.41269531249816"/>
+          <y:Fill color="#00FFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="118.603515625" x="5.0" y="6.015625">IcmpPacketFactory<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="46.0" width="54.59375" x="148.494140625" y="-427.41269531249816"/>
+          <y:Fill color="#CCFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="44.59375" x="5.0" y="7.03125">ICMP
+Socket<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="octagon"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.flowchart.cloud">
+          <y:Geometry height="82.0" width="128.603515625" x="141.2099609375" y="-314.41269531249816"/>
+          <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="60.548828125" x="34.02734375" y="32.015625">the world<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="117.828125" x="-4.8720703125" y="-419.41269531249816"/>
+          <y:Fill color="#CCFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="107.828125" x="5.0" y="6.015625">NetworkInterface<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="103.671875" x="343.2451171875" y="-598.1626953124982"/>
           <y:Fill color="#FF9900" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
           <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="93.671875" x="5.0" y="6.015625">deadline_timer<y:LabelModel>
@@ -1853,10 +1909,10 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n14">
+    <node id="n10">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="30.0" width="103.671875" x="436.42252604166674" y="-264.62392578124906"/>
+          <y:Geometry height="30.0" width="103.671875" x="343.2451171875" y="-382.91269531249816"/>
           <y:Fill color="#FF9900" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
           <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="93.671875" x="5.0" y="6.015625">deadline_timer<y:LabelModel>
@@ -1870,13 +1926,13 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n15">
+    <node id="n11">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="30.0" width="79.619140625" x="540.0944010416667" y="-331.91269531249816"/>
-          <y:Fill color="#339966" transparent="false"/>
+          <y:Geometry height="30.0" width="99.869140625" x="602.4694010416667" y="-741.612695312498"/>
+          <y:Fill color="#FFFF00" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="69.619140625" x="5.0" y="6.015625">PingRotate<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="89.869140625" x="5.0" y="6.015625">PingScheduler<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -1887,13 +1943,13 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n16">
+    <node id="n12">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="30.0" width="79.619140625" x="519.4169921875" y="-659.112695312498"/>
-          <y:Fill color="#339966" transparent="false"/>
+          <y:Geometry height="30.0" width="99.869140625" x="604.9694010416667" y="-231.0955078124981"/>
+          <y:Fill color="#FFFF00" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="69.619140625" x="5.0" y="6.015625">PingRotate<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="89.869140625" x="5.0" y="6.015625">PingScheduler<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -1904,30 +1960,30 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n17">
+    <node id="n13">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="116.25" width="142.28515625" x="1481.9072631835938" y="2070.7289654161964"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:Geometry height="30.0" width="103.671875" x="427.525390625" y="-709.112695312498"/>
+          <y:Fill color="#FF9900" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="24" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="42.8828125" x="49.701171875" y="42.15625">OR<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="93.671875" x="5.0" y="6.015625">deadline_timer<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
               <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
             </y:ModelParameter>
           </y:NodeLabel>
-          <y:Shape type="triangle"/>
+          <y:Shape type="rectangle"/>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n18">
+    <node id="n14">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="22.5" width="37.28125" x="426.4404296875" y="-485.66269531249816"/>
-          <y:Fill hasColor="false" transparent="false"/>
-          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="27.28125" modelName="custom" rotationAngle="90.0" textColor="#000000" visible="true" width="26.79296875" x="5.0" y="-2.146484375">...<y:LabelModel>
+          <y:Geometry height="30.0" width="103.671875" x="436.42252604166674" y="-264.62392578124906"/>
+          <y:Fill color="#FF9900" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="93.671875" x="5.0" y="6.015625">deadline_timer<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -1938,59 +1994,58 @@ PingIntervalInSec<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n19">
+    <node id="n15">
       <data key="d6">
-        <y:GenericNode configuration="com.yworks.flowchart.cloud">
-          <y:Geometry height="105.6285278320288" width="191.837890625" x="1344.8534261067698" y="1885.016062584167"/>
-          <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="79.619140625" x="540.0944010416667" y="-331.91269531249816"/>
+          <y:Fill color="#339966" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="custom" textColor="#000000" visible="true" width="139.38671875" x="26.2255859375" y="29.861138916014397">send request
-receive echo reply
-or destin. unreachable<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="69.619140625" x="5.0" y="6.015625">PingRotate<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
               <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
             </y:ModelParameter>
           </y:NodeLabel>
-        </y:GenericNode>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
       </data>
     </node>
-    <node id="n20">
+    <node id="n16">
       <data key="d6">
-        <y:GenericNode configuration="com.yworks.flowchart.cloud">
-          <y:Geometry height="50.0" width="63.130859375" x="1395.4813557942698" y="2315.1250591661956"/>
-          <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="79.619140625" x="519.4169921875" y="-659.112695312498"/>
+          <y:Fill color="#339966" transparent="false"/>
           <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="53.130859375" x="5.0" y="16.015625">no reply<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="69.619140625" x="5.0" y="6.015625">PingRotate<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
               <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
             </y:ModelParameter>
           </y:NodeLabel>
-        </y:GenericNode>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
       </data>
     </node>
-    <node id="n21">
+    <node id="n17">
       <data key="d6">
         <y:ShapeNode>
-          <y:Geometry height="62.812500000000455" width="68.05859375" x="1403.0174886067698" y="2924.4799257026552"/>
+          <y:Geometry height="22.5" width="37.28125" x="426.4404296875" y="-485.66269531249816"/>
           <y:Fill hasColor="false" transparent="false"/>
-          <y:BorderStyle color="#000000" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="58.05859375" x="5.0" y="15.4375">SIGTERM
-SIGKILL<y:LabelModel>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="27.28125" modelName="custom" rotationAngle="90.0" textColor="#000000" visible="true" width="26.79296875" x="5.0" y="-2.146484375">...<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
               <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
             </y:ModelParameter>
           </y:NodeLabel>
-          <y:Shape type="octagon"/>
+          <y:Shape type="rectangle"/>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n22">
+    <node id="n18">
       <data key="d6">
         <y:ShapeNode>
           <y:Geometry height="30.0" width="79.560546875" x="451.63671875000006" y="-780.3626953124979"/>
@@ -2007,7 +2062,7 @@ SIGKILL<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <node id="n23">
+    <node id="n19">
       <data key="d6">
         <y:ShapeNode>
           <y:Geometry height="30.0" width="79.560546875" x="460.5338541666668" y="-190.91269531249816"/>
@@ -2024,7 +2079,7 @@ SIGKILL<y:LabelModel>
         </y:ShapeNode>
       </data>
     </node>
-    <edge id="e0" source="n2" target="n0">
+    <edge id="e0" source="n3" target="n1">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2042,7 +2097,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e1" source="n2" target="n1">
+    <edge id="e1" source="n3" target="n2">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2051,7 +2106,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e2" source="n3" target="n0">
+    <edge id="e2" source="n4" target="n1">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2068,7 +2123,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e3" source="n3" target="n1">
+    <edge id="e3" source="n4" target="n2">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2077,7 +2132,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e4" source="n2" target="n5">
+    <edge id="e4" source="n3" target="n6">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2094,7 +2149,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e5" source="n0" target="n4">
+    <edge id="e5" source="n1" target="n5">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2103,7 +2158,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e6" source="n5" target="n6">
+    <edge id="e6" source="n6" target="n7">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2112,7 +2167,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e7" source="n1" target="n5">
+    <edge id="e7" source="n2" target="n6">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2129,7 +2184,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e8" source="n0" target="n5">
+    <edge id="e8" source="n1" target="n6">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2138,7 +2193,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e9" source="n2" target="n7">
+    <edge id="e9" source="n3" target="n8">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2155,7 +2210,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e10" source="n1" target="n4">
+    <edge id="e10" source="n2" target="n5">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2172,7 +2227,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e11" source="n0" target="n9">
+    <edge id="e11" source="n1" target="n9">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2189,7 +2244,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e12" source="n1" target="n10">
+    <edge id="e12" source="n2" target="n10">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2206,16 +2261,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e0" source="n8::n4" target="n8::n0">
-      <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
-      </data>
-    </edge>
-    <edge id="n8::e1" source="n8::n2" target="n8::n13">
+    <edge id="n0::e0" source="n0::n3" target="n0::n0">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2224,7 +2270,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e2" source="n8::n6" target="n8::n1">
+    <edge id="n0::e1" source="n0::n1" target="n0::n78">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2233,7 +2279,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e3" source="n8::n5" target="n8::n8">
+    <edge id="n0::e2" source="n0::n4" target="n0::n7">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2242,7 +2288,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e13" source="n16" target="n0">
+    <edge id="e13" source="n16" target="n1">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2310,27 +2356,18 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e4" source="n8::n1" target="n8::n2">
-      <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
-      </data>
-    </edge>
-    <edge id="n8::e5" source="n8::n3" target="n8::n4">
+    <edge id="n0::e3" source="n0::n2" target="n0::n3">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="-393.18079020182387" y="682.0476923744467"/>
+            <y:Point x="-1434.6581670574778" y="1076.8911547949922"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e6" source="n8::n3" target="n8::n10">
+    <edge id="n0::e4" source="n0::n2" target="n0::n9">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2339,7 +2376,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e7" source="n8::n10" target="n8::n11">
+    <edge id="n0::e5" source="n0::n9" target="n0::n10">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2348,7 +2385,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e17" source="n15" target="n1">
+    <edge id="e17" source="n15" target="n2">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2382,25 +2419,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e8" source="n8::n1" target="n8::n77">
-      <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
-      </data>
-    </edge>
-    <edge id="n8::e9" source="n8::n13" target="n8::n14">
-      <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
-      </data>
-    </edge>
-    <edge id="n8::e10" source="n8::n13" target="n8::n15">
+    <edge id="n0::e6" source="n0::n62" target="n0::n12">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2409,29 +2428,20 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e11" source="n8::n69" target="n8::n16">
-      <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
-      </data>
-    </edge>
-    <edge id="n8::e12" source="n8::n17" target="n8::n1">
+    <edge id="n0::e7" source="n0::n13" target="n0::n1">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="-67.51466471354252" y="2847.8107118354674"/>
-            <y:Point x="-354.4812174479175" y="2847.8107118354674"/>
-            <y:Point x="-351.574027506511" y="949.5861740286357"/>
+            <y:Point x="-1121.70506709022" y="3327.8746165016873"/>
+            <y:Point x="-1408.671619824595" y="3327.8746165016873"/>
+            <y:Point x="-1408.671619824595" y="1561.9610040363707"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e13" source="n8::n5" target="n8::n9">
+    <edge id="n0::e8" source="n0::n4" target="n0::n8">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2440,7 +2450,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e14" source="n8::n5" target="n8::n7">
+    <edge id="n0::e9" source="n0::n4" target="n0::n6">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2449,7 +2459,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e15" source="n8::n18" target="n8::n19">
+    <edge id="n0::e10" source="n0::n14" target="n0::n15">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2458,7 +2468,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e16" source="n8::n20" target="n8::n18">
+    <edge id="n0::e11" source="n0::n16" target="n0::n14">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2467,7 +2477,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e17" source="n8::n3" target="n8::n20">
+    <edge id="n0::e12" source="n0::n2" target="n0::n16">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2476,7 +2486,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e18" source="n8::n19" target="n8::n21">
+    <edge id="n0::e13" source="n0::n15" target="n0::n51">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2485,18 +2495,18 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e19" source="n8::n19" target="n8::n22">
+    <edge id="n0::e14" source="n0::n15" target="n0::n17">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="-130.0882731119804" y="3208.8808086779163"/>
+            <y:Point x="-1184.2786754886579" y="3688.9447133441363"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e20" source="n8::n23" target="n8::n24">
+    <edge id="n0::e15" source="n0::n18" target="n0::n19">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2505,13 +2515,13 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e21" source="n8::n38" target="n8::n39">
+    <edge id="n0::e16" source="n0::n32" target="n0::n33">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="73.66796875" x="-65.82172851562552" y="25.215590578956608">IcmpPacket<y:LabelModel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="73.66796875" x="-65.82171018164536" y="25.21557566749175">IcmpPacket<y:LabelModel>
               <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -2522,7 +2532,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e22" source="n8::n26" target="n8::n27">
+    <edge id="n0::e17" source="n0::n21" target="n0::n22">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2531,7 +2541,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e23" source="n8::n38" target="n8::n31">
+    <edge id="n0::e18" source="n0::n32" target="n0::n26">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2540,7 +2550,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e24" source="n8::n39" target="n8::n25">
+    <edge id="n0::e19" source="n0::n33" target="n0::n20">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2549,7 +2559,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e25" source="n8::n39" target="n8::n28">
+    <edge id="n0::e20" source="n0::n33" target="n0::n23">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2558,7 +2568,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e26" source="n8::n39" target="n8::n40">
+    <edge id="n0::e21" source="n0::n33" target="n0::n34">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2567,7 +2577,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e27" source="n8::n29" target="n8::n32">
+    <edge id="n0::e22" source="n0::n24" target="n0::n27">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2576,7 +2586,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e28" source="n8::n29" target="n8::n41">
+    <edge id="n0::e23" source="n0::n24" target="n0::n35">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2585,7 +2595,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e29" source="n8::n29" target="n8::n30">
+    <edge id="n0::e24" source="n0::n24" target="n0::n25">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2594,7 +2604,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e30" source="n8::n37" target="n8::n43">
+    <edge id="n0::e25" source="n0::n31" target="n0::n37">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2603,7 +2613,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e31" source="n8::n37" target="n8::n38">
+    <edge id="n0::e26" source="n0::n31" target="n0::n32">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2612,7 +2622,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e32" source="n8::n30" target="n8::n34">
+    <edge id="n0::e27" source="n0::n25" target="n0::n29">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2621,7 +2631,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e19" source="n19" target="n8::n29">
+    <edge id="n0::e28" source="n0::n83" target="n0::n24">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2630,16 +2640,16 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e20" source="n20" target="n8::n50">
+    <edge id="n0::e29" source="n0::n84" target="n0::n44">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:Path sx="0.0" sy="21.423017741544847" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e33" source="n8::n41" target="n8::n42">
+    <edge id="n0::e30" source="n0::n35" target="n0::n36">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2648,7 +2658,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e34" source="n8::n41" target="n8::n46">
+    <edge id="n0::e31" source="n0::n35" target="n0::n40">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2657,7 +2667,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e35" source="n8::n46" target="n8::n47">
+    <edge id="n0::e32" source="n0::n40" target="n0::n41">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2666,7 +2676,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e36" source="n8::n47" target="n8::n44">
+    <edge id="n0::e33" source="n0::n41" target="n0::n38">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2675,7 +2685,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e37" source="n8::n47" target="n8::n48">
+    <edge id="n0::e34" source="n0::n41" target="n0::n42">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2684,7 +2694,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e38" source="n8::n36" target="n8::n51">
+    <edge id="n0::e35" source="n0::n30" target="n0::n45">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2693,7 +2703,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e39" source="n8::n50" target="n8::n47">
+    <edge id="n0::e36" source="n0::n44" target="n0::n41">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2702,7 +2712,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e40" source="n8::n51" target="n8::n52">
+    <edge id="n0::e37" source="n0::n45" target="n0::n46">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2711,7 +2721,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e41" source="n8::n51" target="n8::n49">
+    <edge id="n0::e38" source="n0::n45" target="n0::n43">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2720,7 +2730,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e42" source="n8::n52" target="n8::n53">
+    <edge id="n0::e39" source="n0::n46" target="n0::n47">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2729,7 +2739,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e43" source="n8::n53" target="n8::n54">
+    <edge id="n0::e40" source="n0::n47" target="n0::n48">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2738,7 +2748,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e44" source="n8::n53" target="n8::n26">
+    <edge id="n0::e41" source="n0::n47" target="n0::n21">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2747,7 +2757,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e45" source="n8::n51" target="n8::n55">
+    <edge id="n0::e42" source="n0::n45" target="n0::n49">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2756,7 +2766,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e46" source="n8::n57" target="n8::n58">
+    <edge id="n0::e43" source="n0::n51" target="n0::n52">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2765,7 +2775,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e47" source="n8::n56" target="n8::n59">
+    <edge id="n0::e44" source="n0::n50" target="n0::n53">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2774,7 +2784,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e48" source="n8::n59" target="n8::n60">
+    <edge id="n0::e45" source="n0::n53" target="n0::n54">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2783,7 +2793,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e49" source="n8::n57" target="n8::n61">
+    <edge id="n0::e46" source="n0::n51" target="n0::n55">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2792,7 +2802,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e50" source="n8::n61" target="n8::n62">
+    <edge id="n0::e47" source="n0::n55" target="n0::n56">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2801,7 +2811,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e51" source="n8::n62" target="n8::n63">
+    <edge id="n0::e48" source="n0::n56" target="n0::n57">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2810,16 +2820,16 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e21" source="n17" target="n19">
+    <edge id="n0::e49" source="n0::n12" target="n0::n30">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="13.7744140625" ty="5.935736083985603"/>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e22" source="n17" target="n20">
+    <edge id="n0::e50" source="n0::n38" target="n0::n4">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2828,7 +2838,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e52" source="n8::n16" target="n8::n36">
+    <edge id="n0::e51" source="n0::n4" target="n0::n28">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2837,27 +2847,27 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e53" source="n8::n13" target="n8::n37">
+    <edge id="n0::e52" source="n0::n93" target="n0::n16">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="132.32186524530147" y="1485.9875144070813"/>
-          </y:Path>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e54" source="n8::n44" target="n8::n5">
+    <edge id="n0::e53" source="n0::n14" target="n0::n50">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="-1366.1548473636572" y="3904.252330531636"/>
+          </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e55" source="n8::n5" target="n8::n33">
+    <edge id="n0::e54" source="n0::n34" target="n0::n39">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2866,7 +2876,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e23" source="n21" target="n8::n20">
+    <edge id="n0::e55" source="n0::n57" target="n0::n18">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2875,7 +2885,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e56" source="n8::n21" target="n8::n57">
+    <edge id="n0::e56" source="n0::n2" target="n0::n58">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2884,18 +2894,18 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e57" source="n8::n18" target="n8::n56">
+    <edge id="n0::e57" source="n0::n2" target="n0::n59">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="-311.96444498697946" y="3424.1884258654163"/>
+            <y:Point x="-1467.2403332035015" y="454.48436966287784"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e58" source="n8::n11" target="n8::n35">
+    <edge id="n0::e58" source="n0::n0" target="n0::n5">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2904,7 +2914,7 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e59" source="n8::n35" target="n8::n12">
+    <edge id="n0::e59" source="n0::n7" target="n0::n61">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -2913,87 +2923,109 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e60" source="n8::n40" target="n8::n45">
+    <edge id="e19" source="n11" target="n18">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="35.013671875" x="-53.14292399088538" y="-17.562073554226117">owns<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e61" source="n8::n63" target="n8::n23">
+    <edge id="e20" source="n12" target="n19">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="35.013671875" x="-49.94435628255201" y="-0.5528433361312182">owns<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e62" source="n8::n3" target="n8::n64">
+    <edge id="n0::e60" source="n0::n10" target="n0::n62">
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
+        <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e63" source="n8::n3" target="n8::n65">
+    <edge id="n0::e61" source="n0::n11" target="n0::n63">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="-413.04993082682387" y="116.27102864583492"/>
-          </y:Path>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e64" source="n8::n1" target="n8::n66">
+    <edge id="n0::e62" source="n0::n12" target="n0::n64">
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="-9.836844889323629" ty="-2.336295572914878">
-            <y:Point x="-6.795391148288417" y="922.431723461601"/>
-          </y:Path>
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e65" source="n8::n66" target="n8::n1">
+    <edge id="n0::e63" source="n0::n64" target="n0::n65">
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="-44.94860188081631" y="946.7032710797763"/>
-          </y:Path>
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e66" source="n8::n0" target="n8::n6">
+    <edge id="n0::e64" source="n0::n64" target="n0::n81">
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="-3.8066317503056486" ty="5.916310413589566"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e65" source="n0::n66" target="n0::n67">
+      <data key="d10">
+        <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e67" source="n8::n1" target="n8::n67">
+    <edge id="n0::e66" source="n0::n70" target="n0::n69">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
-          <y:Path sx="20.1416707356764" sy="3.6519856770849515" tx="0.0" ty="0.0">
-            <y:Point x="171.7267470157616" y="1065.4117819974613"/>
-          </y:Path>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e68" source="n8::n8" target="n8::n68">
+    <edge id="n0::e67" source="n0::n63" target="n0::n70">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3002,41 +3034,25 @@ shared_ptrs<y:LabelModel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e24" source="n11" target="n22">
+    <edge id="n0::e68" source="n0::n69" target="n0::n71">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="35.013671875" x="-53.14292399088538" y="-17.562073554226117">owns<y:LabelModel>
-              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
-            </y:ModelParameter>
-            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
-          </y:EdgeLabel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="e25" source="n12" target="n23">
+    <edge id="n0::e69" source="n0::n71" target="n0::n72">
       <data key="d10">
         <y:QuadCurveEdge straightness="0.1">
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="35.013671875" x="-49.94435628255201" y="-0.5528433361312182">owns<y:LabelModel>
-              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
-            </y:LabelModel>
-            <y:ModelParameter>
-              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
-            </y:ModelParameter>
-            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
-          </y:EdgeLabel>
         </y:QuadCurveEdge>
       </data>
     </edge>
-    <edge id="n8::e69" source="n8::n12" target="n8::n69">
+    <edge id="n0::e70" source="n0::n63" target="n0::n74">
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3046,16 +3062,18 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e70" source="n8::n15" target="n8::n70">
+    <edge id="n0::e71" source="n0::n74" target="n0::n73">
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
+        <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e71" source="n8::n16" target="n8::n71">
+    <edge id="n0::e72" source="n0::n67" target="n0::n82">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3065,7 +3083,8 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e72" source="n8::n71" target="n8::n72">
+    <edge id="n0::e73" source="n0::n82" target="n0::n75">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3075,7 +3094,8 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e73" source="n8::n71" target="n8::n73">
+    <edge id="n0::e74" source="n0::n75" target="n0::n76">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3085,7 +3105,19 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e74" source="n8::n73" target="n8::n74">
+    <edge id="n0::e75" source="n0::n87" target="n0::n77">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="14.990234375" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e76" source="n0::n5" target="n0::n1">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3095,7 +3127,8 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e75" source="n8::n75" target="n8::n78">
+    <edge id="n0::e77" source="n0::n78" target="n0::n79">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3105,7 +3138,8 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e76" source="n8::n77" target="n8::n79">
+    <edge id="n0::e78" source="n0::n77" target="n0::n79">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3115,7 +3149,8 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e77" source="n8::n76" target="n8::n80">
+    <edge id="n0::e79" source="n0::n79" target="n0::n31">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3125,7 +3160,8 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e78" source="n8::n1" target="n8::n75">
+    <edge id="n0::e80" source="n0::n64" target="n0::n80">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3135,75 +3171,133 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e79" source="n8::n1" target="n8::n76">
+    <edge id="n0::e81" source="n0::n81" target="n0::n66">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="18.947265625" x="12.402468717072225" y="-1.6713624612615376">no<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e80" source="n8::n13" target="n8::n81">
+    <edge id="n0::e82" source="n0::n81" target="n0::n77">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="216.9154705932989" y="1403.054883917876"/>
-          </y:Path>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="24.736328125" x="-7.511386471541982" y="5.001020575719622">yes<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="30.0" distanceToCenter="false" position="center" ratio="0.0" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e81" source="n8::n83" target="n8::n82">
+    <edge id="n0::e83" source="n0::n85" target="n0::n83">
+      <data key="d9"/>
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
+        <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e82" source="n8::n70" target="n8::n83">
+    <edge id="n0::e84" source="n0::n85" target="n0::n84">
+      <data key="d9"/>
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
+        <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e83" source="n8::n82" target="n8::n84">
+    <edge id="n0::e85" source="n0::n4" target="n0::n11">
+      <data key="d9"/>
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="-1156.3229365735633" y="2972.53115571733"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e86" source="n0::n87" target="n0::n60">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="12.736566543579102" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e87" source="n0::n87" target="n0::n68">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e84" source="n8::n84" target="n8::n85">
+    <edge id="n0::e88" source="n0::n76" target="n0::n86">
+      <data key="d9"/>
       <data key="d10">
-        <y:QuadCurveEdge straightness="0.1">
+        <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
-        </y:QuadCurveEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e85" source="n8::n70" target="n8::n87">
+    <edge id="n0::e89" source="n0::n86" target="n0::n87">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="24.736328125" x="-12.368161165740275" y="14.694692632112492">yes<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
       </data>
     </edge>
-    <edge id="n8::e86" source="n8::n87" target="n8::n86">
+    <edge id="n0::e90" source="n0::n79" target="n0::n88">
+      <data key="d9"/>
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
@@ -3213,6 +3307,66 @@ shared_ptrs<y:LabelModel>
         </y:PolyLineEdge>
       </data>
     </edge>
+    <edge id="n0::e91" source="n0::n86" target="n0::n89">
+      <data key="d9"/>
+      <data key="d10">
+        <y:SplineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="18.947265625" x="3.878589968118149" y="1.9673182172962242">no<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+        </y:SplineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e92" source="n0::n89" target="n0::n66">
+      <data key="d9"/>
+      <data key="d10">
+        <y:SplineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="-915.2621838742215" y="1196.62250428375"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+        </y:SplineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e93" source="n0::n89" target="n0::n90">
+      <data key="d9"/>
+      <data key="d10">
+        <y:SplineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+        </y:SplineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e94" source="n0::n74" target="n0::n91">
+      <data key="d9"/>
+      <data key="d10">
+        <y:SplineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+        </y:SplineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e95" source="n0::n15" target="n0::n92">
+      <data key="d9"/>
+      <data key="d10">
+        <y:SplineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+        </y:SplineEdge>
+      </data>
+    </edge>
   </graph>
   <data key="d7">
     <y:Resources/>
index 34a7eaf..992c537 100644 (file)
@@ -74,7 +74,6 @@ set(SOURCES
     host/pingerfactory.cpp
     host/pinginterval.cpp
     host/pingprotocol.cpp
-    host/pingrotate.cpp
     host/pingscheduler.cpp
     tools/pcap.cpp
     icmp/icmpdata.cpp
index e87c039..d516ae2 100644 (file)
@@ -48,6 +48,16 @@ namespace Config
     int MaxRetrievalRecursions = 10;
 }
 
+Cname::Cname()
+    : Host()
+    , Ttl()
+{}
+
+Cname::Cname(const std::string &host, const uint32_t ttl)
+    : Host( host )
+    , Ttl( ttl )
+{}
+
 DnsCache::DnsCache(const IoServiceItem &io_serv,
                    const std::string &cache_file)
     : IpCache()
@@ -186,7 +196,7 @@ void DnsCache::update(const std::string &hostname,
                       const Cname &cname)
 {
     GlobalLogger.info() << "DnsCache: update CNAME for " << hostname
-                        << " to " << cname.first;
+                        << " to " << cname.Host;
     CnameCache[hostname] = cname;
     HasChanged = true;
 }
@@ -213,6 +223,9 @@ void DnsCache::update(const std::string &hostname,
 }
 
 
+/**
+ * @returns empty list if no (up to date) ips for hostname in cache
+ */
 HostAddressVec DnsCache::get_ips(const std::string &hostname,
                                  const bool check_up_to_date)
 {
@@ -220,8 +233,8 @@ HostAddressVec DnsCache::get_ips(const std::string &hostname,
     if (check_up_to_date)
     {
         HostAddressVec result_up_to_date;
-        int threshold = DnsMaster::get_instance()
-                        ->get_resolved_ip_ttl_threshold();
+        uint32_t threshold = static_cast<uint32_t>(
+                DnsMaster::get_instance()->get_resolved_ip_ttl_threshold() );
         BOOST_FOREACH( const HostAddress &addr, result )
         {
             if (addr.get_ttl().get_updated_value() > threshold)
@@ -237,25 +250,31 @@ HostAddressVec DnsCache::get_ips(const std::string &hostname,
     return result;
 }
 
-std::string DnsCache::get_cname(const std::string &hostname,
-                                 const bool check_up_to_date)
+/**
+ * @returns empty cname if no (up to date cname) for hostname in cache
+ */
+Cname DnsCache::get_cname(const std::string &hostname,
+                          const bool check_up_to_date)
 {
     Cname result_obj = CnameCache[hostname];
     GlobalLogger.info() << "DnsCache: request CNAME for " << hostname
-                        << " --> \"" << result_obj.first << "\"";
-    if (check_up_to_date)
+                        << " --> \"" << result_obj.Host << "\"";
+    if (result_obj.Host.empty())
+        return result_obj;
+
+    else if (check_up_to_date)
     {
-        if (result_obj.second.get_updated_value() > DnsMaster::get_instance()
+        if (result_obj.Ttl.get_updated_value() > DnsMaster::get_instance()
                                               ->get_resolved_ip_ttl_threshold())
-            return result_obj.first;
+            return result_obj;
         else
         {
-            GlobalLogger.debug() << "DnsCache: Cname is out of date";
-            return "";
+            GlobalLogger.debug() << "DnsCache: CNAME is out of date";
+            return Cname();    // same as if there was no cname for hostname
         }
     }
     else
-        return result_obj.first;
+        return result_obj;
 }
 
 // underlying assumption in this function: for a hostname, the cache has either
@@ -264,11 +283,14 @@ HostAddressVec DnsCache::get_ips_recursive(const std::string &hostname,
                                            const bool check_up_to_date)
 {
     std::string current_host = hostname;
+    Cname current_cname;
     HostAddressVec result = get_ips(current_host);
     int n_recursions = 0;
+    uint32_t min_cname_ttl = 0xffff;   // largest possible unsigned 4-byte value
     while ( result.empty() )
     {
-        current_host = get_cname(current_host, check_up_to_date);
+        current_cname = get_cname(current_host, check_up_to_date);
+        current_host = current_cname.Host;
         if (current_host.empty())
             break;
         else if (++n_recursions >= Config::MaxRetrievalRecursions)
@@ -278,10 +300,71 @@ HostAddressVec DnsCache::get_ips_recursive(const std::string &hostname,
             break;
         }
         else
+        {
+            min_cname_ttl = min(min_cname_ttl, current_cname.Ttl.get_value());
             result = get_ips(current_host, check_up_to_date);
+        }
+    }
+
+    GlobalLogger.debug() << "DnsCache: recursive IP retrieval resulted in "
+                         << result.size() << "-list after " << n_recursions
+                         << " recursions";
+
+    // adjust ttl to min of ttl and min_cname_ttl
+    if (n_recursions > 0)
+    {
+        TimeToLive cname_ttl(min_cname_ttl);
+
+        BOOST_FOREACH( HostAddress &addr, result )
+        {
+            if (addr.get_ttl().get_value() > min_cname_ttl)
+                addr.set_ttl(cname_ttl);
+        }
     }
+
     return result;
 }
 
+/**
+ * from a list of CNAMEs find the first one that is out of date
+ *
+ * required in ResolverBase::get_skipper
+ * 
+ * Assume you have the following situation in cache with TTLs below:
+ * hostname --> cname1 --> cname2 --> ... --> cnameN [--> IP]
+ *               100         0                                --> return cname2
+ *               100        100        100     100            --> return cnameN
+ *    ( with N < Config::MaxRetrievalRecursions )
+ * hostname --> IP (no cnames involved) --> return hostname
+ */
+std::string DnsCache::get_first_outdated_cname(const std::string &hostname,
+                                               const uint32_t ttl_thresh)
+{
+    std::string up_to_date_host = hostname;
+    Cname cname;
+    int n_recursions = 0;
+    while (true)
+    {
+        if (++n_recursions >= Config::MaxRetrievalRecursions)
+        {
+            GlobalLogger.warning() << "DnsCache: reached recursion limit of "
+                << n_recursions << " in search of outdated CNAMEs!";
+            break;
+        }
+
+        cname = get_cname(up_to_date_host);
+        if (cname.Host.empty())
+            // reached end of cname list
+            break;
+        else if (cname.Ttl.get_updated_value() > ttl_thresh)
+            // cname is up to date --> continue looking
+            up_to_date_host = cname.Host;
+        else
+            // cname is out of date --> return that
+            break;
+    }
+    return up_to_date_host;
+}
+
 // (created using vim -- the world's best text editor)
 
index c213777..7a0fbe8 100644 (file)
 #include <boost/shared_ptr.hpp>
 #include <boost/asio/deadline_timer.hpp>
 #include <boost/system/error_code.hpp>
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/split_member.hpp>
+#include <boost/serialization/string.hpp>
 
 #include "host/pinger.h"    // for IoserviceItem
 #include "dns/hostaddress.h"
 
 typedef std::vector<HostAddress> HostAddressVec;
 typedef std::map<std::string, HostAddressVec> ip_map_type;
-typedef std::pair<std::string, TimeToLive> Cname;
+
+// -----------------------------------------------------------------------------
+// CNAME
+// -----------------------------------------------------------------------------
+
+struct Cname
+{   // all public:
+    std::string Host;
+    TimeToLive Ttl;
+
+    Cname();
+    Cname(const std::string &host, const uint32_t ttl);
+
+    // serialization
+    friend class boost::serialization::access;
+    template<class Archive>
+    void save(Archive & ar, const unsigned int version) const
+    {
+        ar & BOOST_SERIALIZATION_NVP(Host);
+        ar & BOOST_SERIALIZATION_NVP(Ttl);
+    }
+    template<class Archive>
+    void load(Archive & ar, const unsigned int version)
+    {
+        ar & BOOST_SERIALIZATION_NVP(Host);
+        ar & BOOST_SERIALIZATION_NVP(Ttl);
+    }
+    BOOST_SERIALIZATION_SPLIT_MEMBER()
+};
 typedef std::map<std::string, Cname> cname_map_type;
 
 
+// -----------------------------------------------------------------------------
+// DnsCache
+// -----------------------------------------------------------------------------
+
 class DnsCache
 {
 public:
@@ -50,12 +88,16 @@ public:
     void update(const std::string &hostname, const HostAddressVec &new_data);
     void update(const std::string &hostname, const Cname &cname);
     void update(const std::string &hostname, const uint32_t ttl);
+
+    // retrieval
     HostAddressVec get_ips(const std::string &hostname,
-                            const bool check_up_to_date=false);
-    std::string get_cname(const std::string &hostname,
-                          const bool check_up_to_date=false);
+                           const bool check_up_to_date=false);
+    Cname get_cname(const std::string &hostname,
+                     const bool check_up_to_date=false);
     HostAddressVec get_ips_recursive(const std::string &hostname,
-                                      const bool check_up_to_date=false);
+                                     const bool check_up_to_date=false);
+    std::string get_first_outdated_cname(const std::string &hostname,
+                                         const uint32_t ttl_thresh);
 
 // variables
 private:
@@ -65,7 +107,7 @@ private:
     std::string CacheFile;
     bool HasChanged;
 
-// functions
+// internal functions
 private:
     void schedule_save(const boost::system::error_code &error);
     void save_to_cachefile();
index 139219c..1e236d3 100644 (file)
@@ -72,7 +72,6 @@ DnsResolver::DnsResolver(IoServiceItem &io_serv,
     , LogPrefix( "DnsResolver" )
     , RandomIdGenerator()
     , RequestId( 0 )
-    , Recursor()
     , OperationCancelled( false )
 {
     std::stringstream temp;
@@ -129,7 +128,7 @@ void DnsResolver::do_resolve()
 
     // create DNS request
     boost::net::dns::message dns_message( ResolverBase::Hostname, Protocol );
-    dns_message.recursive(false);
+    dns_message.recursive(true);
     dns_message.action(boost::net::dns::message::query);
     dns_message.opcode(boost::net::dns::message::squery);
 
@@ -236,8 +235,8 @@ void DnsResolver::handle_dns_result(const boost::system::error_code &error,
     // remember cname list (if there were any)
     BOOST_FOREACH( const src_cname_pair &host_and_cname, result_cnames )
     {
-        GlobalLogger.debug() << LogPrefix << "Remember CNAME "
-            << host_and_cname.first << " --> " << host_and_cname.second.first;
+        GlobalLogger.info() << LogPrefix << "Remember CNAME "
+            << host_and_cname.first << " --> " << host_and_cname.second.Host;
         ResolverBase::update_cache(host_and_cname.first, host_and_cname.second);
     }
 
@@ -248,67 +247,25 @@ void DnsResolver::handle_dns_result(const boost::system::error_code &error,
         // re-start resolving with that
         handle_cname(result_cnames);
     else
-    {   // no answers --> check for name_servers in authorities section
-        if ( !result_name_servers.empty() )
-            GlobalLogger.warning() << LogPrefix
-                                   << "Received NS records in answers! "
-                                   << "That is quite unexpected...";
-        GlobalLogger.debug() << "Checking AUTHORITIES section of dns reply";
-        gather_results(result_message.authorites(), &result_ips,
-                       &result_cnames, &result_name_servers);
-        GlobalLogger.debug() << "Checking ADDITIONALS section of dns reply";
-        gather_results(result_message.additionals(), &result_ips,
-                       &result_cnames, &result_name_servers);
-
-        // search for a name_server for which an IP is given
-        bool have_recursed = false;
-        BOOST_FOREACH( const string_pair &name_server, result_name_servers )
-        {
-            if (name_server.second == Hostname)
-            {   // in case we try to resolve IP for name server, do not use same
-                GlobalLogger.debug() << LogPrefix
-                    << "Name server found is same as hostname --> skip";
-                continue;
-            }
-
-            // go through ips and look for match
-            BOOST_FOREACH( const host_addr_pair &host_and_addr, result_ips )
-            {
-                if (name_server.second == host_and_addr.first)
-                {
-                    GlobalLogger.info() << LogPrefix << "Ask next name_server "
-                        << name_server.second << " with IP "
-                        << host_and_addr.second.get_ip() << " (responsible for "
-                        << name_server.first << ")";
-                    have_recursed = true;
-                    handle_recurse( host_and_addr.second );
-                    break;
-                }
-            }
-            if (have_recursed)
-                break;
-        }
-
-        if ( !have_recursed )
-        {   // no name_server with ip found -- strange
-            if (result_name_servers.empty())
-            {
-                GlobalLogger.error() << LogPrefix << "Result contained neither "
-                    << "IP nor CNAME nor name server --> cannot proceed!";
-                handle_unavailable();
-            }
-            else
-            {
-                GlobalLogger.warning() << LogPrefix
-                    << "There are " << result_name_servers.size()
-                    << " name_servers given but none with IP!";
-                handle_recurse_without_ip(result_name_servers[0].second);
-            }
-        }
+    {   // no answers --> cannot proceed
+        GlobalLogger.warning() << LogPrefix << "No IP nor CNAME received! "
+                               << "--> schedule retry";
+        schedule_retry();
     }
 }
 
-void DnsResolver::gather_results(const boost::net::dns::rr_list_t *answers,
+/**
+ * gather IPs, CNAMEs and name servers from list of resource records;
+ *
+ * can be run on anwers(), autorities() and additional() sections of dns reply
+ * messages
+ * 
+ * @param rr_list: input list of resource records
+ * @param result_ips: output vector of ips
+ * @param result_cnames: output vector of cnames
+ * @param result_name_servers: output vector of name servers
+ */
+void DnsResolver::gather_results(const boost::net::dns::rr_list_t *rr_list,
                                  std::vector<host_addr_pair> *result_ips,
                                  std::vector<src_cname_pair> *result_cnames,
                                  std::vector<string_pair> *result_name_servers)
@@ -316,7 +273,7 @@ void DnsResolver::gather_results(const boost::net::dns::rr_list_t *answers,
 {
     using boost::net::dns::resource_base_t;
     boost::posix_time::ptime now =boost::posix_time::second_clock::local_time();
-    BOOST_FOREACH( boost::shared_ptr<resource_base_t> rr_item, *answers )
+    BOOST_FOREACH( boost::shared_ptr<resource_base_t> rr_item, *rr_list )
     {
         boost::net::dns::type_t rr_type = rr_item->rtype();
         uint32_t ttl = rr_item->ttl();
@@ -453,7 +410,6 @@ void DnsResolver::handle_cname(const std::vector<src_cname_pair> &result_cnames)
     // We assume here that this list might not be in order but that all cnames
     //   form a single list (form one connected list and not several isolated)
 
-    // host_and_cname.second is a Cname, which is a pair (destination, ttl)
     std::string last_cname = "";
     bool could_be_last;
     BOOST_REVERSE_FOREACH( const src_cname_pair &host_and_cname, result_cnames )
@@ -461,7 +417,7 @@ void DnsResolver::handle_cname(const std::vector<src_cname_pair> &result_cnames)
         could_be_last = true;
         BOOST_REVERSE_FOREACH( const src_cname_pair &other, result_cnames )
         {
-            if (other.first == host_and_cname.second.first)
+            if (other.first == host_and_cname.second.Host)
             {   // found cname for current cname
                 could_be_last = false;
                 break;
@@ -469,7 +425,7 @@ void DnsResolver::handle_cname(const std::vector<src_cname_pair> &result_cnames)
         }
         if (could_be_last)
         {
-            last_cname = host_and_cname.second.first;
+            last_cname = host_and_cname.second.Host;
             break;
         }
     }
@@ -482,7 +438,7 @@ void DnsResolver::handle_cname(const std::vector<src_cname_pair> &result_cnames)
         GlobalLogger.info() << LogPrefix << "Result CNAMEs were:";
         BOOST_FOREACH( const src_cname_pair &host_and_cname, result_cnames )
             GlobalLogger.info() << LogPrefix << host_and_cname.first << " --> "
-                                             << host_and_cname.second.first;
+                                             << host_and_cname.second.Host;
         handle_unavailable();
     }
     else
@@ -493,14 +449,11 @@ void DnsResolver::handle_cname(const std::vector<src_cname_pair> &result_cnames)
         if ( !cached_data.empty() )
         {
             bool was_success = true;
-            int recursion_count = 1;  // define cache access as only 1
-            finalize_resolve(was_success, recursion_count);
+            int cname_count = 1;  // define cache access as only 1
+            finalize_resolve(was_success, cname_count);
         }
         else
         {   // get resolver for canonical name
-            // as opposed to the interal Recursor variable used in
-            // handle_recurse, this is a "proper" resolver that is maintained
-            // and cached by DnsMaster --> independent of this Resolver
             ResolverItem resolver = DnsMaster::get_instance()
                                     ->get_resolver_for(last_cname, Protocol);
             callback_type callback = boost::bind(
@@ -518,7 +471,7 @@ void DnsResolver::handle_cname(const std::vector<src_cname_pair> &result_cnames)
 
 
 void DnsResolver::cname_resolve_callback(const bool was_success,
-                                         const int recursion_count)
+                                         const int cname_count)
 {
     if ( OperationCancelled )
     {   // async_resolve was cancelled --> callbacks already called
@@ -531,153 +484,16 @@ void DnsResolver::cname_resolve_callback(const bool was_success,
     else
         GlobalLogger.info() << LogPrefix << "CNAME resolution failed";
         // no use to schedule retry in this case since cname resolver must have
-        // failed several times and we can just re-start the same procedure with
-        // the same information (in recursion can try different name server)
-        // --> no schedule_retry
+        // failed several times and we can only re-start the same procedure with
+        // the same information
 
     // cname counts like one more recursion step ...
-    finalize_resolve(was_success, recursion_count+1);
-}
-
-
-void DnsResolver::handle_recurse(const HostAddress &name_server)
-{
-    // get resolver for same hostname but using a different name server
-    if (Recursor)
-    {
-        if (Recursor->is_resolving())
-        {
-            GlobalLogger.warning() << LogPrefix << "Recursor is resolving! "
-                                   << "Will cancel and reset";
-            Recursor->cancel_resolve();
-        }
-        else
-            GlobalLogger.warning() << LogPrefix
-                                   << "Recursor has not been reset!";
-        Recursor.reset();
-    }
-
-    Recursor = DnsMaster::get_instance()->get_recursor_for(
-                                      Hostname, Protocol, name_server.get_ip());
-    callback_type callback = boost::bind(
-                                       &DnsResolver::recursive_resolve_callback,
-                                       this, name_server.get_ttl().get_value(),
-                                       _1, _2 );
-    Recursor->async_resolve( callback );
-
-    // do not cancel timers or reset RetryCount
-    //stop_trying();
-}
-
-
-void DnsResolver::recursive_resolve_callback(const uint32_t min_ttl,
-                                             const bool was_success,
-                                             const int recursion_count)
-{
-    GlobalLogger.debug()
-        << "Recursion back at request with name server " << NameServer;
-
-    // do not need recursor any more; next time re-create from different random
-    //    name server; may have been reset already in cancel_resolve(), so that
-    //    is ok. If not, issue a warning
-    if ( !Recursor )
-    {
-        if ( !OperationCancelled )
-            GlobalLogger.warning() << LogPrefix
-                                   << "Recursor was reset before callback!";
-    }
-    else
-        Recursor.reset();
-
-    if ( OperationCancelled )
-    {   // async_resolve was cancelled --> callbacks already called
-        GlobalLogger.info() << LogPrefix
-                        << "Ignoring recursion results since we were cancelled";
-        return;
-    }
-    else if (was_success)
-    {
-        // make sure the saved TTL is not larger than the one we found here
-        ResolverBase::update_cache(min_ttl);
-        finalize_resolve(was_success, recursion_count+1);
-    }
-    else
-    {
-        GlobalLogger.info() << LogPrefix << "Recursive resolution failed";
-        schedule_retry();
-    }
-}
-
-
-void DnsResolver::handle_recurse_without_ip(const std::string &name_server)
-{
-    // get resolver for name_server
-    // save in Recursor although it is a "proper" resolver (so result is cached)
-    if (Recursor)
-    {
-        if (Recursor->is_resolving())
-        {
-            GlobalLogger.warning() << LogPrefix << "Recursor is resolving! "
-                                   << "Will cancel and reset";
-            Recursor->cancel_resolve();
-        }
-        else
-            GlobalLogger.warning() << LogPrefix
-                                   << "Recursor has not been reset!";
-        Recursor.reset();
-    }
-    Recursor = DnsMaster::get_instance()->get_resolver_for(name_server,
-                                                           Protocol);
-
-    // check for IPs in cache
-    if (Recursor->get_resolved_ip_count() == 0)
-    {
-        GlobalLogger.info() << LogPrefix
-                   << "Start to resolve address of name server " << name_server;
-        callback_type callback = boost::bind(
-                                     &DnsResolver::name_server_resolve_callback,
-                                     this, _1, _2);
-        Recursor->async_resolve( callback );
-    }
-    else
-    {
-        GlobalLogger.info() << LogPrefix << "Use cached ip for name server "
-                            << name_server;
-        HostAddress ip = Recursor->get_next_ip();
-        Recursor.reset();
-        handle_recurse(ip);
-    }
-}
-
-void DnsResolver::name_server_resolve_callback(const bool was_success,
-                                               const int recursion_count)
-{
-    if (OperationCancelled)
-    {
-        GlobalLogger.info() << LogPrefix
-                   << "Ignoring name server IP results since we were cancelled";
-        return;
-    }
-    else if (was_success)
-    {
-        HostAddress ip = Recursor->get_next_ip();
-        GlobalLogger.info() << LogPrefix << "Found IP " << ip.get_ip()
-            << " for name server " << Recursor->get_hostname();
-        Recursor.reset();
-        handle_recurse(ip);
-    }
-    else
-    {
-        GlobalLogger.info() << LogPrefix << "Failed to find IP for name server"
-            << Recursor->get_hostname() << " --> schedule retry";
-        Recursor.reset();
-        schedule_retry();
-    }
+    finalize_resolve(was_success, cname_count+1);
 }
 
 
 void DnsResolver::finalize_resolve(const bool was_success,
-                                   const int recursion_count)
+                                   const int cname_count)
 {
     // some consistency checks; failure might indicate a situation I had not
     // anticipated during programming but might not be harmfull yet
@@ -698,12 +514,12 @@ void DnsResolver::finalize_resolve(const bool was_success,
     stop_trying();
 
     // schedule callbacks, clearing callback list
-    ResolverBase::schedule_callbacks(was_success, recursion_count);
+    ResolverBase::schedule_callbacks(was_success, cname_count);
 
     // finalize
     GlobalLogger.notice() << LogPrefix << "finalized resolve"
                           << " with success = " << was_success
-                          << " and recursion_count = " << recursion_count;
+                          << " and cname_count = " << cname_count;
     IsResolving = false;
 }
 
@@ -749,17 +565,14 @@ void DnsResolver::cancel_resolve()
         return;
     }
 
-    if ( Recursor )
-        Recursor->cancel_resolve(); // does not hurt even if it is not resolving
-
     // set before finalize_resolve so can check in finalize_resolve that ID is
     //   always 0; ID is not used any more since handle_dns_result stops if
     //   OperationCancelled is true
     RequestId = 0;
 
     bool was_success = false;
-    int recursion_count = 1;
-    finalize_resolve(was_success, recursion_count);
+    int cname_count = 1;
+    finalize_resolve(was_success, cname_count);
 
     // set after finalize_resolve, so can check in finalize_resolve that 
     // OperationCancelled is never true
@@ -799,13 +612,7 @@ void DnsResolver::handle_resolve_timeout(const boost::system::error_code &error)
 
 void DnsResolver::schedule_retry()
 {
-    // this function is called in all sorts of error cases
-    // --> need to clean up a bit
-    if ( Recursor )
-    {
-        Recursor->cancel_resolve();
-        Recursor.reset();
-    }
+    // cancel timers
     ResolveTimeoutTimer.cancel();
     PauseBeforeRetryTimer.cancel();
 
index a705f50..1e8ce1a 100644 (file)
@@ -83,20 +83,13 @@ private:
     void handle_unavailable();
     void handle_ips(const std::vector<host_addr_pair> &result_ips);
     void handle_cname(const std::vector<src_cname_pair> &result_cnames);
-    void handle_recurse(const HostAddress &name_server);
-    void handle_recurse_without_ip(const std::string &name_server);
     void cname_resolve_callback(const bool was_success,
-                                const int recursion_count);
-    void recursive_resolve_callback(const uint32_t min_ttl,
-                                    const bool was_success,
-                                    const int recursion_count);
-    void name_server_resolve_callback(const bool was_success,
-                                      const int recursion_count);
+                                const int cname_count);
     void schedule_retry();
-    void finalize_resolve(const bool success, const int recursion_count=0);
+    void finalize_resolve(const bool success, const int cname_count=0);
     void stop_trying();
     void wait_timer_timeout_handler(const boost::system::error_code &error);
-    void gather_results( const boost::net::dns::rr_list_t *answers,
+    void gather_results( const boost::net::dns::rr_list_t *rr_list,
                          std::vector<host_addr_pair> *result_ips,
                          std::vector<src_cname_pair> *result_cnames,
                          std::vector<string_pair> *result_nameservers ) const;
@@ -113,11 +106,11 @@ private:
     boost::asio::deadline_timer StaleDataLongtermTimer;
     std::size_t NextIpIndex;
     int RetryCount;
-    bool IsResolving;
+    bool IsResolving;    // true from async_resolve until finalize_resolve;
+                         // false e.g. while waiting for StaleDataLongtermTimer
     std::string LogPrefix;
     boost::uuids::random_generator RandomIdGenerator;
     uint16_t RequestId;
-    ResolverItem Recursor;
     bool OperationCancelled;
 };
 
index d28b6eb..1ca1375 100644 (file)
@@ -55,6 +55,21 @@ ResolverBase::ResolverBase(const IoServiceItem &io_serv,
 std::string ResolverBase::get_hostname() const
 {   return Hostname;   }
 
+std::string ResolverBase::get_skipper() const
+{
+    DnsMasterItem master = DnsMaster::get_instance();
+    std::string first_out_of_date = Cache->get_first_outdated_cname(
+                                      Hostname,
+                                      master->get_resolved_ip_ttl_threshold() );
+    if ( first_out_of_date == Hostname )
+        return "";
+    else
+        // we want to skip this first outdated cname, so return what is 
+        // directly behind it.
+        // If that is not a cname but ips, will return empty here
+        return Cache->get_cname(first_out_of_date).Host;
+}
+
 void ResolverBase::update_cache( const std::string &hostname,
                                  const HostAddressVec &new_results ) const
 {   Cache->update( hostname, new_results );  }
index c731b66..3b0fa09 100644 (file)
 typedef boost::function<void(const bool, const int)> callback_type;
 typedef std::queue<callback_type> callback_list_type;
 
+class ResolverBase;
+typedef boost::shared_ptr<ResolverBase> ResolverItem;
+
+
 /**
  * @brief: abstract base class for DnsResolver and IpPseudoResolver
  */
@@ -57,6 +61,8 @@ public:
 
     std::string get_hostname() const;
 
+    std::string get_skipper() const;
+
 protected:
     ResolverBase(const IoServiceItem &io_serv,
                  const std::string &hostname,
@@ -90,8 +96,6 @@ protected:
 
 };
 
-typedef boost::shared_ptr<ResolverBase> ResolverItem;
-
 #endif
 
 // (created using vim -- the world's best text editor)
index f1162dd..70d9433 100644 (file)
@@ -26,6 +26,7 @@ on this file might be covered by the GNU General Public License.
 #include <boost/serialization/access.hpp>
 #include <boost/serialization/nvp.hpp>
 #include <boost/serialization/split_member.hpp>
+#include <boost/serialization/string.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
 
 // forward declaration
@@ -47,14 +48,6 @@ public:
     uint32_t get_updated_value() const;
 
 private:
-    // required for saving and loading TtlSetTime to original value
-    friend class HostAddress;
-    //template<class Archive>
-    //friend void HostAddress::load(Archive & ar, const unsigned int version);
-    //template<class Archive>
-    //friend void HostAddress::save(Archive & ar, const unsigned int version)
-    //                                                                    const;
-
     /// the numeric time-to-live
     uint32_t Ttl;
     /// the time when the time-to-live was set, so it is possible to know the
index 72a4839..47d3e21 100644 (file)
@@ -29,6 +29,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/utility.hpp>
 #include <boost/asio/io_service.hpp>
+#include <boost/asio/ip/address.hpp>
 #include <boost/weak_ptr.hpp>
 
 //-----------------------------------------------------------------------------
@@ -54,7 +55,7 @@ public:
     typedef boost::weak_ptr<Pinger> WeakPtr;
 
     virtual void ping(
-            const std::string &destination_ip,
+            const boost::asio::ip::address &ip,
             const uint16_t destination_port,
             boost::function<void(bool)> ping_done_callback
     ) = 0;
index 085ef6f..a919b9a 100644 (file)
@@ -124,40 +124,3 @@ PingerItem PingerFactory::createPinger(
     return PingerItem();                                                                                                                        //lint !e527
 }
 
-/**
- * @brief Create a Pinger object suitable to the given list of protocols.
- *
- * @param protocol_list A list of the available ping protocols.
- * @param io_serv The @c io_service object.
- * @param network_interface The network interface name from where the ping
- * packet will be sent.
- * @param destination_address The remote address to ping.
- * @param destination_port The remote port to ping.
- *
- * @return a Pinger object to able to ping using the given list of protocols.
- */
-PingRotateItem PingerFactory::createPinger(
-        const PingProtocolList &protocol_list,
-        const IoServiceItem io_serv,
-        const string &network_interface,
-        const string &destination_address,
-        const uint16_t destination_port,
-        const int resolved_ip_ttl_threshold,
-        const int ping_reply_timeout
-)
-{
-    BOOST_ASSERT( 0 < protocol_list.size() );
-    BOOST_ASSERT( !network_interface.empty() );
-    BOOST_ASSERT( !destination_address.empty() );
-    BOOST_ASSERT( 0 < destination_port );
-
-    return PingRotateItem( new PingRotate(
-            io_serv,
-            network_interface,
-            destination_address,
-            destination_port,
-            resolved_ip_ttl_threshold,
-            ping_reply_timeout,
-            protocol_list
-    ) );
-}
index b735ecf..0d03e6c 100644 (file)
@@ -28,7 +28,6 @@
 
 #include "host/pinger.h"
 #include "host/pingprotocol.h"
-#include "host/pingrotate.h"
 
 //-----------------------------------------------------------------------------
 // PingerFactory
@@ -44,16 +43,6 @@ public:
             const int ping_reply_timeout
     );
 
-    static PingRotateItem createPinger(
-            const PingProtocolList &protocol_list,
-            const IoServiceItem io_serv,
-            const std::string &network_interface,
-            const std::string &destination_address,
-            const uint16_t destination_port,
-            const int resolved_ip_ttl_threshold,
-            const int ping_reply_timeout
-    );
-
 private:
     PingerFactory();
     ~PingerFactory();
index ed82e8a..2b476f4 100644 (file)
@@ -72,32 +72,35 @@ PingScheduler::PingScheduler(
         const int first_delay
 
 ) :
+    IoService( io_serv ),
+    NetworkInterfaceName( network_interface ),
+    Resolver(),
+    DestinationAddress( destination_address ),
+    DestinationPort( destination_port ),
     NextPingTimer( *io_serv ),
-    NextAddressTimer( *io_serv ),
     TimeSentLastPing( microsec_clock::universal_time() ),
     PingIntervalInSec( ping_interval_in_sec ),
-    AddressResolveIntervalInSec( ping_interval_in_sec ),
     HostAnalyzer( destination_address, ping_fail_percentage_limit, link_analyzer ),
     FirstDelay( first_delay ),
-    AddressResolutionAttempts( 0 ),
-    EverHadAnyIP( false ),
     Ping()
 {
     BOOST_ASSERT( !network_interface.empty() );
     BOOST_ASSERT( !destination_address.empty() );
-    BOOST_ASSERT( 0 < destination_port );
+    BOOST_ASSERT( ( 0 < destination_port ) &&
+                  ( destination_port < numeric_limits<uint16_t>::max() ) );
     BOOST_ASSERT( 0 < ping_interval_in_sec );
-    BOOST_ASSERT( (0 <= ping_fail_percentage_limit) && (ping_fail_percentage_limit <= 100) );
-
-    Ping = PingerFactory::createPinger(
-            ping_protocol_list,
-            io_serv,
-            network_interface,
-            destination_address,
-            destination_port,
-            resolved_ip_ttl_threshold,
-            ping_reply_timeout
-    );
+    BOOST_ASSERT( (0 <= ping_fail_percentage_limit) &&
+                  ( ping_fail_percentage_limit <= 100) );
+
+    std::stringstream temp;
+    temp << "PS(" << DestinationAddress << "): ";
+    LogPrefix = temp.str();
+
+    // fill circular buffer with protocols
+    BOOST_FOREACH( const PingProtocol &prot, protocol_list )
+        ProtocolRotate.push_back(prot);
+
+    init_ping_protocol();
 }
 
 /**
@@ -112,6 +115,7 @@ void PingScheduler::stop_pinging()
     // stop pinger, which will probably call ping_done_handler --> re-new NextPingTimer
     GlobalLogger.debug() << "scheduler: stop pinging" << endl;
     Ping->stop_pinging();
+    Resolver->cancel_resolve();
 
     // now cancel the own timer
     GlobalLogger.debug() << "scheduler: cancel timer" << endl;
@@ -119,93 +123,82 @@ void PingScheduler::stop_pinging()
 }
 
 /**
- * @brief Start into infinite loop of calls to resolve_and_ping
+ * @brief Start into infinite loop of calls to ping
  *
  * Does not start yet but set NextPingTimer (possibly to 0), so action starts
  *   when io_service is started
  */
 void PingScheduler::start_pinging()
 {
-    // assume that even at re-start there is no IP known
-    EverHadAnyIP = false;
-
     if ( FirstDelay > 0 )
         GlobalLogger.info() << "Delaying first ping by " << FirstDelay << "s";
     else
         GlobalLogger.info() << "Schedule ping as soon as possible";
 
     (void) NextPingTimer.expires_from_now( seconds( FirstDelay ) );
-    NextPingTimer.async_wait( bind( &PingScheduler::resolve_and_ping, this,
+    NextPingTimer.async_wait( bind( &PingScheduler::ping, this,
                                           boost::asio::placeholders::error ) );
 }
 
 
 /**
- * @brief Check whether need to resolve host names via DNS and then
- *   call ping;
- *   If name resolution fails too often, reports this to HostAnalyzer
+ * @brief call Ping::ping and schedule a call to ping_done_handler when finished
  */
-void PingScheduler::resolve_and_ping(const boost::system::error_code &error)
+void PingScheduler::ping(const boost::system::error_code &error)
 {
     if ( error )
     {   // get here, e.g. by NextPingTimer.cancel in stop_pinging
         if ( error ==  boost::asio::error::operation_aborted )
-            GlobalLogger.error() << "Timer for resolve_and_ping was cancelled! Stopping" << endl;
+            GlobalLogger.error() << "Timer for ping was cancelled! "
+                                 << "Stopping" << endl;
         else
             GlobalLogger.error() << "Received error " << error
-                                 << " waiting for resolve_and_ping! Stopping" << endl;
+                                 << " waiting for ping! Stopping"
+                                 << endl;
         return;
     }
 
-    bool ips_up_to_date = EverHadAnyIP && Ping->have_up_to_date_ip();
+    // ping as soon as dns is ready
+    WantToPing = true;
+    try_to_ping();
+}
+
 
-    // determine if address resolution is required
-    if ( !ips_up_to_date )
+void PingRotate::try_to_ping()
+{
+    if ( !WantToPing )
     {
-        Ping->start_resolving_ping_address();    // try to resolve
-        if ( ips_up_to_date )
-        {
-            EverHadAnyIP = true;
-            HostAnalyzer.set_resolved_ip_count( Ping->get_resolved_ip_count() );
-            AddressResolutionAttempts = 0;
-        }
+        GlobalLogger.info() << "PingRotate: not pinging yet (not requested to)";
+        return;
     }
-    // (may still have no or only outdated IPs)
+    else if ( Resolver && Resolver->is_resolving() )
+    {
+        GlobalLogger.info() << "PingRotate: not pinging yet (DNS not finished)";
+        return;
+    }
+    else if ( !Resolver )
+        // should not happen, but check anyway
+        GlobalLogger.warning() << LogPrefix << "Have no resolver!";
 
+    GlobalLogger.info() << "PingRotate: start ping";
+    WantToPing = false;
 
-    if ( EverHadAnyIP )
-    {   // have IPs --> can ping (even if IPs are out of date)
-        if ( !ips_up_to_date )
-            GlobalLogger.info() << "Using outdated IPs" << endl;
-        ping();
-    }
-    else
-    {   // no IPs --> try again later, possibly report offline before
-        AddressResolutionAttempts++;
-        if (AddressResolutionAttempts >= 10) //MaxAddressResolutionAttempts)
-        {
-            GlobalLogger.notice() << "No IPs after " << AddressResolutionAttempts << " DNS queries!";
-            HostAnalyzer.report_dns_resolution_failure();
-        }
-        (void) NextAddressTimer.expires_from_now( seconds( AddressResolveIntervalInSec ) );
-        NextAddressTimer.async_wait( bind( &PingScheduler::resolve_and_ping, this,
-                                                 boost::asio::placeholders::error ) );
-    }
+    Ping->ping(
+            Resolver->get_next_ip().get_ip(),
+            DestinationPort,
+            boost::bind(&PingScheduler::ping_done_handler, this, _1)
+    );
 }
 
-/**
- * @brief call Ping::ping and schedule a call to ping_done_handler when finished
- */
-void PingScheduler::ping()
-{
-    Ping->ping( boost::bind(&PingScheduler::ping_done_handler, this, _1) );
-}
 
+//------------------------------------------------------------------------------
+// Post Processing of Ping result
+//------------------------------------------------------------------------------
 
 /**
  * @brief called when Ping::ping is done; calls functions to update
  *   statistics, ping interval and elapsed time;
- *   schedules a call to resolve_and_ping, thereby closing the loop
+ *   schedules a call to ping, thereby closing the loop
  */
 void PingScheduler::ping_done_handler( const bool ping_success )
 {
@@ -218,9 +211,12 @@ void PingScheduler::ping_done_handler( const bool ping_success )
     update_ping_interval();
     update_ping_elapsed_time();
 
+    // get next protocol, possibly start resolving IPs
+    update_ping_protocol();
+
     // schedule next ping
     (void) NextPingTimer.expires_from_now( seconds( PingIntervalInSec ) );
-    NextPingTimer.async_wait( bind( &PingScheduler::resolve_and_ping, this,
+    NextPingTimer.async_wait( bind( &PingScheduler::ping, this,
                                          boost::asio::placeholders::error ) );
 }
 
@@ -253,3 +249,114 @@ void PingScheduler::update_ping_elapsed_time()
     TimeSentLastPing = microsec_clock::universal_time();
 }
 
+
+//------------------------------------------------------------------------------
+// Ping Protocol Rotation
+//------------------------------------------------------------------------------
+
+void PingRotate::init_ping_protocol()
+{
+    get_next_ping_protocol();
+}
+
+void PingRotate::update_ping_protocol()
+{
+    if ( can_change_ping_protocol() )
+    {
+        get_next_ping_protocol();
+    }
+}
+
+void PingRotate::get_next_ping_protocol()
+{
+    PingProtocol ping_protocol = ProtocolRotate.front();
+    ProtocolRotate.pop_front();
+    ProtocolRotate.push_back(ping_protocol);
+
+    if (Ping)
+        Ping->stop_pinging();
+
+    Ping = PingerFactory::createPinger(ping_protocol, IoService,
+                                       NetworkInterfaceName, PingReplyTimeout);
+
+    update_dns_resolver( ping_protocol );
+}
+
+bool PingRotate::can_change_ping_protocol() const
+{
+    // TODO can_change_ping_protocol() and get_next_ping_protocol() may be implemented in a Algorithm
+    // class that can be exchanged in this class to provide an algorithm neutral class
+    return true;
+}
+
+//------------------------------------------------------------------------------
+// DNS host name resolution
+//------------------------------------------------------------------------------
+//
+void PingRotate::update_dns_resolver( PingProtocol current_protocol )
+{
+    if (Resolver && Resolver->is_resolving())
+    {
+        GlobalLogger.warning() << "Resolver still seems to be resolving "
+                               << "--> cancel!";
+        Resolver->cancel_resolve();
+    }
+
+    // DNS master caches created resolvers and resolved IPs, so this will
+    // probably just return an existing resolver with already resolved IPs for
+    // requested protocol ( ICMP/TCP is ignored, only IPv4/v6 is important)
+    Resolver = DnsMaster::get_instance()->get_resolver_for(DestinationAddress,
+                                                           current_protocol);
+    // start resolving if no ips available
+    if ( Resolver->have_up_to_date_ip() )
+    {
+        if (!Resolver->is_resolving())
+            GlobalLogger.warning() << "PingRotate: have up to date IPs but "
+                << "resolver seems to be resolving all the same... "
+                << "Start pinging anyway!";
+        try_to_ping();
+    }
+    else
+        start_resolving_ping_address();
+}
+
+void PingRotate::start_resolving_ping_address()                                                         //lint !e1762
+{
+    Resolver->async_resolve( boost::bind(&PingRotate::dns_resolve_callback,
+                                          this, _1, _2) );
+}
+
+void PingRotate::dns_resolve_callback(const bool was_success,
+                                      const int cname_count)
+{
+    GlobalLogger.info() << "PingRotate: dns resolution finished "
+                        << "with success = " << was_success << " "
+                        << "and cname_count = " << cname_count;
+
+    if ( !was_success )
+    {   // host name resolution failed; try again bypassing first CNAME(s)
+        std::string skip_host = Resolver->get_skipper();
+
+        if (skip_host.empty())
+        {
+            GlobalLogger.notice() << LogPrefix << "DNS failed, "
+                << "try anyway with cached data";
+            HostAnalyzer->set_resolved_ip_count(0);
+            try_to_ping();
+        }
+        else
+        {
+            GlobalLogger.notice() << LogPrefix << "DNS failed, "
+                << "try again skipping a CNAME and resolving "
+                << skip_host << " directly";
+            Resolver = DnsMaster::get_instance()
+                               ->get_resolver_for(skip_host, PingRotate.back());
+            start_resolving_ping_address();
+        }
+    }
+    else
+    {
+        HostAnalyzer->set_resolved_ip_count( Resolver->get_resolved_ip_count());
+        try_to_ping();
+    }
+}
index 75598b9..250bf85 100644 (file)
@@ -77,6 +77,16 @@ private:
     void update_ping_interval();
     void update_ping_elapsed_time();
 
+    void init_ping_protocol();
+    void update_ping_protocol();
+    void get_next_ping_protocol();
+    bool can_change_ping_protocol() const;
+
+    void update_dns_resolver( PingProtocol current_protocol );
+
+    void try_to_ping();
+    void dns_resolve_callback(const bool was_success, const int cname_count);
+
     //
     // Attributes
     //
@@ -94,14 +104,27 @@ private:
     /// Object responsible to evaluate the status of the host
     HostStatus HostAnalyzer;
     /// delay for very first ping to avoid lots of simultaneous pings
-    int  FirstDelay;
-    /// number of attempts at Address Resolution
-    int AddressResolutionAttempts;
-    /// flag whether any DNS lookup succeeded
-    //  (comparing get_ip_count to 0 might violate assertion in dnsresolver.cpp)
-    bool EverHadAnyIP;
+    int FirstDelay;
+    /// The IO service object, which has the loop event
+    IoServiceItem IoService;
+    /// The network interface name
+    std::string NetworkInterfaceName;
+    /// The Dns resolver
+    ResolverItem Resolver;
+    /// The address to ping
+    std::string DestinationAddress;
+    /// The port to ping at destination host (same port to all protocols in the list)
+    uint16_t DestinationPort;
+    /// time threshold for address resolution
+    int ResolvedIpTtlThreshold;
+    /// timeout for ping reply
+    const int PingReplyTimeout;
+    /// The list of protocols to ping
+    CircularProtocolList ProtocolRotate;
     /// Internal boost pinger object
-    PingRotateItem Ping;
+    PingerItem Ping;
+    /// a flag whether we should ping as soon as dns is ready
+    bool WantToPing;
 };
 
 //-----------------------------------------------------------------------------
index 8296252..501a8b7 100644 (file)
@@ -122,7 +122,7 @@ IcmpPinger::~IcmpPinger()
  * @return void.
  */
 void IcmpPinger::ping(
-        const string &destination_ip,
+        const address &destination_ip,
         const uint16_t /*destination_port*/, // the ICMP protocol does not use ports
         function<void(bool)> ping_done_callback
 )
@@ -167,13 +167,10 @@ void IcmpPinger::stop_pinging()
 }
 
 
-void IcmpPinger::set_destination_endpoint( const string &destination_ip )
+void IcmpPinger::set_destination_endpoint( const address &destination_ip )
 {
-    BOOST_ASSERT( !destination_ip.empty() );
-
     uint16_t port = 0;
-    address destination_address = address::from_string( destination_ip );
-    DestinationEndpoint = icmp::endpoint( destination_address, port );
+    DestinationEndpoint = icmp::endpoint( destination_ip, port );
 }
 
 bool IcmpPinger::start_send()
index d3463c4..c1e1e6a 100644 (file)
@@ -125,7 +125,7 @@ public:
     virtual ~IcmpPinger();
 
     virtual void ping(
-            const std::string &destination_ip,
+            const boost::asio::ip::address &destination_ip,
             const uint16_t destination_port,
             boost::function<void(bool)> ping_done_callback
     );
@@ -144,7 +144,7 @@ private:
             const IcmpPacketDistributorItem distributor
     );
 
-    void set_destination_endpoint( const std::string &destination_ip );
+    void set_destination_endpoint(const boost::asio::ip::address &destination);
 
     bool start_send();
     bool send_echo_request( const IcmpPacketItem icmp_packet );
index 79347f6..1cd857d 100644 (file)
@@ -113,12 +113,11 @@ TcpPinger::~TcpPinger()
  * @return void.
  */
 void TcpPinger::ping(
-        const string &destination_ip,
+        const address &destination_ip,
         const uint16_t destination_port,
         function<void(bool)> ping_done_callback
 )
 {
-    BOOST_ASSERT( !destination_ip.empty() );
     BOOST_ASSERT( ( 0 < destination_port ) && ( destination_port < numeric_limits<uint16_t>::max() ) );
 
     PingDoneCallback = ping_done_callback;
@@ -159,17 +158,15 @@ uint16_t TcpPinger::get_destination_port() const
 }
 
 void TcpPinger::set_destination_endpoint(
-        const string &destination_ip,
+        const address &destination_ip,
         const uint16_t destination_port
 )
 {
-    BOOST_ASSERT( !destination_ip.empty() );
     BOOST_ASSERT( ( 0 < destination_port ) && ( destination_port < numeric_limits<uint16_t>::max() ) );
     BOOST_ASSERT( sizeof(uint16_t) <= sizeof(destination_port) );
 
-    address destination_address = address::from_string( destination_ip );
     uint16_t port = static_cast<uint16_t>( destination_port );
-    DestinationEndpoint = tcp_raw_protocol::endpoint( destination_address, port );
+    DestinationEndpoint = tcp_raw_protocol::endpoint( destination_ip, port );
 }
 
 void TcpPinger::start_send()
index 8a6329f..19effee 100644 (file)
@@ -47,7 +47,7 @@ public:
     virtual ~TcpPinger();
 
     virtual void ping(
-            const std::string &destination_ip,
+            const boost::asio::ip::address &destination_ip,
             const uint16_t destination_port,
             boost::function<void(bool)> ping_done_callback
     );
@@ -76,7 +76,7 @@ private:
     uint16_t get_destination_port() const;
 
     void set_destination_endpoint(
-            const std::string &destination_ip,
+            const boost::asio::ip::address &destination_ip,
             const uint16_t destination_port
     );