diff --git a/Makefile b/Makefile
index 87907cf..6281f65 100644
--- a/Makefile
+++ b/Makefile
@@ -50,11 +50,13 @@ passwd: common
$(MAKE) -C hkexpasswd
vis:
- @which go-code-visualizer >/dev/null 2>&1; \
+ @which go-callvis >/dev/null 2>&1; \
stat=$$?; if [ $$stat -ne "0" ]; then \
- /bin/echo "go-code-visualizer not found. Run go get github.com/CodeHipster/go-code-visualizer to install."; \
+ /bin/echo "go-callvis not found. Run go get github.com/Russtopia/go-callvis to install."; \
else \
- go-code-visualizer . && dot -Tpng dot-visual.gv -o viz_hkexsh_dot.png; \
+ make -C hkexsh vis;\
+ make -C hkexshd vis;\
+ make -C hkexpasswd vis; \
fi
install:
diff --git a/hkexpasswd/Makefile b/hkexpasswd/Makefile
index 32000d7..b944df9 100644
--- a/hkexpasswd/Makefile
+++ b/hkexpasswd/Makefile
@@ -1,5 +1,6 @@
-.PHONY: clean all
+.PHONY: clean all vis
+EXTPKGS = bytes,errors,flag,fmt,internal,io,log,net,os,path,runtime,time,strings,sync,syscall,binary,encoding
EXE = $(notdir $(shell pwd))
all:
@@ -8,3 +9,6 @@ all:
clean:
$(RM) $(EXE) $(EXE).exe
+vis:
+ go-callvis -skipbrowser -svg -output hkexpasswd-vis -ignore $(EXTPKGS) -group pkg,type .
+
diff --git a/hkexpasswd/hkexpasswd-vis.gv b/hkexpasswd/hkexpasswd-vis.gv
new file mode 100755
index 0000000..481f3ce
--- /dev/null
+++ b/hkexpasswd/hkexpasswd-vis.gv
@@ -0,0 +1,63 @@
+digraph gocallvis {
+ label="blitter.com/go/hkexsh/hkexpasswd";
+ labeljust="l";
+ fontname="Arial";
+ fontsize="14";
+ rankdir="LR";
+ bgcolor="lightgray";
+ style="solid";
+ penwidth="0.5";
+ pad="0.0";
+ nodesep="0.35";
+
+ node [shape="ellipse" style="filled" fillcolor="honeydew" fontname="Verdana" penwidth="1.0" margin="0.05,0.0"];
+ edge [minlen="2"]
+
+ subgraph "cluster_focus" {
+ bgcolor="#e6ecfa";
+label="main";
+labelloc="t";
+labeljust="c";
+fontsize="18";
+
+ "blitter.com/go/hkexsh/hkexpasswd.main" [ penwidth="0.5" fillcolor="lightblue" label="main" ]
+
+ subgraph "cluster_blitter.com/go/hkexsh" {
+ fontname="bold";
+rank="sink";
+label="[hkexsh]";
+URL="/?f=blitter.com/go/hkexsh";
+style="filled";
+fontsize="16";
+fillcolor="lightyellow";
+tooltip="package: blitter.com/go/hkexsh";
+penwidth="0.8";
+
+ "blitter.com/go/hkexsh.ReadPassword" [ fillcolor="moccasin" label="ReadPassword" penwidth="1.5" ]
+
+ }
+
+ subgraph "cluster_github.com/jameskeane/bcrypt" {
+ label="[bcrypt]";
+fontsize="16";
+fillcolor="lightyellow";
+fontname="bold";
+rank="sink";
+penwidth="0.8";
+style="filled";
+URL="/?f=github.com/jameskeane/bcrypt";
+tooltip="package: github.com/jameskeane/bcrypt";
+
+ "github.com/jameskeane/bcrypt.Salt" [ fillcolor="moccasin" label="Salt" penwidth="1.5" ]
+ "github.com/jameskeane/bcrypt.Hash" [ fillcolor="moccasin" label="Hash" penwidth="1.5" ]
+ "github.com/jameskeane/bcrypt.Match" [ fillcolor="moccasin" label="Match" penwidth="1.5" ]
+
+ }
+
+ }
+
+ "blitter.com/go/hkexsh/hkexpasswd.main" -> "blitter.com/go/hkexsh.ReadPassword" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexpasswd.main" -> "github.com/jameskeane/bcrypt.Salt" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexpasswd.main" -> "github.com/jameskeane/bcrypt.Hash" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexpasswd.main" -> "github.com/jameskeane/bcrypt.Match" [ color="saddlebrown" ]
+}
diff --git a/hkexpasswd/hkexpasswd-vis.gv.svg b/hkexpasswd/hkexpasswd-vis.gv.svg
new file mode 100644
index 0000000..004a997
--- /dev/null
+++ b/hkexpasswd/hkexpasswd-vis.gv.svg
@@ -0,0 +1,89 @@
+
+
+
+
+
diff --git a/hkexsh/Makefile b/hkexsh/Makefile
index 32000d7..307afd6 100644
--- a/hkexsh/Makefile
+++ b/hkexsh/Makefile
@@ -1,5 +1,6 @@
-.PHONY: clean all
+.PHONY: clean all vis
+EXTPKGS = bytes,errors,flag,fmt,internal,io,log,net,os,path,runtime,time,strings,sync,syscall,binary,encoding
EXE = $(notdir $(shell pwd))
all:
@@ -8,3 +9,7 @@ all:
clean:
$(RM) $(EXE) $(EXE).exe
+vis:
+ go-callvis -skipbrowser -svg -output hkexsh-vis -ignore $(EXTPKGS) -group pkg,type .
+
+
diff --git a/hkexsh/hkexsh-vis.gv b/hkexsh/hkexsh-vis.gv
new file mode 100755
index 0000000..68c517a
--- /dev/null
+++ b/hkexsh/hkexsh-vis.gv
@@ -0,0 +1,247 @@
+digraph gocallvis {
+ label="blitter.com/go/hkexsh/hkexsh";
+ labeljust="l";
+ fontname="Arial";
+ fontsize="14";
+ rankdir="LR";
+ bgcolor="lightgray";
+ style="solid";
+ penwidth="0.5";
+ pad="0.0";
+ nodesep="0.35";
+
+ node [shape="ellipse" style="filled" fillcolor="honeydew" fontname="Verdana" penwidth="1.0" margin="0.05,0.0"];
+ edge [minlen="2"]
+
+ subgraph "cluster_focus" {
+ bgcolor="#e6ecfa";
+label="main";
+labelloc="t";
+labeljust="c";
+fontsize="18";
+
+ "blitter.com/go/hkexsh/hkexsh.reqTunnel" [ fillcolor="lightblue" label="reqTunnel" penwidth="0.5" ]
+ "blitter.com/go/hkexsh/hkexsh.launchTuns" [ penwidth="0.5" fillcolor="lightblue" label="launchTuns" ]
+ "blitter.com/go/hkexsh/hkexsh.rejectUserMsg" [ fillcolor="lightblue" label="rejectUserMsg" penwidth="0.5" ]
+ "blitter.com/go/hkexsh/hkexsh.main" [ penwidth="0.5" fillcolor="lightblue" label="main" ]
+ "blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs" [ label="parseNonSwitchArgs" penwidth="0.5" fillcolor="lightblue" ]
+ "blitter.com/go/hkexsh/hkexsh.main$1" [ label="main$1" style="dotted,filled" fillcolor="lightblue" ]
+ "blitter.com/go/hkexsh/hkexsh.main$2" [ fillcolor="lightblue" label="main$2" style="dotted,filled" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode$1" [ label="doShellMode$1" style="dotted,filled" fillcolor="lightblue" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode" [ fillcolor="lightblue" label="doShellMode" penwidth="0.5" ]
+ "blitter.com/go/hkexsh/hkexsh.handleTermResizes$1" [ fillcolor="lightblue" label="handleTermResizes$1" style="dotted,filled" ]
+ "blitter.com/go/hkexsh/hkexsh.GetSize" [ fillcolor="lightblue" label="GetSize" penwidth="1.5" ]
+ "blitter.com/go/hkexsh/hkexsh.handleTermResizes" [ fillcolor="lightblue" label="handleTermResizes" penwidth="0.5" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode$2" [ label="doShellMode$2" style="dotted,filled" fillcolor="lightblue" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode$2$1" [ style="dotted,filled" fillcolor="lightblue" label="doShellMode$2$1" ]
+ "blitter.com/go/hkexsh/hkexsh.doCopyMode" [ fillcolor="lightblue" label="doCopyMode" penwidth="0.5" ]
+ "blitter.com/go/hkexsh/hkexsh.UsageShell" [ fillcolor="lightblue" label="UsageShell" penwidth="1.5" ]
+ "blitter.com/go/hkexsh/hkexsh.UsageCp" [ label="UsageCp" penwidth="1.5" fillcolor="lightblue" ]
+
+ subgraph "cluster_blitter.com/go/hkexsh" {
+ fontsize="16";
+rank="sink";
+label="[hkexsh]";
+URL="/?f=blitter.com/go/hkexsh";
+penwidth="0.8";
+style="filled";
+fillcolor="lightyellow";
+fontname="bold";
+tooltip="package: blitter.com/go/hkexsh";
+
+ "blitter.com/go/hkexsh.MakeRaw" [ fillcolor="moccasin" label="MakeRaw" penwidth="1.5" ]
+ "blitter.com/go/hkexsh.Restore" [ fillcolor="moccasin" label="Restore" penwidth="1.5" ]
+ "blitter.com/go/hkexsh.ReadPassword" [ fillcolor="moccasin" label="ReadPassword" penwidth="1.5" ]
+ "blitter.com/go/hkexsh.NewSession" [ fillcolor="moccasin" label="NewSession" penwidth="1.5" ]
+
+ subgraph "cluster_*blitter.com/go/hkexsh.Session" {
+ fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+style="rounded,filled";
+fillcolor="wheat2";
+label="(*Session)";
+tooltip="type: *blitter.com/go/hkexsh.Session";
+penwidth="0.5";
+
+ "(*blitter.com/go/hkexsh.Session).SetStatus" [ fillcolor="moccasin" label="SetStatus" penwidth="1.5" ]
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh.Session" {
+ penwidth="0.5";
+fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+style="rounded,filled";
+fillcolor="wheat2";
+label="(Session)";
+tooltip="type: blitter.com/go/hkexsh.Session";
+
+ "(blitter.com/go/hkexsh.Session).Op" [ fillcolor="moccasin" label="Op" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).Who" [ fillcolor="moccasin" label="Who" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).ConnHost" [ fillcolor="moccasin" label="ConnHost" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).TermType" [ fillcolor="moccasin" label="TermType" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).Cmd" [ fillcolor="moccasin" label="Cmd" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).AuthCookie" [ fillcolor="moccasin" label="AuthCookie" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).Status" [ fillcolor="moccasin" label="Status" penwidth="1.5" ]
+
+ }
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh/hkexnet" {
+ style="filled";
+fillcolor="lightyellow";
+fontname="bold";
+label="[hkexnet]";
+URL="/?f=blitter.com/go/hkexsh/hkexnet";
+tooltip="package: blitter.com/go/hkexsh/hkexnet";
+penwidth="0.8";
+fontsize="16";
+rank="sink";
+
+ "blitter.com/go/hkexsh/hkexnet.Init" [ label="Init" penwidth="1.5" fillcolor="moccasin" ]
+ "blitter.com/go/hkexsh/hkexnet.Dial" [ fillcolor="moccasin" label="Dial" penwidth="1.5" ]
+
+ subgraph "cluster_*blitter.com/go/hkexsh/hkexnet.Conn" {
+ labelloc="b";
+style="rounded,filled";
+fillcolor="wheat2";
+label="(*Conn)";
+tooltip="type: *blitter.com/go/hkexsh/hkexnet.Conn";
+penwidth="0.5";
+fontsize="15";
+fontcolor="#222222";
+
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ fillcolor="moccasin" label="WritePacket" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).Close" [ label="Close" penwidth="1.5" fillcolor="moccasin" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ label="SetupChaff" penwidth="1.5" fillcolor="moccasin" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ label="EnableChaff" penwidth="1.5" fillcolor="moccasin" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ fillcolor="moccasin" label="DisableChaff" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ fillcolor="moccasin" label="ShutdownChaff" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus" [ penwidth="1.5" fillcolor="moccasin" label="SetStatus" ]
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh/hkexnet.Conn" {
+ label="(Conn)";
+tooltip="type: blitter.com/go/hkexsh/hkexnet.Conn";
+penwidth="0.5";
+fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+style="rounded,filled";
+fillcolor="wheat2";
+
+ "(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ label="Write" penwidth="1.5" fillcolor="moccasin" ]
+ "(blitter.com/go/hkexsh/hkexnet.Conn).Read" [ fillcolor="moccasin" label="Read" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus" [ penwidth="1.5" fillcolor="moccasin" label="GetStatus" ]
+
+ }
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh/logger" {
+ fillcolor="lightyellow";
+rank="sink";
+label="[logger]";
+penwidth="0.8";
+style="filled";
+fontname="bold";
+URL="/?f=blitter.com/go/hkexsh/logger";
+tooltip="package: blitter.com/go/hkexsh/logger";
+fontsize="16";
+
+ "blitter.com/go/hkexsh/logger.LogDebug" [ fillcolor="moccasin" label="LogDebug" penwidth="1.5" ]
+ "blitter.com/go/hkexsh/logger.New" [ penwidth="1.5" fillcolor="moccasin" label="New" ]
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh/spinsult" {
+ fontsize="16";
+fontname="bold";
+rank="sink";
+URL="/?f=blitter.com/go/hkexsh/spinsult";
+tooltip="package: blitter.com/go/hkexsh/spinsult";
+penwidth="0.8";
+style="filled";
+fillcolor="lightyellow";
+label="[spinsult]";
+
+ "blitter.com/go/hkexsh/spinsult.GetSentence" [ penwidth="1.5" fillcolor="moccasin" label="GetSentence" ]
+
+ }
+
+ subgraph "cluster_github.com/mattn/go-isatty" {
+ label="[isatty]";
+URL="/?f=github.com/mattn/go-isatty";
+penwidth="0.8";
+fillcolor="lightyellow";
+fontname="bold";
+tooltip="package: github.com/mattn/go-isatty";
+fontsize="16";
+style="filled";
+rank="sink";
+
+ "github.com/mattn/go-isatty.IsTerminal" [ fillcolor="moccasin" label="IsTerminal" penwidth="1.5" ]
+
+ }
+
+ }
+
+ "blitter.com/go/hkexsh/hkexsh.reqTunnel" -> "blitter.com/go/hkexsh/logger.LogDebug" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.reqTunnel" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.launchTuns" -> "blitter.com/go/hkexsh/hkexsh.reqTunnel" [ ]
+ "blitter.com/go/hkexsh/hkexsh.rejectUserMsg" -> "blitter.com/go/hkexsh/spinsult.GetSentence" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs" [ ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/logger.New" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexnet.Init" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexnet.Dial" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).Close" [ color="saddlebrown" arrowhead="normalnoneodiamond" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "github.com/mattn/go-isatty.IsTerminal" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh.MakeRaw" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main$1" -> "blitter.com/go/hkexsh.Restore" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.main$1" [ arrowhead="normalnoneodiamond" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh.ReadPassword" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh.NewSession" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh.Session).Op" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh.Session).Who" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh.Session).ConnHost" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh.Session).TermType" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh.Session).Cmd" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh.Session).AuthCookie" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh/hkexnet.Conn).Read" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.rejectUserMsg" [ ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh.Session).SetStatus" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ color="saddlebrown" arrowhead="normalnoneodiamond" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main$2" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.main$2" [ arrowhead="normalnoneodot" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.launchTuns" [ ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode$1" -> "blitter.com/go/hkexsh.Restore" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode$1" -> "(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode$1" -> "(*blitter.com/go/hkexsh.Session).SetStatus" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode" -> "blitter.com/go/hkexsh/hkexsh.doShellMode$1" [ arrowhead="normalnoneodot" ]
+ "blitter.com/go/hkexsh/hkexsh.handleTermResizes$1" -> "blitter.com/go/hkexsh/hkexsh.GetSize" [ ]
+ "blitter.com/go/hkexsh/hkexsh.handleTermResizes$1" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.handleTermResizes" -> "blitter.com/go/hkexsh/hkexsh.handleTermResizes$1" [ arrowhead="normalnoneodot" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode" -> "blitter.com/go/hkexsh/hkexsh.handleTermResizes" [ ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode$2" -> "blitter.com/go/hkexsh/hkexsh.doShellMode$2$1" [ ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode$2" -> "blitter.com/go/hkexsh.Restore" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doShellMode" -> "blitter.com/go/hkexsh/hkexsh.doShellMode$2" [ arrowhead="normalnoneodot" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.doShellMode" [ ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh.Session).Status" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doCopyMode" -> "(blitter.com/go/hkexsh.Session).Cmd" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doCopyMode" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doCopyMode" -> "(blitter.com/go/hkexsh/hkexnet.Conn).Read" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doCopyMode" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.doCopyMode" -> "(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.doCopyMode" [ ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh.Restore" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.UsageShell" [ style="dashed" ]
+ "blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.UsageCp" [ style="dashed" ]
+}
diff --git a/hkexsh/hkexsh-vis.gv.svg b/hkexsh/hkexsh-vis.gv.svg
new file mode 100644
index 0000000..e9124db
--- /dev/null
+++ b/hkexsh/hkexsh-vis.gv.svg
@@ -0,0 +1,701 @@
+
+
+
+
+
diff --git a/hkexshd/Makefile b/hkexshd/Makefile
index 32000d7..613282b 100644
--- a/hkexshd/Makefile
+++ b/hkexshd/Makefile
@@ -1,5 +1,6 @@
-.PHONY: clean all
+.PHONY: clean all vis
+EXTPKGS = binary,bytes,crypto,encoding,errors,flag,fmt,internal,io,log,net,os,path,runtime,time,strings,sync,syscall
EXE = $(notdir $(shell pwd))
all:
@@ -8,3 +9,6 @@ all:
clean:
$(RM) $(EXE) $(EXE).exe
+vis:
+ go-callvis -skipbrowser -svg -output hkexshd-vis -ignore $(EXTPKGS) -group pkg,type .
+
diff --git a/hkexshd/hkexshd-vis.gv b/hkexshd/hkexshd-vis.gv
new file mode 100755
index 0000000..1962b31
--- /dev/null
+++ b/hkexshd/hkexshd-vis.gv
@@ -0,0 +1,279 @@
+digraph gocallvis {
+ label="blitter.com/go/hkexsh/hkexshd";
+ labeljust="l";
+ fontname="Arial";
+ fontsize="14";
+ rankdir="LR";
+ bgcolor="lightgray";
+ style="solid";
+ penwidth="0.5";
+ pad="0.0";
+ nodesep="0.35";
+
+ node [shape="ellipse" style="filled" fillcolor="honeydew" fontname="Verdana" penwidth="1.0" margin="0.05,0.0"];
+ edge [minlen="2"]
+
+ subgraph "cluster_focus" {
+ bgcolor="#e6ecfa";
+label="main";
+labelloc="t";
+labeljust="c";
+fontsize="18";
+
+ "blitter.com/go/hkexsh/hkexshd.main" [ fillcolor="lightblue" label="main" penwidth="0.5" ]
+ "blitter.com/go/hkexsh/hkexshd.main$1" [ label="main$1" style="dotted,filled" fillcolor="lightblue" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" [ fillcolor="lightblue" label="main$2" style="dotted,filled" ]
+ "blitter.com/go/hkexsh/hkexshd.GenAuthToken" [ label="GenAuthToken" penwidth="1.5" fillcolor="lightblue" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" [ fillcolor="lightblue" label="runShellAs" penwidth="0.5" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs$1" [ fillcolor="lightblue" label="runShellAs$1" style="dotted,filled" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs$2" [ fillcolor="lightblue" label="runShellAs$2" style="dotted,filled" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs$3" [ fillcolor="lightblue" label="runShellAs$3" style="dotted,filled" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs$4" [ fillcolor="lightblue" label="runShellAs$4" style="dotted,filled" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2$1" [ fillcolor="lightblue" label="main$2$1" style="dotted,filled" ]
+ "blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs" [ fillcolor="lightblue" label="runClientToServerCopyAs" penwidth="0.5" ]
+ "blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs" [ fillcolor="lightblue" label="runServerToClientCopyAs" penwidth="0.5" ]
+
+ subgraph "cluster_blitter.com/go/goutmp" {
+ URL="/?f=blitter.com/go/goutmp";
+tooltip="package: blitter.com/go/goutmp";
+fillcolor="lightyellow";
+fontname="bold";
+rank="sink";
+label="[goutmp]";
+penwidth="0.8";
+fontsize="16";
+style="filled";
+
+ "blitter.com/go/goutmp.GetHost" [ fillcolor="moccasin" label="GetHost" penwidth="1.5" ]
+ "blitter.com/go/goutmp.Put_utmp" [ fillcolor="moccasin" label="Put_utmp" penwidth="1.5" ]
+ "blitter.com/go/goutmp.Unput_utmp" [ fillcolor="moccasin" label="Unput_utmp" penwidth="1.5" ]
+ "blitter.com/go/goutmp.Put_lastlog_entry" [ fillcolor="moccasin" label="Put_lastlog_entry" penwidth="1.5" ]
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh" {
+ penwidth="0.8";
+fontsize="16";
+style="filled";
+fontname="bold";
+rank="sink";
+label="[hkexsh]";
+URL="/?f=blitter.com/go/hkexsh";
+fillcolor="lightyellow";
+tooltip="package: blitter.com/go/hkexsh";
+
+ "blitter.com/go/hkexsh.AuthUserByToken" [ fillcolor="moccasin" label="AuthUserByToken" penwidth="1.5" ]
+ "blitter.com/go/hkexsh.AuthUserByPasswd" [ fillcolor="moccasin" label="AuthUserByPasswd" penwidth="1.5" ]
+
+ subgraph "cluster_*blitter.com/go/hkexsh.Session" {
+ style="rounded,filled";
+fillcolor="wheat2";
+label="(*Session)";
+tooltip="type: *blitter.com/go/hkexsh.Session";
+penwidth="0.5";
+fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+
+ "(*blitter.com/go/hkexsh.Session).SetOp" [ label="SetOp" penwidth="1.5" fillcolor="moccasin" ]
+ "(*blitter.com/go/hkexsh.Session).SetWho" [ fillcolor="moccasin" label="SetWho" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh.Session).SetConnHost" [ fillcolor="moccasin" label="SetConnHost" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh.Session).SetTermType" [ fillcolor="moccasin" label="SetTermType" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh.Session).SetCmd" [ fillcolor="moccasin" label="SetCmd" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh.Session).SetAuthCookie" [ fillcolor="moccasin" label="SetAuthCookie" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh.Session).ClearAuthCookie" [ fillcolor="moccasin" label="ClearAuthCookie" penwidth="1.5" ]
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh.Session" {
+ fillcolor="wheat2";
+label="(Session)";
+tooltip="type: blitter.com/go/hkexsh.Session";
+penwidth="0.5";
+fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+style="rounded,filled";
+
+ "(blitter.com/go/hkexsh.Session).Op" [ fillcolor="moccasin" label="Op" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).Who" [ fillcolor="moccasin" label="Who" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).ConnHost" [ fillcolor="moccasin" label="ConnHost" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).Cmd" [ label="Cmd" penwidth="1.5" fillcolor="moccasin" ]
+ "(blitter.com/go/hkexsh.Session).AuthCookie" [ fillcolor="moccasin" label="AuthCookie" penwidth="1.5" ]
+ "(blitter.com/go/hkexsh.Session).TermType" [ penwidth="1.5" fillcolor="moccasin" label="TermType" ]
+
+ }
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh/hkexnet" {
+ penwidth="0.8";
+fontsize="16";
+fontname="bold";
+rank="sink";
+tooltip="package: blitter.com/go/hkexsh/hkexnet";
+style="filled";
+fillcolor="lightyellow";
+label="[hkexnet]";
+URL="/?f=blitter.com/go/hkexsh/hkexnet";
+
+ "blitter.com/go/hkexsh/hkexnet.Init" [ fillcolor="moccasin" label="Init" penwidth="1.5" ]
+ "blitter.com/go/hkexsh/hkexnet.Listen" [ label="Listen" penwidth="1.5" fillcolor="moccasin" ]
+
+ subgraph "cluster_*blitter.com/go/hkexsh/hkexnet.Conn" {
+ style="rounded,filled";
+fillcolor="wheat2";
+label="(*Conn)";
+tooltip="type: *blitter.com/go/hkexsh/hkexnet.Conn";
+penwidth="0.5";
+fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ fillcolor="moccasin" label="SetupChaff" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).Close" [ label="Close" penwidth="1.5" fillcolor="moccasin" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).RemoteAddr" [ fillcolor="moccasin" label="RemoteAddr" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ penwidth="1.5" fillcolor="moccasin" label="EnableChaff" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ fillcolor="moccasin" label="DisableChaff" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ label="ShutdownChaff" penwidth="1.5" fillcolor="moccasin" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus" [ fillcolor="moccasin" label="SetStatus" penwidth="1.5" ]
+ "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ label="WritePacket" penwidth="1.5" fillcolor="moccasin" ]
+
+ }
+
+ subgraph "cluster_*blitter.com/go/hkexsh/hkexnet.HKExListener" {
+ tooltip="type: *blitter.com/go/hkexsh/hkexnet.HKExListener";
+penwidth="0.5";
+fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+style="rounded,filled";
+fillcolor="wheat2";
+label="(*HKExListener)";
+
+ "(*blitter.com/go/hkexsh/hkexnet.HKExListener).Accept" [ fillcolor="moccasin" label="Accept" penwidth="1.5" ]
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh/hkexnet.Conn" {
+ tooltip="type: blitter.com/go/hkexsh/hkexnet.Conn";
+penwidth="0.5";
+fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+style="rounded,filled";
+fillcolor="wheat2";
+label="(Conn)";
+
+ "(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ fillcolor="moccasin" label="Write" penwidth="1.5" ]
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh/hkexnet.HKExListener" {
+ fontsize="15";
+fontcolor="#222222";
+labelloc="b";
+style="rounded,filled";
+fillcolor="wheat2";
+label="(HKExListener)";
+tooltip="type: blitter.com/go/hkexsh/hkexnet.HKExListener";
+penwidth="0.5";
+
+ "(blitter.com/go/hkexsh/hkexnet.HKExListener).Close" [ fillcolor="moccasin" label="Close" penwidth="1.5" ]
+
+ }
+
+ }
+
+ subgraph "cluster_blitter.com/go/hkexsh/logger" {
+ label="[logger]";
+tooltip="package: blitter.com/go/hkexsh/logger";
+rank="sink";
+fontsize="16";
+style="filled";
+fillcolor="lightyellow";
+fontname="bold";
+URL="/?f=blitter.com/go/hkexsh/logger";
+penwidth="0.8";
+
+ "blitter.com/go/hkexsh/logger.New" [ penwidth="1.5" fillcolor="moccasin" label="New" ]
+ "blitter.com/go/hkexsh/logger.LogNotice" [ fillcolor="moccasin" label="LogNotice" penwidth="1.5" ]
+ "blitter.com/go/hkexsh/logger.LogErr" [ fillcolor="moccasin" label="LogErr" penwidth="1.5" ]
+
+ }
+
+ subgraph "cluster_github.com/kr/pty" {
+ tooltip="package: github.com/kr/pty";
+fontsize="16";
+fontname="bold";
+label="[pty]";
+URL="/?f=github.com/kr/pty";
+penwidth="0.8";
+style="filled";
+fillcolor="lightyellow";
+rank="sink";
+
+ "github.com/kr/pty.Start" [ penwidth="1.5" fillcolor="moccasin" label="Start" ]
+ "github.com/kr/pty.Setsize" [ fillcolor="moccasin" label="Setsize" penwidth="1.5" ]
+
+ }
+
+ }
+
+ "blitter.com/go/hkexsh/hkexshd.main" -> "blitter.com/go/hkexsh/logger.New" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main" -> "blitter.com/go/hkexsh/hkexnet.Init" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$1" -> "blitter.com/go/hkexsh/logger.LogNotice" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main" -> "blitter.com/go/hkexsh/hkexshd.main$1" [ arrowhead="normalnoneodot" ]
+ "blitter.com/go/hkexsh/hkexshd.main" -> "blitter.com/go/hkexsh/hkexnet.Listen" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main" -> "(blitter.com/go/hkexsh/hkexnet.HKExListener).Close" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main" -> "(*blitter.com/go/hkexsh/hkexnet.HKExListener).Accept" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).Close" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh.Session).SetOp" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh.Session).SetWho" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh.Session).SetConnHost" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh.Session).SetTermType" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh.Session).SetCmd" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh.Session).SetAuthCookie" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(blitter.com/go/hkexsh.Session).Op" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(blitter.com/go/hkexsh.Session).Who" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(blitter.com/go/hkexsh.Session).ConnHost" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(blitter.com/go/hkexsh.Session).Cmd" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(blitter.com/go/hkexsh.Session).AuthCookie" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh.AuthUserByToken" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh.Session).ClearAuthCookie" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh.AuthUserByPasswd" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/logger.LogNotice" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).RemoteAddr" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/goutmp.GetHost" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/hkexshd.GenAuthToken" [ ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(blitter.com/go/hkexsh.Session).TermType" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "github.com/kr/pty.Start" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$1" [ arrowhead="normalnoneodiamond" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs$2" -> "github.com/kr/pty.Setsize" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$2" [ arrowhead="normalnoneodot" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$3" [ arrowhead="normalnoneodot" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$4" [ arrowhead="normalnoneodot" ]
+ "blitter.com/go/hkexsh/hkexshd.runShellAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/hkexshd.runShellAs" [ ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/logger.LogErr" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/goutmp.Put_utmp" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2$1" -> "blitter.com/go/goutmp.Unput_utmp" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/hkexshd.main$2$1" [ arrowhead="normalnoneodiamond" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/goutmp.Put_lastlog_entry" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs" [ ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
+ "blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs" [ ]
+ "blitter.com/go/hkexsh/hkexshd.main" -> "blitter.com/go/hkexsh/hkexshd.main$2" [ arrowhead="normalnoneodot" ]
+}
diff --git a/hkexshd/hkexshd-vis.gv.svg b/hkexshd/hkexshd-vis.gv.svg
new file mode 100644
index 0000000..9d89f90
--- /dev/null
+++ b/hkexshd/hkexshd-vis.gv.svg
@@ -0,0 +1,767 @@
+
+
+
+
+