]> git.feebdaed.xyz Git - linuxyz.git/commitdiff
move go
authorseantywork <seantywork@gmail.com>
Fri, 21 Nov 2025 03:38:31 +0000 (03:38 +0000)
committerseantywork <seantywork@gmail.com>
Fri, 21 Nov 2025 03:38:31 +0000 (03:38 +0000)
297 files changed:
0xetc/0xgo/automation/main.go [new file with mode: 0644]
0xetc/0xgo/binary/Makefile [new file with mode: 0644]
0xetc/0xgo/binary/main.go [new file with mode: 0644]
0xetc/0xgo/c-lib/Makefile [new file with mode: 0644]
0xetc/0xgo/c-lib/go2c/Makefile [new file with mode: 0644]
0xetc/0xgo/c-lib/go2c/go2c.h [new file with mode: 0644]
0xetc/0xgo/c-lib/go2c/main.go [new file with mode: 0644]
0xetc/0xgo/c-lib/main.go [new file with mode: 0644]
0xetc/0xgo/crawler/main.go [new file with mode: 0644]
0xetc/0xgo/crypt/Makefile [new file with mode: 0644]
0xetc/0xgo/crypt/asym/asym.go [new file with mode: 0644]
0xetc/0xgo/crypt/main.go [new file with mode: 0644]
0xetc/0xgo/crypt/sym/sym.go [new file with mode: 0644]
0xetc/0xgo/etcd-query/.gitignore [new file with mode: 0644]
0xetc/0xgo/etcd-query/core/modules.go [new file with mode: 0644]
0xetc/0xgo/etcd-query/docker-compose.yaml [new file with mode: 0644]
0xetc/0xgo/etcd-query/main.go [new file with mode: 0644]
0xetc/0xgo/fault/.gitignore [new file with mode: 0644]
0xetc/0xgo/fault/2504-03.xyz.md [new file with mode: 0644]
0xetc/0xgo/fault/Makefile [new file with mode: 0644]
0xetc/0xgo/fault/main.go [new file with mode: 0644]
0xetc/0xgo/file-updownload/.gitignore [new file with mode: 0644]
0xetc/0xgo/file-updownload/Makefile [new file with mode: 0644]
0xetc/0xgo/file-updownload/client/main.go [new file with mode: 0644]
0xetc/0xgo/file-updownload/server/main.go [new file with mode: 0644]
0xetc/0xgo/go.sum [new file with mode: 0644]
0xetc/0xgo/graphql/Makefile [new file with mode: 0644]
0xetc/0xgo/graphql/data.json [new file with mode: 0644]
0xetc/0xgo/graphql/main.go [new file with mode: 0644]
0xetc/0xgo/graphql/types.go [new file with mode: 0644]
0xetc/0xgo/grpc/Makefile [new file with mode: 0644]
0xetc/0xgo/grpc/certgen.sh [new file with mode: 0755]
0xetc/0xgo/grpc/chatpb/chat.pb.go [new file with mode: 0644]
0xetc/0xgo/grpc/chatpb/chat.proto [new file with mode: 0644]
0xetc/0xgo/grpc/chatpb/chat_grpc.pb.go [new file with mode: 0644]
0xetc/0xgo/grpc/chatpb/protoc.sh [new file with mode: 0755]
0xetc/0xgo/grpc/client/certs/ca.pem [new file with mode: 0644]
0xetc/0xgo/grpc/client/certs/ca_priv.pem [new file with mode: 0644]
0xetc/0xgo/grpc/client/certs/ca_pub.pem [new file with mode: 0644]
0xetc/0xgo/grpc/client/main.go [new file with mode: 0644]
0xetc/0xgo/grpc/server/certs/server.csr [new file with mode: 0644]
0xetc/0xgo/grpc/server/certs/server.key [new file with mode: 0644]
0xetc/0xgo/grpc/server/certs/server.pem [new file with mode: 0644]
0xetc/0xgo/grpc/server/certs/server.pub [new file with mode: 0644]
0xetc/0xgo/grpc/server/main.go [new file with mode: 0644]
0xetc/0xgo/gsheet/.gitignore [new file with mode: 0644]
0xetc/0xgo/gsheet/Makefile [new file with mode: 0644]
0xetc/0xgo/gsheet/core/modules.go [new file with mode: 0644]
0xetc/0xgo/gsheet/main.go [new file with mode: 0644]
0xetc/0xgo/gui/main.go [new file with mode: 0644]
0xetc/0xgo/http/Makefile [new file with mode: 0644]
0xetc/0xgo/http/certgen.sh [new file with mode: 0755]
0xetc/0xgo/http/client/certs/ca.pem [new file with mode: 0644]
0xetc/0xgo/http/client/certs/ca_priv.pem [new file with mode: 0644]
0xetc/0xgo/http/client/certs/ca_pub.pem [new file with mode: 0644]
0xetc/0xgo/http/client/main.go [new file with mode: 0644]
0xetc/0xgo/http/server/certs/server.csr [new file with mode: 0644]
0xetc/0xgo/http/server/certs/server.key [new file with mode: 0644]
0xetc/0xgo/http/server/certs/server.pem [new file with mode: 0644]
0xetc/0xgo/http/server/certs/server.pub [new file with mode: 0644]
0xetc/0xgo/http/server/main.go [new file with mode: 0644]
0xetc/0xgo/http2/Makefile [new file with mode: 0644]
0xetc/0xgo/http2/certgen.sh [new file with mode: 0755]
0xetc/0xgo/http2/client/certs/ca.pem [new file with mode: 0644]
0xetc/0xgo/http2/client/certs/ca_priv.pem [new file with mode: 0644]
0xetc/0xgo/http2/client/certs/ca_pub.pem [new file with mode: 0644]
0xetc/0xgo/http2/client/main.go [new file with mode: 0644]
0xetc/0xgo/http2/server/certs/server.csr [new file with mode: 0644]
0xetc/0xgo/http2/server/certs/server.key [new file with mode: 0644]
0xetc/0xgo/http2/server/certs/server.pem [new file with mode: 0644]
0xetc/0xgo/http2/server/certs/server.pub [new file with mode: 0644]
0xetc/0xgo/http2/server/main.go [new file with mode: 0644]
0xetc/0xgo/http3/Makefile [new file with mode: 0644]
0xetc/0xgo/http3/certgen.sh [new file with mode: 0755]
0xetc/0xgo/http3/client/certs/ca.pem [new file with mode: 0644]
0xetc/0xgo/http3/client/certs/ca_priv.pem [new file with mode: 0644]
0xetc/0xgo/http3/client/certs/ca_pub.pem [new file with mode: 0644]
0xetc/0xgo/http3/client/main.go [new file with mode: 0644]
0xetc/0xgo/http3/server/certs/server.csr [new file with mode: 0644]
0xetc/0xgo/http3/server/certs/server.key [new file with mode: 0644]
0xetc/0xgo/http3/server/certs/server.pem [new file with mode: 0644]
0xetc/0xgo/http3/server/certs/server.pub [new file with mode: 0644]
0xetc/0xgo/http3/server/main.go [new file with mode: 0644]
0xetc/0xgo/mysql-query/.gitignore [new file with mode: 0644]
0xetc/0xgo/mysql-query/Dockerfile [new file with mode: 0644]
0xetc/0xgo/mysql-query/core/modules.go [new file with mode: 0644]
0xetc/0xgo/mysql-query/docker-compose.yaml [new file with mode: 0644]
0xetc/0xgo/mysql-query/init.sql [new file with mode: 0644]
0xetc/0xgo/mysql-query/main.go [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/certgen.sh [new file with mode: 0755]
0xetc/0xgo/sock-tcp-async/client/certs/ca.pem [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/client/certs/ca.srl [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/client/certs/ca_priv.pem [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/client/certs/ca_pub.pem [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/client/main.go [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/client/tls.go [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/server/certs/server.csr [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/server/certs/server.key [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/server/certs/server.pem [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/server/certs/server.pub [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/server/main.go [new file with mode: 0644]
0xetc/0xgo/sock-tcp-async/server/tls.go [new file with mode: 0644]
0xetc/0xgo/sock-tcp/certgen.sh [new file with mode: 0755]
0xetc/0xgo/sock-tcp/client/certs/ca.pem [new file with mode: 0644]
0xetc/0xgo/sock-tcp/client/certs/ca.srl [new file with mode: 0644]
0xetc/0xgo/sock-tcp/client/certs/ca_priv.pem [new file with mode: 0644]
0xetc/0xgo/sock-tcp/client/certs/ca_pub.pem [new file with mode: 0644]
0xetc/0xgo/sock-tcp/client/main.go [new file with mode: 0644]
0xetc/0xgo/sock-tcp/client/tls.go [new file with mode: 0644]
0xetc/0xgo/sock-tcp/server/certs/server.csr [new file with mode: 0644]
0xetc/0xgo/sock-tcp/server/certs/server.key [new file with mode: 0644]
0xetc/0xgo/sock-tcp/server/certs/server.pem [new file with mode: 0644]
0xetc/0xgo/sock-tcp/server/certs/server.pub [new file with mode: 0644]
0xetc/0xgo/sock-tcp/server/main.go [new file with mode: 0644]
0xetc/0xgo/sock-tcp/server/tls.go [new file with mode: 0644]
0xetc/0xgo/sock-udp/Makefile [new file with mode: 0644]
0xetc/0xgo/sock-udp/client/main.go [new file with mode: 0644]
0xetc/0xgo/sock-udp/server/main.go [new file with mode: 0644]
0xetc/0xgo/sock-unix/Makefile [new file with mode: 0644]
0xetc/0xgo/sock-unix/client/main.go [new file with mode: 0644]
0xetc/0xgo/sock-unix/server/main.go [new file with mode: 0644]
0xetc/0xgo/util/util.go [new file with mode: 0644]
0xetc/0xgo/webrtc/Makefile [new file with mode: 0644]
0xetc/0xgo/webrtc/config.yaml [new file with mode: 0644]
0xetc/0xgo/webrtc/main.go [new file with mode: 0644]
0xetc/0xgo/webrtc/public/js/room.js [new file with mode: 0644]
0xetc/0xgo/webrtc/public/js/rtmp.js [new file with mode: 0644]
0xetc/0xgo/webrtc/setup.sh [new file with mode: 0755]
0xetc/0xgo/webrtc/turn.md [new file with mode: 0644]
0xetc/0xgo/webrtc/view/index.html [new file with mode: 0644]
0xetc/0xgo/webrtc/view/room.html [new file with mode: 0644]
0xetc/0xgo/webrtc/view/rtmp.html [new file with mode: 0644]
0xetc/0xgo/webrtc/webrtc/com.go [new file with mode: 0644]
0xetc/0xgo/webrtc/webrtc/peers.go [new file with mode: 0644]
0xetc/0xgo/webrtc/webrtc/rtmp.go [new file with mode: 0644]
0xetc/0xgo/webrtc/webrtc/stream.go [new file with mode: 0644]
0xetc/0xgo/webrtc/webrtc/utils.go [new file with mode: 0644]
0xetc/0xgo/websocket/Makefile [new file with mode: 0644]
0xetc/0xgo/websocket/certgen.sh [new file with mode: 0755]
0xetc/0xgo/websocket/client/certs/ca.pem [new file with mode: 0644]
0xetc/0xgo/websocket/client/certs/ca_priv.pem [new file with mode: 0644]
0xetc/0xgo/websocket/client/certs/ca_pub.pem [new file with mode: 0644]
0xetc/0xgo/websocket/client/main.go [new file with mode: 0644]
0xetc/0xgo/websocket/server/certs/server.csr [new file with mode: 0644]
0xetc/0xgo/websocket/server/certs/server.key [new file with mode: 0644]
0xetc/0xgo/websocket/server/certs/server.pem [new file with mode: 0644]
0xetc/0xgo/websocket/server/certs/server.pub [new file with mode: 0644]
0xetc/0xgo/websocket/server/main.go [new file with mode: 0644]
0xgo/automation/main.go [deleted file]
0xgo/binary/Makefile [deleted file]
0xgo/binary/main.go [deleted file]
0xgo/c-lib/Makefile [deleted file]
0xgo/c-lib/go2c/Makefile [deleted file]
0xgo/c-lib/go2c/go2c.h [deleted file]
0xgo/c-lib/go2c/main.go [deleted file]
0xgo/c-lib/main.go [deleted file]
0xgo/crawler/main.go [deleted file]
0xgo/crypt/Makefile [deleted file]
0xgo/crypt/asym/asym.go [deleted file]
0xgo/crypt/main.go [deleted file]
0xgo/crypt/sym/sym.go [deleted file]
0xgo/etcd-query/.gitignore [deleted file]
0xgo/etcd-query/core/modules.go [deleted file]
0xgo/etcd-query/docker-compose.yaml [deleted file]
0xgo/etcd-query/main.go [deleted file]
0xgo/fault/.gitignore [deleted file]
0xgo/fault/2504-03.xyz.md [deleted file]
0xgo/fault/Makefile [deleted file]
0xgo/fault/main.go [deleted file]
0xgo/file-updownload/.gitignore [deleted file]
0xgo/file-updownload/Makefile [deleted file]
0xgo/file-updownload/client/main.go [deleted file]
0xgo/file-updownload/server/main.go [deleted file]
0xgo/go.mod [deleted file]
0xgo/go.sum [deleted file]
0xgo/graphql/Makefile [deleted file]
0xgo/graphql/data.json [deleted file]
0xgo/graphql/main.go [deleted file]
0xgo/graphql/types.go [deleted file]
0xgo/grpc/Makefile [deleted file]
0xgo/grpc/certgen.sh [deleted file]
0xgo/grpc/chatpb/chat.pb.go [deleted file]
0xgo/grpc/chatpb/chat.proto [deleted file]
0xgo/grpc/chatpb/chat_grpc.pb.go [deleted file]
0xgo/grpc/chatpb/protoc.sh [deleted file]
0xgo/grpc/client/certs/ca.pem [deleted file]
0xgo/grpc/client/certs/ca_priv.pem [deleted file]
0xgo/grpc/client/certs/ca_pub.pem [deleted file]
0xgo/grpc/client/main.go [deleted file]
0xgo/grpc/server/certs/server.csr [deleted file]
0xgo/grpc/server/certs/server.key [deleted file]
0xgo/grpc/server/certs/server.pem [deleted file]
0xgo/grpc/server/certs/server.pub [deleted file]
0xgo/grpc/server/main.go [deleted file]
0xgo/gsheet/.gitignore [deleted file]
0xgo/gsheet/Makefile [deleted file]
0xgo/gsheet/core/modules.go [deleted file]
0xgo/gsheet/main.go [deleted file]
0xgo/gui/main.go [deleted file]
0xgo/http/Makefile [deleted file]
0xgo/http/certgen.sh [deleted file]
0xgo/http/client/certs/ca.pem [deleted file]
0xgo/http/client/certs/ca_priv.pem [deleted file]
0xgo/http/client/certs/ca_pub.pem [deleted file]
0xgo/http/client/main.go [deleted file]
0xgo/http/server/certs/server.csr [deleted file]
0xgo/http/server/certs/server.key [deleted file]
0xgo/http/server/certs/server.pem [deleted file]
0xgo/http/server/certs/server.pub [deleted file]
0xgo/http/server/main.go [deleted file]
0xgo/http2/Makefile [deleted file]
0xgo/http2/certgen.sh [deleted file]
0xgo/http2/client/certs/ca.pem [deleted file]
0xgo/http2/client/certs/ca_priv.pem [deleted file]
0xgo/http2/client/certs/ca_pub.pem [deleted file]
0xgo/http2/client/main.go [deleted file]
0xgo/http2/server/certs/server.csr [deleted file]
0xgo/http2/server/certs/server.key [deleted file]
0xgo/http2/server/certs/server.pem [deleted file]
0xgo/http2/server/certs/server.pub [deleted file]
0xgo/http2/server/main.go [deleted file]
0xgo/http3/Makefile [deleted file]
0xgo/http3/certgen.sh [deleted file]
0xgo/http3/client/certs/ca.pem [deleted file]
0xgo/http3/client/certs/ca_priv.pem [deleted file]
0xgo/http3/client/certs/ca_pub.pem [deleted file]
0xgo/http3/client/main.go [deleted file]
0xgo/http3/server/certs/server.csr [deleted file]
0xgo/http3/server/certs/server.key [deleted file]
0xgo/http3/server/certs/server.pem [deleted file]
0xgo/http3/server/certs/server.pub [deleted file]
0xgo/http3/server/main.go [deleted file]
0xgo/mysql-query/.gitignore [deleted file]
0xgo/mysql-query/Dockerfile [deleted file]
0xgo/mysql-query/core/modules.go [deleted file]
0xgo/mysql-query/docker-compose.yaml [deleted file]
0xgo/mysql-query/init.sql [deleted file]
0xgo/mysql-query/main.go [deleted file]
0xgo/sock-tcp-async/certgen.sh [deleted file]
0xgo/sock-tcp-async/client/certs/ca.pem [deleted file]
0xgo/sock-tcp-async/client/certs/ca.srl [deleted file]
0xgo/sock-tcp-async/client/certs/ca_priv.pem [deleted file]
0xgo/sock-tcp-async/client/certs/ca_pub.pem [deleted file]
0xgo/sock-tcp-async/client/main.go [deleted file]
0xgo/sock-tcp-async/client/tls.go [deleted file]
0xgo/sock-tcp-async/server/certs/server.csr [deleted file]
0xgo/sock-tcp-async/server/certs/server.key [deleted file]
0xgo/sock-tcp-async/server/certs/server.pem [deleted file]
0xgo/sock-tcp-async/server/certs/server.pub [deleted file]
0xgo/sock-tcp-async/server/main.go [deleted file]
0xgo/sock-tcp-async/server/tls.go [deleted file]
0xgo/sock-tcp/certgen.sh [deleted file]
0xgo/sock-tcp/client/certs/ca.pem [deleted file]
0xgo/sock-tcp/client/certs/ca.srl [deleted file]
0xgo/sock-tcp/client/certs/ca_priv.pem [deleted file]
0xgo/sock-tcp/client/certs/ca_pub.pem [deleted file]
0xgo/sock-tcp/client/main.go [deleted file]
0xgo/sock-tcp/client/tls.go [deleted file]
0xgo/sock-tcp/server/certs/server.csr [deleted file]
0xgo/sock-tcp/server/certs/server.key [deleted file]
0xgo/sock-tcp/server/certs/server.pem [deleted file]
0xgo/sock-tcp/server/certs/server.pub [deleted file]
0xgo/sock-tcp/server/main.go [deleted file]
0xgo/sock-tcp/server/tls.go [deleted file]
0xgo/sock-udp/Makefile [deleted file]
0xgo/sock-udp/client/main.go [deleted file]
0xgo/sock-udp/server/main.go [deleted file]
0xgo/sock-unix/Makefile [deleted file]
0xgo/sock-unix/client/main.go [deleted file]
0xgo/sock-unix/server/main.go [deleted file]
0xgo/util/util.go [deleted file]
0xgo/webrtc/Makefile [deleted file]
0xgo/webrtc/config.yaml [deleted file]
0xgo/webrtc/main.go [deleted file]
0xgo/webrtc/public/js/room.js [deleted file]
0xgo/webrtc/public/js/rtmp.js [deleted file]
0xgo/webrtc/setup.sh [deleted file]
0xgo/webrtc/turn.md [deleted file]
0xgo/webrtc/view/index.html [deleted file]
0xgo/webrtc/view/room.html [deleted file]
0xgo/webrtc/view/rtmp.html [deleted file]
0xgo/webrtc/webrtc/com.go [deleted file]
0xgo/webrtc/webrtc/peers.go [deleted file]
0xgo/webrtc/webrtc/rtmp.go [deleted file]
0xgo/webrtc/webrtc/stream.go [deleted file]
0xgo/webrtc/webrtc/utils.go [deleted file]
0xgo/websocket/Makefile [deleted file]
0xgo/websocket/certgen.sh [deleted file]
0xgo/websocket/client/certs/ca.pem [deleted file]
0xgo/websocket/client/certs/ca_priv.pem [deleted file]
0xgo/websocket/client/certs/ca_pub.pem [deleted file]
0xgo/websocket/client/main.go [deleted file]
0xgo/websocket/server/certs/server.csr [deleted file]
0xgo/websocket/server/certs/server.key [deleted file]
0xgo/websocket/server/certs/server.pem [deleted file]
0xgo/websocket/server/certs/server.pub [deleted file]
0xgo/websocket/server/main.go [deleted file]

diff --git a/0xetc/0xgo/automation/main.go b/0xetc/0xgo/automation/main.go
new file mode 100644 (file)
index 0000000..77c0f96
--- /dev/null
@@ -0,0 +1,107 @@
+package main
+
+import (
+       "fmt"
+       "strconv"
+
+       "github.com/go-vgo/robotgo"
+       "github.com/vcaesar/imgo"
+)
+
+func Wheel() {
+
+       robotgo.MouseSleep = 100
+
+       robotgo.ScrollDir(10, "up")
+       robotgo.ScrollDir(20, "right")
+
+       robotgo.Scroll(0, -10)
+       robotgo.Scroll(100, 0)
+
+       robotgo.MilliSleep(100)
+       robotgo.ScrollSmooth(-10, 6)
+       // robotgo.ScrollRelative(10, -100)
+
+       robotgo.Move(10, 20)
+       robotgo.MoveRelative(0, -10)
+       robotgo.DragSmooth(10, 10)
+
+       robotgo.Click("wheelRight")
+       robotgo.Click("left", true)
+       robotgo.MoveSmooth(100, 200, 1.0, 10.0)
+
+       robotgo.Toggle("left")
+       robotgo.Toggle("left", "up")
+
+}
+
+func Keyboard() {
+
+       robotgo.TypeStr("Hello World")
+       robotgo.TypeStr("だんしゃり", 0, 1)
+       // robotgo.TypeStr("テストする")
+
+       robotgo.TypeStr("Hi, Seattle space needle, Golden gate bridge, One world trade center.")
+       robotgo.TypeStr("Hi galaxy, hi stars, hi MT.Rainier, hi sea. こんにちは世界.")
+       robotgo.Sleep(1)
+
+       // ustr := uint32(robotgo.CharCodeAt("Test", 0))
+       // robotgo.UnicodeType(ustr)
+
+       robotgo.KeySleep = 100
+       robotgo.KeyTap("enter")
+       // robotgo.TypeStr("en")
+       robotgo.KeyTap("i", "alt", "cmd")
+
+       arr := []string{"alt", "cmd"}
+       robotgo.KeyTap("i", arr)
+
+       robotgo.MilliSleep(100)
+       robotgo.KeyToggle("a")
+       robotgo.KeyToggle("a", "up")
+
+       robotgo.WriteAll("Test")
+       text, err := robotgo.ReadAll()
+       if err == nil {
+               fmt.Println(text)
+       }
+
+}
+
+func Screenshot() {
+       x, y := robotgo.Location()
+       fmt.Println("pos: ", x, y)
+
+       color := robotgo.GetPixelColor(100, 200)
+       fmt.Println("color---- ", color)
+
+       sx, sy := robotgo.GetScreenSize()
+       fmt.Println("get screen size: ", sx, sy)
+
+       bit := robotgo.CaptureScreen(10, 10, 30, 30)
+       defer robotgo.FreeBitmap(bit)
+
+       img := robotgo.ToImage(bit)
+       imgo.Save("test.png", img)
+
+       num := robotgo.DisplaysNum()
+       for i := 0; i < num; i++ {
+               robotgo.DisplayID = i
+               img1, _ := robotgo.CaptureImg()
+               path1 := "save_" + strconv.Itoa(i)
+               robotgo.Save(img1, path1+".png")
+               robotgo.SaveJpeg(img1, path1+".jpeg", 50)
+
+               img2, _ := robotgo.CaptureImg(10, 10, 20, 20)
+               robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png")
+       }
+}
+
+func main() {
+
+       //Wheel()
+
+       Keyboard()
+
+       //Screenshot()
+}
diff --git a/0xetc/0xgo/binary/Makefile b/0xetc/0xgo/binary/Makefile
new file mode 100644 (file)
index 0000000..021938f
--- /dev/null
@@ -0,0 +1,2 @@
+all:
+       go build -o test.out .
\ No newline at end of file
diff --git a/0xetc/0xgo/binary/main.go b/0xetc/0xgo/binary/main.go
new file mode 100644 (file)
index 0000000..1e9566c
--- /dev/null
@@ -0,0 +1,136 @@
+package main
+
+import (
+       "encoding/binary"
+       "fmt"
+       "net"
+       "unsafe"
+)
+
+/*
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+void print_raw_uint32(int value){
+
+       uint32_t uval = (uint32_t)value;
+
+       printf("uval: %u\n", uval);
+
+       uint8_t arr[4] = {0};
+
+       memcpy(arr, &uval, 4);
+
+       for(int i = 0; i < 4; i++){
+
+               printf("%x ", arr[i]);
+
+       }
+
+       printf("\n");
+
+}
+
+*/
+import "C"
+
+func main() {
+
+       var i uint32 = 0x0100
+       ptr := unsafe.Pointer(&i)
+       if 0x01 == *(*byte)(ptr) {
+               fmt.Println("Big Endian")
+       } else if 0x00 == *(*byte)(ptr) {
+               fmt.Println("Little Endian")
+       }
+
+       ipstring := "10.1.10.2"
+
+       ipbytes := net.ParseIP(ipstring).To4()
+
+       fmt.Println(ipbytes)
+
+       testle := binary.LittleEndian.Uint32(ipbytes)
+
+       testbe := binary.BigEndian.Uint32(ipbytes)
+
+       testne := binary.NativeEndian.Uint32(ipbytes)
+
+       fmt.Println("le==========")
+
+       C.print_raw_uint32(C.int(testle))
+
+       fmt.Println("be==========")
+
+       C.print_raw_uint32(C.int(testbe))
+
+       fmt.Println("ne==========")
+
+       C.print_raw_uint32(C.int(testne))
+
+       fmt.Printf("le: %d, be: %d, ne: %d\n", testle, testbe, testne)
+
+       lebytes := make([]byte, 4)
+       bebytes := make([]byte, 4)
+       nebytes := make([]byte, 4)
+
+       binary.LittleEndian.PutUint32(lebytes, testle)
+
+       binary.BigEndian.PutUint32(bebytes, testbe)
+
+       binary.NativeEndian.PutUint32(nebytes, testne)
+
+       fmt.Printf("%d %d %d %d\n", lebytes[0], lebytes[1], lebytes[2], lebytes[3])
+
+       fmt.Printf("%d %d %d %d\n", bebytes[0], bebytes[1], bebytes[2], bebytes[3])
+
+       fmt.Printf("%d %d %d %d\n", nebytes[0], nebytes[1], nebytes[2], nebytes[3])
+
+       testle = binary.LittleEndian.Uint32(lebytes)
+
+       testbe = binary.BigEndian.Uint32(bebytes)
+
+       testne = binary.NativeEndian.Uint32(nebytes)
+
+       fmt.Printf("le: %d, be: %d, ne: %d\n", testle, testbe, testne)
+
+       fmt.Println("ntohl")
+
+       in := testbe
+
+       fmt.Printf("in: %d\n", in)
+
+       C.print_raw_uint32(C.int(in))
+
+       tmp := make([]byte, 4)
+
+       binary.BigEndian.PutUint32(tmp, in)
+
+       out := binary.LittleEndian.Uint32(tmp)
+
+       fmt.Printf("out: %d\n", out)
+
+       C.print_raw_uint32(C.int(out))
+
+       fmt.Println("htonl")
+
+       in = out
+
+       fmt.Printf("in: %d\n", in)
+
+       C.print_raw_uint32(C.int(in))
+
+       tmp = make([]byte, 4)
+
+       binary.LittleEndian.PutUint32(tmp, in)
+
+       out = binary.BigEndian.Uint32(tmp)
+
+       fmt.Printf("out: %d\n", out)
+
+       C.print_raw_uint32(C.int(out))
+}
diff --git a/0xetc/0xgo/c-lib/Makefile b/0xetc/0xgo/c-lib/Makefile
new file mode 100644 (file)
index 0000000..691f558
--- /dev/null
@@ -0,0 +1,8 @@
+all:
+
+       go build -o c2go.out .
+
+
+clean:
+
+       rm -r *.out
\ No newline at end of file
diff --git a/0xetc/0xgo/c-lib/go2c/Makefile b/0xetc/0xgo/c-lib/go2c/Makefile
new file mode 100644 (file)
index 0000000..143088c
--- /dev/null
@@ -0,0 +1,7 @@
+all:
+
+       go build -buildmode=c-shared -o go2c.so .
+
+clean:
+
+       rm -r *.h *.so
\ No newline at end of file
diff --git a/0xetc/0xgo/c-lib/go2c/go2c.h b/0xetc/0xgo/c-lib/go2c/go2c.h
new file mode 100644 (file)
index 0000000..49ec1d9
--- /dev/null
@@ -0,0 +1,84 @@
+/* Code generated by cmd/cgo; DO NOT EDIT. */
+
+/* package github.com/seantywork/go/c-lib/go2c */
+
+
+#line 1 "cgo-builtin-export-prolog"
+
+#include <stddef.h>
+
+#ifndef GO_CGO_EXPORT_PROLOGUE_H
+#define GO_CGO_EXPORT_PROLOGUE_H
+
+#ifndef GO_CGO_GOSTRING_TYPEDEF
+typedef struct { const char *p; ptrdiff_t n; } _GoString_;
+#endif
+
+#endif
+
+/* Start of preamble from import "C" comments.  */
+
+
+
+
+/* End of preamble from import "C" comments.  */
+
+
+/* Start of boilerplate cgo prologue.  */
+#line 1 "cgo-gcc-export-header-prolog"
+
+#ifndef GO_CGO_PROLOGUE_H
+#define GO_CGO_PROLOGUE_H
+
+typedef signed char GoInt8;
+typedef unsigned char GoUint8;
+typedef short GoInt16;
+typedef unsigned short GoUint16;
+typedef int GoInt32;
+typedef unsigned int GoUint32;
+typedef long long GoInt64;
+typedef unsigned long long GoUint64;
+typedef GoInt64 GoInt;
+typedef GoUint64 GoUint;
+typedef size_t GoUintptr;
+typedef float GoFloat32;
+typedef double GoFloat64;
+#ifdef _MSC_VER
+#include <complex.h>
+typedef _Fcomplex GoComplex64;
+typedef _Dcomplex GoComplex128;
+#else
+typedef float _Complex GoComplex64;
+typedef double _Complex GoComplex128;
+#endif
+
+/*
+  static assertion to make sure the file is being used on architecture
+  at least with matching size of GoInt.
+*/
+typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];
+
+#ifndef GO_CGO_GOSTRING_TYPEDEF
+typedef _GoString_ GoString;
+#endif
+typedef void *GoMap;
+typedef void *GoChan;
+typedef struct { void *t; void *v; } GoInterface;
+typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
+
+#endif
+
+/* End of boilerplate cgo prologue.  */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern GoInt Add(GoInt a, GoInt b);
+extern GoFloat64 Cosine(GoFloat64 x);
+extern void Sort(GoSlice vals);
+extern GoInt Log(GoString msg);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/0xetc/0xgo/c-lib/go2c/main.go b/0xetc/0xgo/c-lib/go2c/main.go
new file mode 100644 (file)
index 0000000..974b1dc
--- /dev/null
@@ -0,0 +1,39 @@
+package main
+
+import "C"
+
+import (
+       "fmt"
+       "math"
+       "sort"
+       "sync"
+)
+
+var count int
+var mtx sync.Mutex
+
+//export Add
+func Add(a, b int) int {
+       return a + b
+}
+
+//export Cosine
+func Cosine(x float64) float64 {
+       return math.Cos(x)
+}
+
+//export Sort
+func Sort(vals []int) {
+       sort.Ints(vals)
+}
+
+//export Log
+func Log(msg string) int {
+       mtx.Lock()
+       defer mtx.Unlock()
+       fmt.Println(msg)
+       count++
+       return count
+}
+
+func main() {}
diff --git a/0xetc/0xgo/c-lib/main.go b/0xetc/0xgo/c-lib/main.go
new file mode 100644 (file)
index 0000000..0205bc2
--- /dev/null
@@ -0,0 +1,35 @@
+package main
+
+/*
+#cgo CFLAGS: -g -Wall -I../../go-c-lib/c2go
+#cgo LDFLAGS: -L../../go-c-lib/c2go -Wl,-rpath=../../go-c-lib/c2go -lc2go
+#include "c2go.h"
+*/
+import "C"
+import (
+       "fmt"
+)
+
+type (
+       Person C.struct_APerson
+)
+
+func (p *Person) Name() string {
+       return C.GoString(p.name)
+}
+
+func (p *Person) LongName() string {
+       return C.GoString(p.long_name)
+}
+
+func GetPerson(name string, long_name string) *Person {
+       return (*Person)(C.get_person(C.CString(name), C.CString(long_name)))
+}
+
+func main() {
+       var f *Person
+       f = GetPerson("seanty", "work")
+       fmt.Printf("Hello Go world: My name is %s, %s.\n", C.GoString(f.name), C.GoString(f.long_name))
+
+       fmt.Printf("Hello Go world: My name is %s, %s.\n", f.Name(), f.LongName())
+}
diff --git a/0xetc/0xgo/crawler/main.go b/0xetc/0xgo/crawler/main.go
new file mode 100644 (file)
index 0000000..a0bad0e
--- /dev/null
@@ -0,0 +1,21 @@
+package main
+
+import (
+       "fmt"
+
+       colly "github.com/gocolly/colly/v2"
+)
+
+func main() {
+       c := colly.NewCollector()
+
+       c.OnHTML("a[href]", func(e *colly.HTMLElement) {
+               e.Request.Visit(e.Attr("href"))
+       })
+
+       c.OnRequest(func(r *colly.Request) {
+               fmt.Println("Visiting", r.URL)
+       })
+
+       c.Visit("http://go-colly.org/")
+}
diff --git a/0xetc/0xgo/crypt/Makefile b/0xetc/0xgo/crypt/Makefile
new file mode 100644 (file)
index 0000000..b92a1b7
--- /dev/null
@@ -0,0 +1,8 @@
+all:
+
+       go build -o test.out . 
+
+
+clean:
+
+       rm -rf *.out
\ No newline at end of file
diff --git a/0xetc/0xgo/crypt/asym/asym.go b/0xetc/0xgo/crypt/asym/asym.go
new file mode 100644 (file)
index 0000000..f1041d8
--- /dev/null
@@ -0,0 +1,357 @@
+package pki
+
+import (
+       "crypto/rand"
+       "crypto/sha512"
+       "crypto/x509/pkix"
+       "errors"
+       "fmt"
+       "log"
+       "math/big"
+       mathrand "math/rand"
+       "time"
+
+       "crypto/rsa"
+       "crypto/x509"
+       "encoding/pem"
+)
+
+type CertSet struct {
+       RootCertPEM   []byte
+       RootKeyPEM    []byte
+       RootPubPEM    []byte
+       ClientCertPEM []byte
+       ClientKeyPEM  []byte
+       ClientPubPEM  []byte
+       ServCertPEM   []byte
+       ServKeyPEM    []byte
+       ServPubPEM    []byte
+}
+
+func GenerateKeyPair(bits int) (*rsa.PrivateKey, *rsa.PublicKey, error) {
+
+       var pubkey *rsa.PublicKey
+
+       privkey, err := rsa.GenerateKey(rand.Reader, bits)
+       if err != nil {
+               return privkey, pubkey, fmt.Errorf("failed to gen key pair: %s", err.Error())
+       }
+
+       pubkey = &privkey.PublicKey
+
+       return privkey, pubkey, nil
+}
+
+func PrivateKeyToBytes(priv *rsa.PrivateKey) ([]byte, error) {
+       var ret_byte []byte
+       privBytes := pem.EncodeToMemory(
+               &pem.Block{
+                       Type:  "RSA PRIVATE KEY",
+                       Bytes: x509.MarshalPKCS1PrivateKey(priv),
+               },
+       )
+
+       if privBytes == nil {
+               return ret_byte, fmt.Errorf("failed to encode priv key to bytes: %s", "invalid")
+       }
+
+       return privBytes, nil
+}
+
+func PublicKeyToBytes(pub *rsa.PublicKey) ([]byte, error) {
+
+       var ret_byte []byte
+
+       pubASN1, err := x509.MarshalPKIXPublicKey(pub)
+       if err != nil {
+               return pubASN1, fmt.Errorf("failed to encode pub key to bytes: %s", err.Error())
+       }
+
+       pubBytes := pem.EncodeToMemory(&pem.Block{
+               Type:  "RSA PUBLIC KEY",
+               Bytes: pubASN1,
+       })
+
+       if pubBytes == nil {
+               return ret_byte, fmt.Errorf("failed to encode priv key to bytes: %s", "invalid")
+       }
+
+       return pubBytes, nil
+}
+
+func CertToBytes(crt *x509.Certificate) ([]byte, error) {
+
+       cert_b := crt.Raw
+
+       certBytes := pem.EncodeToMemory(&pem.Block{
+               Type:  "CERTIFICATE",
+               Bytes: cert_b,
+       })
+
+       if certBytes == nil {
+
+               return nil, fmt.Errorf("failed to encode cert to bytes: %s", "invalid")
+       }
+
+       return certBytes, nil
+
+}
+
+func BytesToPrivateKey(priv []byte) (*rsa.PrivateKey, error) {
+
+       var privkey *rsa.PrivateKey
+
+       block, _ := pem.Decode(priv)
+       enc := x509.IsEncryptedPEMBlock(block)
+       b := block.Bytes
+       var err error
+       if enc {
+               fmt.Println("is encrypted pem block")
+               b, err = x509.DecryptPEMBlock(block, nil)
+               if err != nil {
+                       return privkey, fmt.Errorf("failed to decode bytes to priv key: %s", err.Error())
+               }
+       }
+       key, err := x509.ParsePKCS1PrivateKey(b)
+       if err != nil {
+               return privkey, fmt.Errorf("failed to decode bytes to priv key: %s", err.Error())
+       }
+       return key, nil
+}
+
+func BytesToPublicKey(pub []byte) (*rsa.PublicKey, error) {
+
+       var pubkey *rsa.PublicKey
+
+       block, _ := pem.Decode(pub)
+       enc := x509.IsEncryptedPEMBlock(block)
+       b := block.Bytes
+       var err error
+       if enc {
+               fmt.Println("is encrypted pem block")
+               b, err = x509.DecryptPEMBlock(block, nil)
+               if err != nil {
+                       return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error())
+               }
+       }
+       ifc, err := x509.ParsePKIXPublicKey(b)
+       if err != nil {
+               return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error())
+       }
+       key, ok := ifc.(*rsa.PublicKey)
+       if !ok {
+               return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error())
+       }
+       return key, nil
+}
+
+func BytesToCert(cert []byte) (*x509.Certificate, error) {
+
+       var ret_crt *x509.Certificate
+
+       block, _ := pem.Decode(cert)
+
+       ifc, err := x509.ParseCertificate(block.Bytes)
+
+       if err != nil {
+
+               return ret_crt, fmt.Errorf("failed to decode bytes to certificate: %s", err.Error())
+       }
+
+       ret_crt = ifc
+
+       return ret_crt, nil
+}
+
+func EncryptWithPublicKey(msg []byte, pub *rsa.PublicKey) ([]byte, error) {
+       hash := sha512.New()
+       ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, pub, msg, nil)
+       if err != nil {
+               return ciphertext, fmt.Errorf("failed to encrypt with public key: %s", err.Error())
+       }
+       return ciphertext, nil
+}
+
+func DecryptWithPrivateKey(ciphertext []byte, priv *rsa.PrivateKey) ([]byte, error) {
+       hash := sha512.New()
+       plaintext, err := rsa.DecryptOAEP(hash, rand.Reader, priv, ciphertext, nil)
+       if err != nil {
+               return plaintext, fmt.Errorf("failed to decrypt with private key: %s", err.Error())
+       }
+       return plaintext, nil
+}
+
+func GetRandIntInRange(min int, max int) int {
+
+       mathrand.Seed(time.Now().UnixNano())
+
+       return mathrand.Intn(max-min+1) + min
+}
+
+func GenKeyPair(keylen int) (*rsa.PrivateKey, *rsa.PublicKey) {
+
+       bitSize := keylen
+
+       key, err := rsa.GenerateKey(rand.Reader, bitSize)
+       if err != nil {
+               panic(err)
+       }
+
+       pub := key.Public()
+
+       return key, pub.(*rsa.PublicKey)
+}
+
+func CertTemplate(cn string, validYear int) (*x509.Certificate, error) {
+       // generate a random serial number (a real cert authority would have some logic behind this)
+       serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
+       serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
+       if err != nil {
+               return nil, errors.New("failed to generate serial number: " + err.Error())
+       }
+
+       if err != nil {
+
+               return nil, fmt.Errorf("failed to gen cert tmpl: %s", err.Error())
+       }
+
+       tmpl := x509.Certificate{
+               SerialNumber:          serialNumber,
+               Subject:               pkix.Name{CommonName: cn},
+               SignatureAlgorithm:    x509.SHA256WithRSA,
+               NotBefore:             time.Now(),
+               NotAfter:              time.Now().Add(time.Hour * 24 * 30 * 12 * time.Duration(validYear)),
+               BasicConstraintsValid: true,
+               DNSNames: []string{
+                       cn,
+               },
+       }
+       return &tmpl, nil
+}
+
+func CreateCert(template, parent *x509.Certificate, pub interface{}, parentPriv interface{}) (cert *x509.Certificate, certPEM []byte, err error) {
+
+       certDER, err := x509.CreateCertificate(rand.Reader, template, parent, pub, parentPriv)
+       if err != nil {
+               return
+       }
+       // parse the resulting certificate so we can use it again
+       cert, err = x509.ParseCertificate(certDER)
+       if err != nil {
+               return
+       }
+       // PEM encode the certificate (this is a standard TLS encoding)
+       b := pem.Block{Type: "CERTIFICATE", Bytes: certDER}
+       certPEM = pem.EncodeToMemory(&b)
+
+       return
+}
+
+func NewCertsPipeline(server_name string, client_name string) *CertSet {
+       // generate a new key-pair
+       rootKey, rootPub := GenKeyPair(4096)
+
+       rootCertTmpl, err := CertTemplate("ca", 10)
+       if err != nil {
+               log.Fatalf("creating cert template: %v", err)
+       }
+
+       // this cert will be the CA that we will use to sign the server cert
+       rootCertTmpl.IsCA = true
+       // describe what the certificate will be used for
+       rootCertTmpl.KeyUsage = x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature
+       rootCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}
+
+       log.Println("----------ca cert")
+
+       rootCert, rootCertPEM, err := CreateCert(rootCertTmpl, rootCertTmpl, rootPub, rootKey)
+       if err != nil {
+               log.Fatalf("error creating cert: %v", err)
+       }
+
+       // provide the private key and the cert
+       rootKeyPEM := pem.EncodeToMemory(&pem.Block{
+               Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(rootKey),
+       })
+
+       rootPubPEM := pem.EncodeToMemory(&pem.Block{
+               Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(rootPub),
+       })
+
+       /*******************************************************************
+       Server Cert
+       *******************************************************************/
+
+       // create a key-pair for the server
+       servKey, servPub := GenKeyPair(4096)
+
+       log.Println("----------server cert")
+       // create a template for the server
+       servCertTmpl, err := CertTemplate(server_name, 1)
+       if err != nil {
+               log.Fatalf("creating cert template: %v", err)
+       }
+       servCertTmpl.KeyUsage = x509.KeyUsageDigitalSignature
+       servCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}
+
+       // create a certificate which wraps the server's public key, sign it with the root private key
+       _, servCertPEM, err := CreateCert(servCertTmpl, rootCert, servPub, rootKey)
+       if err != nil {
+               log.Fatalf("error creating cert: %v", err)
+       }
+
+       // provide the private key and the cert
+       servKeyPEM := pem.EncodeToMemory(&pem.Block{
+               Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(servKey),
+       })
+
+       servPubPEM := pem.EncodeToMemory(&pem.Block{
+               Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(servPub),
+       })
+
+       /*******************************************************************
+       Client Cert
+       *******************************************************************/
+
+       // create a key-pair for the client
+       clientKey, clientPub := GenKeyPair(4096)
+
+       log.Println("----------client cert")
+
+       // create a template for the client
+       clientCertTmpl, err := CertTemplate(client_name, 1)
+       if err != nil {
+               log.Fatalf("creating cert template: %v", err)
+       }
+       clientCertTmpl.KeyUsage = x509.KeyUsageDigitalSignature
+       clientCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}
+
+       // the root cert signs the cert by again providing its private key
+       _, clientCertPEM, err := CreateCert(clientCertTmpl, rootCert, clientPub, rootKey)
+       if err != nil {
+               log.Fatalf("error creating cert: %v", err)
+       }
+
+       // encode and load the cert and private key for the client
+       clientKeyPEM := pem.EncodeToMemory(&pem.Block{
+               Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(clientKey),
+       })
+
+       clientPubPEM := pem.EncodeToMemory(&pem.Block{
+               Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(clientPub),
+       })
+
+       cs := CertSet{
+               RootCertPEM:   rootCertPEM,
+               RootKeyPEM:    rootKeyPEM,
+               RootPubPEM:    rootPubPEM,
+               ClientCertPEM: clientCertPEM,
+               ClientKeyPEM:  clientKeyPEM,
+               ClientPubPEM:  clientPubPEM,
+               ServCertPEM:   servCertPEM,
+               ServKeyPEM:    servKeyPEM,
+               ServPubPEM:    servPubPEM,
+       }
+
+       return &cs
+}
diff --git a/0xetc/0xgo/crypt/main.go b/0xetc/0xgo/crypt/main.go
new file mode 100644 (file)
index 0000000..1a02763
--- /dev/null
@@ -0,0 +1,56 @@
+package main
+
+import (
+       "log"
+
+       pkgsym "github.com/seantywork/go/crypt/sym"
+)
+
+func main() {
+
+       /*
+               key := "12345678123456781234567812345678"
+
+               ciphertext := "7c1c5afe5fc1d2cda983019029a65490c3f2fc7fb752fff310406549ea52350edbe40cb8448b9a9a15e0bb02ed0a97244387c396125a6636ed3e9ee74517ab29"
+
+               dap, err := pkgsym.DecryptAES256CBC(ciphertext, []byte(key))
+
+               if err != nil {
+
+                       log.Fatalf("err: %v\n", err)
+               } else {
+                       log.Printf("success: %v\n", dap)
+               }
+       */
+
+       key := []byte("12345678123456781234567812345678")
+
+       data := "Scroll through the sentence list to see the sentence that best meets the context you’re looking for."
+
+       cipher := pkgsym.EncryptAES256CBC(data, key)
+
+       decipher, err := pkgsym.DecryptAES256CBC(cipher, key)
+
+       if err != nil {
+
+               log.Fatalf("error: %v\n", err)
+       } else {
+
+               log.Printf("success: %s\n", decipher)
+       }
+
+       cipherb, err := pkgsym.EncryptAESGCM(key, []byte(data))
+
+       if err != nil {
+               log.Fatalf("error: %v\n", err)
+       }
+
+       decipherb, err := pkgsym.DecryptAESGCM(key, cipherb)
+       if err != nil {
+
+               log.Fatalf("error: %v\n", err)
+       } else {
+
+               log.Printf("success: %s\n", string(decipherb))
+       }
+}
diff --git a/0xetc/0xgo/crypt/sym/sym.go b/0xetc/0xgo/crypt/sym/sym.go
new file mode 100644 (file)
index 0000000..0039f7c
--- /dev/null
@@ -0,0 +1,164 @@
+package aes
+
+import (
+       "bytes"
+       "crypto/aes"
+       "crypto/cipher"
+       "crypto/rand"
+       "encoding/hex"
+       "fmt"
+       "io"
+)
+
+func RandomHex(n int) (string, error) {
+       bytes := make([]byte, n)
+       if _, err := rand.Read(bytes); err != nil {
+               return "", err
+       }
+       return hex.EncodeToString(bytes), nil
+}
+
+func RandomBytes(n int) ([]byte, error) {
+       bytes := make([]byte, n)
+       if _, err := rand.Read(bytes); err != nil {
+               return nil, err
+       }
+
+       return bytes, nil
+
+}
+
+func EncryptAES256CBC(plaintext string, key []byte) string {
+       bKey := key
+       bIV, _ := RandomBytes(aes.BlockSize)
+
+       blockSize := aes.BlockSize
+
+       bPlaintext := PKCS5Padding([]byte(plaintext), blockSize, len(plaintext))
+       block, err := aes.NewCipher(bKey)
+       if err != nil {
+               panic(err)
+       }
+       ciphertext := make([]byte, len(bPlaintext)+aes.BlockSize)
+       mode := cipher.NewCBCEncrypter(block, bIV)
+       mode.CryptBlocks(ciphertext[aes.BlockSize:], bPlaintext)
+
+       copy(ciphertext, bIV)
+
+       return hex.EncodeToString(ciphertext)
+}
+
+func DecryptAES256CBC(ciphertext string, key []byte) (string, error) {
+
+       if len(key) != 32 {
+               return "", fmt.Errorf("key must be 32 bytes for AES-256")
+       }
+
+       cipherData, err := hex.DecodeString(ciphertext)
+       if err != nil {
+
+               return "", err
+       }
+
+       if len(cipherData) < aes.BlockSize {
+               fmt.Printf("cipherText too short\r\n")
+               return "", fmt.Errorf("cipherText too short")
+       }
+
+       iv := cipherData[:aes.BlockSize]
+       cipherText := cipherData[aes.BlockSize:]
+
+       block, err := aes.NewCipher(key)
+       if err != nil {
+
+               return "", err
+       }
+
+       if len(cipherText)%aes.BlockSize != 0 {
+
+               return "", fmt.Errorf("cipherText is not a multiple of the block size")
+       }
+
+       mode := cipher.NewCBCDecrypter(block, iv)
+
+       plainText := make([]byte, len(cipherText)*2)
+       mode.CryptBlocks(plainText, cipherText)
+
+       return string(plainText), nil
+}
+
+func EncryptAESGCM(key []byte, file_byte []byte) ([]byte, error) {
+
+       var ret_byte []byte = make([]byte, 0)
+
+       c, err := aes.NewCipher(key)
+
+       if err != nil {
+               return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error())
+
+       }
+
+       gcm, err := cipher.NewGCM(c)
+
+       if err != nil {
+               return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error())
+
+       }
+
+       nonce := make([]byte, gcm.NonceSize())
+
+       if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
+               return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error())
+       }
+
+       nonceSize := gcm.NonceSize()
+       if len(file_byte) < nonceSize {
+               return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error())
+       }
+       ciphertext := gcm.Seal(nil, nonce, file_byte, nil)
+
+       ret_byte = append(ret_byte, nonce...)
+
+       ret_byte = append(ret_byte, ciphertext...)
+
+       return ret_byte, nil
+
+}
+
+func DecryptAESGCM(key []byte, file_byte []byte) ([]byte, error) {
+
+       var ret_byte []byte
+
+       c, err := aes.NewCipher(key)
+       if err != nil {
+               return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error())
+       }
+
+       gcm, err := cipher.NewGCM(c)
+       if err != nil {
+               return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error())
+       }
+
+       nonceSize := gcm.NonceSize()
+
+       if len(file_byte) < nonceSize {
+               return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error())
+       }
+
+       nonce, ciphertext := file_byte[:nonceSize], file_byte[nonceSize:]
+
+       plainfile, err := gcm.Open(nil, nonce, ciphertext, nil)
+       if err != nil {
+               return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error())
+       }
+
+       ret_byte = plainfile
+
+       return ret_byte, nil
+}
+
+func PKCS5Padding(ciphertext []byte, blockSize int, after int) []byte {
+       padding := (blockSize - len(ciphertext)%blockSize)
+       padtext := bytes.Repeat([]byte{byte(padding)}, padding)
+       return append(ciphertext, padtext...)
+}
diff --git a/0xetc/0xgo/etcd-query/.gitignore b/0xetc/0xgo/etcd-query/.gitignore
new file mode 100644 (file)
index 0000000..546b462
--- /dev/null
@@ -0,0 +1,3 @@
+etcd1_data
+etcd2_data
+etcd3_data
\ No newline at end of file
diff --git a/0xetc/0xgo/etcd-query/core/modules.go b/0xetc/0xgo/etcd-query/core/modules.go
new file mode 100644 (file)
index 0000000..bf67c63
--- /dev/null
@@ -0,0 +1,77 @@
+package core
+
+import (
+       "context"
+       "log"
+       "strconv"
+       "time"
+
+       clientv3 "go.etcd.io/etcd/client/v3"
+)
+
+func ConnectEtcd() (*clientv3.Client, error) {
+
+       _, err := clientv3.New(clientv3.Config{
+               Endpoints:   []string{"localhost:2379"},
+               DialTimeout: 2 * time.Second,
+       })
+
+       if err == context.DeadlineExceeded {
+               log.Println("deadline execeeded")
+               return nil, err
+       }
+
+       cli, err := clientv3.New(clientv3.Config{
+               Endpoints:   []string{"localhost:2379"},
+               DialTimeout: 5 * time.Second,
+       })
+       if err != nil {
+               log.Println("failed to get new clien")
+               return nil, err
+       }
+
+       log.Println("connection success!")
+
+       return cli, nil
+
+}
+
+func PutKey(cli *clientv3.Client, key string, val string) error {
+
+       ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*1000*10)
+
+       _, err := cli.Put(ctx, key, val)
+
+       cancel()
+
+       if err != nil {
+
+               return err
+
+       }
+
+       log.Println("put successful")
+
+       return nil
+}
+
+func GetKey(cli *clientv3.Client, key string) error {
+
+       resp, err := cli.Get(context.TODO(), key)
+
+       if err != nil {
+               log.Println("failed to get")
+               return err
+       }
+
+       match_len := len(resp.Kvs)
+
+       match_len_str := strconv.Itoa(match_len)
+
+       log.Println("matched count: " + match_len_str)
+
+       log.Println("match: key: " + string(resp.Kvs[0].Key) + " val: " + string(resp.Kvs[0].Value))
+
+       return nil
+
+}
diff --git a/0xetc/0xgo/etcd-query/docker-compose.yaml b/0xetc/0xgo/etcd-query/docker-compose.yaml
new file mode 100644 (file)
index 0000000..8b3b95a
--- /dev/null
@@ -0,0 +1,54 @@
+version: "3"
+services:
+    etcd-1:
+        image: quay.io/coreos/etcd:v3.5.9
+        entrypoint: /usr/local/bin/etcd
+        ports:
+            - "2379:2379"
+        command:
+            - '--name=etcd-1'
+            - '--initial-advertise-peer-urls=http://etcd-1:2380'
+            - '--listen-peer-urls=http://0.0.0.0:2380'
+            - '--listen-client-urls=http://0.0.0.0:2379'
+            - '--advertise-client-urls=http://etcd-1:2379'
+            - '--heartbeat-interval=250'
+            - '--election-timeout=1250'
+            - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380'
+            - '--initial-cluster-state=new'
+            - '--initial-cluster-token=etcdbogustoken1234'
+        volumes:
+            - ./etcd1_data:/etcd_data
+
+    etcd-2:
+        image: quay.io/coreos/etcd:v3.5.9
+        entrypoint: /usr/local/bin/etcd
+        command:
+            - '--name=etcd-2'
+            - '--initial-advertise-peer-urls=http://etcd-2:2380'
+            - '--listen-peer-urls=http://0.0.0.0:2380'
+            - '--listen-client-urls=http://0.0.0.0:2379'
+            - '--advertise-client-urls=http://etcd-2:2379'
+            - '--heartbeat-interval=250'
+            - '--election-timeout=1250'
+            - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380'
+            - '--initial-cluster-state=new'
+            - '--initial-cluster-token=etcdbogustoken1234'
+        volumes:
+            - ./etcd2_data:/etcd_data
+
+    etcd-3:
+        image: quay.io/coreos/etcd:v3.5.9
+        entrypoint: /usr/local/bin/etcd
+        command:
+            - '--name=etcd-3'
+            - '--initial-advertise-peer-urls=http://etcd-3:2380'
+            - '--listen-peer-urls=http://0.0.0.0:2380'
+            - '--listen-client-urls=http://0.0.0.0:2379'
+            - '--advertise-client-urls=http://etcd-3:2379'
+            - '--heartbeat-interval=250'
+            - '--election-timeout=1250'
+            - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380'
+            - '--initial-cluster-state=new'
+            - '--initial-cluster-token=etcdbogustoken1234'
+        volumes:
+            - ./etcd3_data:/etcd_data
diff --git a/0xetc/0xgo/etcd-query/main.go b/0xetc/0xgo/etcd-query/main.go
new file mode 100644 (file)
index 0000000..b43d831
--- /dev/null
@@ -0,0 +1,36 @@
+package main
+
+import (
+       "log"
+
+       etcqcore "github.com/seantywork/go/etcd-query/core"
+)
+
+func main() {
+
+       cli, err := etcqcore.ConnectEtcd()
+
+       defer cli.Close()
+
+       if err != nil {
+
+               log.Fatalln(err.Error())
+       }
+
+       test_key := "my_little_key"
+
+       test_val := "myLittleValue"
+
+       err = etcqcore.PutKey(cli, test_key, test_val)
+
+       if err != nil {
+               log.Fatalln(err.Error())
+       }
+
+       err = etcqcore.GetKey(cli, test_key)
+
+       if err != nil {
+               log.Fatalln(err.Error())
+       }
+
+}
diff --git a/0xetc/0xgo/fault/.gitignore b/0xetc/0xgo/fault/.gitignore
new file mode 100644 (file)
index 0000000..1c0ec3f
--- /dev/null
@@ -0,0 +1,2 @@
+*.prof
+*.png
\ No newline at end of file
diff --git a/0xetc/0xgo/fault/2504-03.xyz.md b/0xetc/0xgo/fault/2504-03.xyz.md
new file mode 100644 (file)
index 0000000..3ed8c93
--- /dev/null
@@ -0,0 +1,83 @@
+# 21
+
+
+```shell
+ 62         runtime.GC()
+ 63 
+ 64         cpuProfileBuff := &bytes.Buffer{}
+ 65 
+ 66         err := pprof.StartCPUProfile(cpuProfileBuff)
+ 67 
+ 68         if err != nil {
+ 69 
+ 70                 panic(err)
+ 71         }
+ 72 
+ 73         time.Sleep(time.Second * time.Duration(waits))
+ 74 
+ 75         pprof.StopCPUProfile()
+ 76 
+ 77         runtime.GC()
+ 78 
+ 79         profileBytes := cpuProfileBuff.Bytes()
+ 80 
+ 81         f, err := os.OpenFile("go.prof", os.O_CREATE|os.O_RDWR, 0644)
+ 82 
+
+
+```
+
+# 22
+
+```shell
+
+    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                   
+  13784 seantyw+  20   0 1226856   4568   1536 S 107.3   0.1   0:22.65 test.out                  
+   2903 seantyw+  20   0   11.1g  75580  45056 S   9.3   0.9   0:04.94 node                      
+   2797 seantyw+  20   0   11.3g 102748  47872 R   6.0   1.3   0:05.74 node                      
+   3718 seantyw+  20   0   31.3g 142516  55296 S   3.3   1.8   0:10.09 node          
+```
+
+# 23
+
+```shell
+$ ls
+2504-03.xyz.md  go.prof  main.go  Makefile  test.out
+
+
+$ sudo apt update && sudo apt install graphviz
+
+
+$ go tool pprof -png go.prof
+Generating report in profile001.png
+```
+
+# 24
+
+```shell
+94 type NullStruct struct {
+95         Value int
+96         Field *NullStruct
+97 }
+
+
+121 
+122                 null := NullStruct{}
+123 
+124                 fmt.Printf("val: %d\n", null.Field.Value)
+125 
+
+```
+
+# 25 
+```shell
+$ ./test.out 2
+panic: runtime error: invalid memory address or nil pointer dereference
+[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b7593]
+
+goroutine 1 [running]:
+main.main()
+        /home/seantywork/hack/linux/linuxyz/0xgo/fault/main.go:124 +0xb3
+
+```
\ No newline at end of file
diff --git a/0xetc/0xgo/fault/Makefile b/0xetc/0xgo/fault/Makefile
new file mode 100644 (file)
index 0000000..731062c
--- /dev/null
@@ -0,0 +1,3 @@
+all:
+       go build -o test.out .
+       
diff --git a/0xetc/0xgo/fault/main.go b/0xetc/0xgo/fault/main.go
new file mode 100644 (file)
index 0000000..092bcd0
--- /dev/null
@@ -0,0 +1,128 @@
+package main
+
+import (
+       "bytes"
+       "fmt"
+       "os"
+       "runtime"
+       "runtime/pprof"
+       "time"
+)
+
+var TLEN = 10
+
+func busy() {
+
+       val := 1
+       str := ""
+       for {
+
+               str = fmt.Sprintf("%d", val)
+
+               _ = str
+       }
+
+}
+
+func notbusy(idx int) {
+
+       val := 1
+       str := ""
+       for {
+
+               time.Sleep(time.Millisecond * 1)
+
+               str = fmt.Sprintf("%d", val)
+
+               fmt.Printf("i'm not busy: %d: %s\n", idx, str)
+
+       }
+}
+
+func threadFunc() {
+
+       for i := 0; i < TLEN; i++ {
+
+               if i == 5 {
+
+                       go busy()
+
+               } else {
+
+                       go notbusy(i)
+
+               }
+
+       }
+
+}
+
+func profiler(waits int) {
+
+       runtime.GC()
+
+       cpuProfileBuff := &bytes.Buffer{}
+
+       err := pprof.StartCPUProfile(cpuProfileBuff)
+
+       if err != nil {
+
+               panic(err)
+       }
+
+       time.Sleep(time.Second * time.Duration(waits))
+
+       pprof.StopCPUProfile()
+
+       runtime.GC()
+
+       profileBytes := cpuProfileBuff.Bytes()
+
+       f, err := os.OpenFile("go.prof", os.O_CREATE|os.O_RDWR, 0644)
+
+       if err != nil {
+
+               panic(err)
+       }
+
+       f.Write(profileBytes)
+
+       f.Close()
+
+}
+
+type NullStruct struct {
+       Value int
+       Field *NullStruct
+}
+
+func main() {
+
+       argc := len(os.Args)
+
+       if argc != 2 {
+               fmt.Printf("feed case\n")
+               os.Exit(-1)
+       }
+
+       if os.Args[1] == "1" {
+
+               go threadFunc()
+
+               go profiler(10)
+
+               for {
+
+                       time.Sleep(time.Millisecond * 1000)
+
+               }
+
+       } else if os.Args[1] == "2" {
+
+               null := NullStruct{}
+
+               fmt.Printf("val: %d\n", null.Field.Value)
+
+       }
+
+}
diff --git a/0xetc/0xgo/file-updownload/.gitignore b/0xetc/0xgo/file-updownload/.gitignore
new file mode 100644 (file)
index 0000000..6320cd2
--- /dev/null
@@ -0,0 +1 @@
+data
\ No newline at end of file
diff --git a/0xetc/0xgo/file-updownload/Makefile b/0xetc/0xgo/file-updownload/Makefile
new file mode 100644 (file)
index 0000000..a1070ec
--- /dev/null
@@ -0,0 +1,5 @@
+all:
+       go build -o client/c.out ./client 
+
+       go build -o server/s.out ./server
+
diff --git a/0xetc/0xgo/file-updownload/client/main.go b/0xetc/0xgo/file-updownload/client/main.go
new file mode 100644 (file)
index 0000000..0f0bdd2
--- /dev/null
@@ -0,0 +1,121 @@
+package main
+
+import (
+       "bytes"
+       "fmt"
+       "io"
+       "log"
+       "mime/multipart"
+       "net/http"
+       "os"
+       "strings"
+)
+
+func Upload(client *http.Client, url string, values map[string]io.Reader) (err error) {
+
+       var b bytes.Buffer
+       w := multipart.NewWriter(&b)
+       for key, r := range values {
+               var fw io.Writer
+               if x, ok := r.(io.Closer); ok {
+                       defer x.Close()
+               }
+
+               if x, ok := r.(*os.File); ok {
+                       if fw, err = w.CreateFormFile(key, x.Name()); err != nil {
+                               return
+                       }
+               } else {
+                       // Add other fields
+                       if fw, err = w.CreateFormField(key); err != nil {
+                               return
+                       }
+               }
+               if _, err = io.Copy(fw, r); err != nil {
+                       return err
+               }
+
+       }
+
+       w.Close()
+
+       req, err := http.NewRequest("POST", url, &b)
+       if err != nil {
+               return
+       }
+
+       req.Header.Set("Content-Type", w.FormDataContentType())
+
+       res, err := client.Do(req)
+       if err != nil {
+               return
+       }
+
+       if res.StatusCode != http.StatusOK {
+               err = fmt.Errorf("bad status: %s", res.Status)
+       }
+       return
+}
+
+func Download(filepath string, url string) (err error) {
+
+       out, err := os.Create(filepath)
+       if err != nil {
+               return err
+       }
+       defer out.Close()
+
+       resp, err := http.Get(url)
+       if err != nil {
+               return err
+       }
+       defer resp.Body.Close()
+
+       if resp.StatusCode != http.StatusOK {
+               return fmt.Errorf("bad status: %s", resp.Status)
+       }
+
+       _, err = io.Copy(out, resp.Body)
+       if err != nil {
+               return err
+       }
+
+       return nil
+}
+
+func main() {
+
+       v, err := os.Open("./data/test.mp4")
+
+       if err != nil {
+               log.Printf("failed to read data: %v\n", err)
+               os.Exit(-1)
+       }
+
+       values := map[string]io.Reader{
+               "file":  v,
+               "other": strings.NewReader("hello world!"),
+       }
+
+       client := &http.Client{}
+
+       err = Upload(client, "http://localhost:8080/upload", values)
+
+       if err != nil {
+
+               log.Printf("failed to upload file: %v\n", err)
+
+               os.Exit(-1)
+       }
+
+       err = Download("./data/return.mp4", "http://localhost:8080/download/test.mp4")
+
+       if err != nil {
+               log.Printf("failed to download file: %v\n", err)
+
+               os.Exit(-1)
+       }
+
+       os.Exit(0)
+
+}
diff --git a/0xetc/0xgo/file-updownload/server/main.go b/0xetc/0xgo/file-updownload/server/main.go
new file mode 100644 (file)
index 0000000..e8cfcca
--- /dev/null
@@ -0,0 +1,68 @@
+package main
+
+import (
+       "log"
+       "net/http"
+
+       "github.com/gin-gonic/contrib/sessions"
+       "github.com/gin-gonic/gin"
+)
+
+func BinaryUpload(c *gin.Context) {
+
+       file, _ := c.FormFile("file")
+
+       rawMediaType := file.Header.Get("Content-Type")
+
+       log.Printf("content type: %s\n", rawMediaType)
+
+       f_name := file.Filename
+
+       this_video_path := "./data/" + f_name
+
+       err := c.SaveUploadedFile(file, this_video_path)
+
+       if err != nil {
+
+               c.String(http.StatusBadRequest, "failed")
+
+               return
+       }
+
+       c.String(http.StatusOK, "success")
+
+}
+
+func BinaryDownload(c *gin.Context) {
+
+       binName := c.Param("binName")
+
+       this_video_path := "./data/" + binName
+
+       //c.Header("Content-Type", "video/mp4")
+
+       c.File(this_video_path)
+
+}
+
+func setRoutes(e *gin.Engine) {
+
+       e.POST("/upload", BinaryUpload)
+
+       e.GET("/download/:binName", BinaryDownload)
+
+}
+
+func main() {
+
+       server := gin.Default()
+
+       store := sessions.NewCookieStore([]byte("FILEUPDOWN"))
+
+       server.Use(sessions.Sessions("FILEUPDOWN", store))
+
+       setRoutes(server)
+
+       server.Run("0.0.0.0:8080")
+
+}
diff --git a/0xetc/0xgo/go.sum b/0xetc/0xgo/go.sum
new file mode 100644 (file)
index 0000000..9cbd7ff
--- /dev/null
@@ -0,0 +1,1033 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
+cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
+cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
+cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
+cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo=
+cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
+cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk=
+cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
+cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+fyne.io/fyne/v2 v2.5.2 h1:eSyGTmSkv10yAdAeHpDet6u2KkKxOGFc14kQu81We7Q=
+fyne.io/fyne/v2 v2.5.2/go.mod h1:26gqPDvtaxHeyct+C0BBjuGd2zwAJlPkUGSBrb+d7Ug=
+fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg=
+fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
+github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ=
+github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
+github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
+github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4=
+github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4=
+github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
+github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
+github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
+github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
+github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0=
+github.com/antchfx/htmlquery v1.3.3 h1:x6tVzrRhVNfECDaVxnZi1mEGrQg3mjE/rxbH2Pe6dNE=
+github.com/antchfx/htmlquery v1.3.3/go.mod h1:WeU3N7/rL6mb6dCwtE30dURBnBieKDC/fR8t6X+cKjU=
+github.com/antchfx/xmlquery v1.2.4/go.mod h1:KQQuESaxSlqugE2ZBcM/qn+ebIpt+d+4Xx7YcSGAIrM=
+github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA=
+github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA=
+github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
+github.com/antchfx/xpath v1.1.8/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
+github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U=
+github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
+github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff h1:RmdPFa+slIr4SCBg4st/l/vZWVe9QJKMXGO60Bxbe04=
+github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw=
+github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
+github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
+github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
+github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
+github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
+github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
+github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
+github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U=
+github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU=
+github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
+github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
+github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/fortytw2/leaktest v1.2.0 h1:cj6GCiwJDH7l3tMHLjZDo0QqPtrXJiWSI9JgpeQKw+Q=
+github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8=
+github.com/fredbi/uri v1.1.0/go.mod h1:aYTUoAXBOq7BLfVJ8GnKmfcuURosB1xyHDIfWeC/iW4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
+github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
+github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934 h1:dZC5aKobSN07hf71oMivxUmAofFja5GrfPK2rBlttX4=
+github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934/go.mod h1:d4clgH0/GrRwWjRzJJQXxT/h1TyuNSfF/X64zb/3Ggg=
+github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a h1:ybgRdYvAHTn93HW79bLiBiJwVL4jVeyGQRZMgImoeWs=
+github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a/go.mod h1:gsGA2dotD4v0SR6PmPCYvS9JuOeMwAtmfvDE7mbYXMY=
+github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964 h1:0pTELtjlVAVGSazfwRNcqTVzqmkWb1GsNozCmmZfdZA=
+github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964/go.mod h1:J9Uunu842kOcTjzQj4Eq8XIDmF55szvT1PTS1cUb1UE=
+github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
+github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
+github.com/gen2brain/shm v0.1.1 h1:1cTVA5qcsUFixnDHl14TmRoxgfWEEZlTezpUj1vm5uQ=
+github.com/gen2brain/shm v0.1.1/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0 h1:EUFmvQ8ffefnSAmaUZd9HZYZSw9w/bFjp3FiNaJ5WmE=
+github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0/go.mod h1:iqneQ2Df3omzIVTkIfn7c1acsVnMGiSLn4XF5Blh3Yg=
+github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
+github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
+github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
+github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA=
+github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
+github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
+github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
+github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
+github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc=
+github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU=
+github.com/go-text/typesetting v0.2.0 h1:fbzsgbmk04KiWtE+c3ZD4W2nmCRzBqrqQOvYlwAOdho=
+github.com/go-text/typesetting v0.2.0/go.mod h1:2+owI/sxa73XA581LAzVuEBZ3WEEV2pXeDswCH/3i1I=
+github.com/go-text/typesetting-utils v0.0.0-20240317173224-1986cbe96c66 h1:GUrm65PQPlhFSKjLPGOZNPNxLCybjzjYBzjfoBGaDUY=
+github.com/go-text/typesetting-utils v0.0.0-20240317173224-1986cbe96c66/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o=
+github.com/go-vgo/robotgo v0.110.5 h1:F3meroJVBPvxncoHX9ZoD1Gal+pYywu1MLPcJkN5oEw=
+github.com/go-vgo/robotgo v0.110.5/go.mod h1:MzgZR4XAnlhBAe4ExLcJebisDUfbYoh3ekaP/s/XRqQ=
+github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
+github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
+github.com/gocolly/colly/v2 v2.1.0 h1:k0DuZkDoCsx51bKpRJNEmcxcp+W5N8ziuwGaSDuFoGs=
+github.com/gocolly/colly/v2 v2.1.0/go.mod h1:I2MuhsLjQ+Ex+IzK3afNS8/1qP3AedHOusRPcRdC5o0=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
+github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
+github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
+github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs=
+github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
+github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
+github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
+github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gopherjs/gopherjs v0.0.0-20211219123610-ec9572f70e60/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI=
+github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
+github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=
+github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
+github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
+github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
+github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=
+github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=
+github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
+github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/goxjs/gl v0.0.0-20210104184919-e3fafc6f8f2a/go.mod h1:dy/f2gjY09hwVfIyATps4G2ai7/hLwLkc5TrPqONuXY=
+github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc=
+github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ=
+github.com/graphql-go/handler v0.2.4 h1:gz9q11TUHPNUpqzV8LMa+rkqM5NUuH/nkE3oF2LS3rI=
+github.com/graphql-go/handler v0.2.4/go.mod h1:gsQlb4gDvURR0bgN8vWQEh+s5vJALM2lYL3n3cf6OxQ=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=
+github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg=
+github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 h1:Po+wkNdMmN+Zj1tDsJQy7mJlPlwGNQd9JZoPjObagf8=
+github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49/go.mod h1:YiutDnxPRLk5DLUFj6Rw4pRBBURZY07GFr54NdV9mQg=
+github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4=
+github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
+github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191 h1:5UHVWNX1qrIbNw7OpKbxe5bHkhHRk3xRKztMjERuCsU=
+github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191/go.mod h1:Pmpz2BLf55auQZ67u3rvyI2vAQvNetkK/4zYUmpauZQ=
+github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
+github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
+github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
+github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
+github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
+github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
+github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
+github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
+github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
+github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
+github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
+github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
+github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
+github.com/nicksnyder/go-i18n/v2 v2.4.1 h1:zwzjtX4uYyiaU02K5Ia3zSkpJZrByARkRB4V3YPrr0g=
+github.com/nicksnyder/go-i18n/v2 v2.4.1/go.mod h1:++Pl70FR6Cki7hdzZRnEEqdc2dJt+SAGotyFg/SvZMk=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
+github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
+github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
+github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc=
+github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I=
+github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE=
+github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=
+github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
+github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
+github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M=
+github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
+github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
+github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
+github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
+github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
+github.com/pion/ice/v3 v3.0.16 h1:YoPlNg3jU1UT/DDTa9v/g1vH6A2/pAzehevI1o66H8E=
+github.com/pion/ice/v3 v3.0.16/go.mod h1:SdmubtIsCcvdb1ZInrTUz7Iaqi90/rYd1pzbzlMxsZg=
+github.com/pion/ice/v4 v4.0.3 h1:9s5rI1WKzF5DRqhJ+Id8bls/8PzM7mau0mj1WZb4IXE=
+github.com/pion/ice/v4 v4.0.3/go.mod h1:VfHy0beAZ5loDT7BmJ2LtMtC4dbawIkkkejHPRZNB3Y=
+github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
+github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
+github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
+github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
+github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM=
+github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA=
+github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
+github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
+github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
+github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
+github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU=
+github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
+github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA=
+github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg=
+github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY=
+github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M=
+github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
+github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
+github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0=
+github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ=
+github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
+github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU=
+github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
+github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo=
+github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
+github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
+github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
+github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
+github.com/pion/turn/v3 v3.0.3 h1:1e3GVk8gHZLPBA5LqadWYV60lmaKUaHCkm9DX9CkGcE=
+github.com/pion/turn/v3 v3.0.3/go.mod h1:vw0Dz420q7VYAF3J4wJKzReLHIo2LGp4ev8nXQexYsc=
+github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
+github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
+github.com/pion/webrtc/v4 v4.0.7 h1:aeq78uVnFZd2umXW0O9A2VFQYuS7+BZxWetQvSp2jPo=
+github.com/pion/webrtc/v4 v4.0.7/go.mod h1:oFVBBVSHU3vAEwSgnk3BuKCwAUwpDwQhko1EDwyZWbU=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
+github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo=
+github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
+github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
+github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
+github.com/quic-go/quic-go v0.48.1 h1:y/8xmfWI9qmGTc+lBr4jKRUWLGSlSigv847ULJ4hYXA=
+github.com/quic-go/quic-go v0.48.1/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs=
+github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
+github.com/robotn/xgb v0.10.0 h1:O3kFbIwtwZ3pgLbp1h5slCQ4OpY8BdwugJLrUe6GPIM=
+github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
+github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw=
+github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/rymdport/portal v0.2.6 h1:HWmU3gORu7vWcpr7VSwUS2Xx1HtJXVcUuTqEZcMEsIg=
+github.com/rymdport/portal v0.2.6/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4=
+github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
+github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA=
+github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM=
+github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8=
+github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
+github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
+github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
+github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
+github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
+github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE=
+github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q=
+github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ=
+github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f h1:13CyO8FO3blZH04ewuT9DDgm9V7G0CfjDzw8kLKx+s8=
+github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8=
+github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA=
+github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk=
+github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
+github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg=
+github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
+github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
+github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
+github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
+github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
+github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/vcaesar/gops v0.40.0 h1:I+1RCGiV+LkZJUYNzAd373xs0uM2UyeFdZBmow8HfCM=
+github.com/vcaesar/gops v0.40.0/go.mod h1:3u/USW7JovqUK6i13VOD3qWfvXXd2TIIKE4PYIv4TOM=
+github.com/vcaesar/imgo v0.40.2 h1:5GWScRLdBCMtO1v2I1bs+ZmDLZFINxYSMZ+mtUw5qPM=
+github.com/vcaesar/imgo v0.40.2/go.mod h1:MVCl+FxHI2gTgmiHoi0n5xNCbYcfv9SVtdEOUC92+eo=
+github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw=
+github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ=
+github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4=
+github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU=
+github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
+github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic=
+github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
+github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
+github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/yutopp/go-amf0 v0.1.0 h1:a3UeBZG7nRF0zfvmPn2iAfNo1RGzUpHz1VyJD2oGrik=
+github.com/yutopp/go-amf0 v0.1.0/go.mod h1:QzDOBr9RV6sQh6E5GFEJROZbU0iQKijORBmprkb3FIk=
+github.com/yutopp/go-flv v0.3.1 h1:4ILK6OgCJgUNm2WOjaucWM5lUHE0+sLNPdjq3L0Xtjk=
+github.com/yutopp/go-flv v0.3.1/go.mod h1:pAlHPSVRMv5aCUKmGOS/dZn/ooTgnc09qOPmiUNMubs=
+github.com/yutopp/go-rtmp v0.0.7 h1:sKKm1MVV3ANbJHZlf3Kq8ecq99y5U7XnDUDxSjuK7KU=
+github.com/yutopp/go-rtmp v0.0.7/go.mod h1:KSwrC9Xj5Kf18EUlk1g7CScecjXfIqc0J5q+S0u6Irc=
+go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
+go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0=
+go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28=
+go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q=
+go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E=
+go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
+go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE=
+go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM=
+go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
+go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
+go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
+go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
+go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
+go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
+go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
+golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
+golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
+golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
+golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
+golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s=
+golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ=
+golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c h1:zuNS/LWsEpPTLfrmBkis6Xofw3nieAqB4hYLn8+uswk=
+golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c/go.mod h1:snk1Mn2ZpdKCt90JPEsDh4sL3ReK520U2t0d7RHBnSU=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
+golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
+golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
+golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
+golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
+golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
+golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
+golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
+golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
+golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
+golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
+golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
+golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
+google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
+google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
+google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
+google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
+google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4=
+google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
+google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw=
+google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
+google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
+google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/0xetc/0xgo/graphql/Makefile b/0xetc/0xgo/graphql/Makefile
new file mode 100644 (file)
index 0000000..5f9b263
--- /dev/null
@@ -0,0 +1,3 @@
+all:
+
+       go build -o gql.out .
\ No newline at end of file
diff --git a/0xetc/0xgo/graphql/data.json b/0xetc/0xgo/graphql/data.json
new file mode 100644 (file)
index 0000000..142e599
--- /dev/null
@@ -0,0 +1,13 @@
+[
+    {
+        "id": 1,
+        "name" : "one",
+        "description": "number one guy",
+        "otherNames": [
+            "uno",
+            "ei",
+            "il"
+        ],
+        "imageUrl" :"none"
+    }
+]
\ No newline at end of file
diff --git a/0xetc/0xgo/graphql/main.go b/0xetc/0xgo/graphql/main.go
new file mode 100644 (file)
index 0000000..b835535
--- /dev/null
@@ -0,0 +1,127 @@
+package main
+
+import (
+       "encoding/json"
+       "fmt"
+       "os"
+
+       "net/http"
+
+       "github.com/graphql-go/graphql"
+       "github.com/graphql-go/handler"
+)
+
+func importJSONDataFromFile(fileName string, result interface{}) (isOK bool) {
+       isOK = true
+       content, err := os.ReadFile(fileName)
+       if err != nil {
+               fmt.Print("Error:", err)
+               isOK = false
+       }
+       err = json.Unmarshal(content, result)
+       if err != nil {
+               isOK = false
+               fmt.Print("Error:", err)
+       }
+       return
+}
+
+var BeastList []Beast
+var _ = importJSONDataFromFile("./data.json", &BeastList)
+
+var beastType = graphql.NewObject(graphql.ObjectConfig{
+       Name: "Beast",
+       Fields: graphql.Fields{
+               "name": &graphql.Field{
+                       Type: graphql.String,
+               },
+               "description": &graphql.Field{
+                       Type: graphql.String,
+               },
+               "id": &graphql.Field{
+                       Type: graphql.Int,
+               },
+               "otherNames": &graphql.Field{
+                       Type: graphql.NewList(graphql.String),
+               },
+               "imageUrl": &graphql.Field{
+                       Type: graphql.String,
+               },
+       },
+})
+
+var rootQuery = graphql.NewObject(graphql.ObjectConfig{
+       Name: "RootQuery",
+       Fields: graphql.Fields{
+               "beast": &graphql.Field{
+                       Type:        beastType,
+                       Description: "Get single beast",
+                       Args: graphql.FieldConfigArgument{
+                               "name": &graphql.ArgumentConfig{
+                                       Type: graphql.String,
+                               },
+                       },
+                       Resolve: func(params graphql.ResolveParams) (interface{}, error) {
+                               nameQuery, isOK := params.Args["name"].(string)
+                               if isOK {
+                                       // Search for el with name
+                                       for _, beast := range BeastList {
+                                               if beast.Name == nameQuery {
+                                                       return beast, nil
+                                               }
+                                       }
+                               }
+
+                               return Beast{}, nil
+                       },
+               },
+
+               "beastList": &graphql.Field{
+                       Type:        graphql.NewList(beastType),
+                       Description: "List of beasts",
+                       Resolve: func(p graphql.ResolveParams) (interface{}, error) {
+                               return BeastList, nil
+                       },
+               },
+       },
+})
+
+var BeastSchema, _ = graphql.NewSchema(graphql.SchemaConfig{
+       Query: rootQuery,
+})
+
+var sandboxHTML = []byte(`
+<!DOCTYPE html>
+<html lang="en">
+<body style="margin: 0; overflow-x: hidden; overflow-y: hidden">
+<div id="sandbox" style="height:100vh; width:100vw;"></div>
+<script src="https://embeddable-sandbox.cdn.apollographql.com/_latest/embeddable-sandbox.umd.production.min.js"></script>
+<script>
+new window.EmbeddedSandbox({
+  target: "#sandbox",
+  // Pass through your server href if you are embedding on an endpoint.
+  // Otherwise, you can pass whatever endpoint you want Sandbox to start up with here.
+  initialEndpoint: "http://localhost:8080/graphql",
+});
+// advanced options: https://www.apollographql.com/docs/studio/explorer/sandbox#embedding-sandbox
+</script>
+</body>
+</html>`)
+
+func main() {
+
+       h := handler.New(&handler.Config{
+               Schema:   &BeastSchema,
+               Pretty:   true,
+               GraphiQL: false,
+       })
+
+       http.Handle("/graphql", h)
+
+       http.Handle("/sandbox", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+               w.Write(sandboxHTML)
+       }))
+
+       http.ListenAndServe(":8080", nil)
+}
diff --git a/0xetc/0xgo/graphql/types.go b/0xetc/0xgo/graphql/types.go
new file mode 100644 (file)
index 0000000..9b7c3ee
--- /dev/null
@@ -0,0 +1,9 @@
+package main
+
+type Beast struct {
+       ID          int      `json:"id"`
+       Name        string   `json:"name"`
+       Description string   `json:"description"`
+       OtherNames  []string `json:"otherNames"`
+       ImageURL    string   `json:"imageUrl"`
+}
diff --git a/0xetc/0xgo/grpc/Makefile b/0xetc/0xgo/grpc/Makefile
new file mode 100644 (file)
index 0000000..9e56181
--- /dev/null
@@ -0,0 +1,31 @@
+
+
+all:
+
+       @echo "go grpc"
+
+
+dep:
+
+       apt install -y protobuf-compiler
+
+dep-go: 
+
+       go install google.golang.org/protobuf/cmd/protoc-gen-go
+
+       go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
+
+proto:
+
+       cd chatpb && ./protoc.sh
+
+build:
+
+       go build -o server/server.out ./server 
+
+       go build -o client/client.out ./client 
+
+
+
+
+
diff --git a/0xetc/0xgo/grpc/certgen.sh b/0xetc/0xgo/grpc/certgen.sh
new file mode 100755 (executable)
index 0000000..493976f
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+rm -r ./client/certs/*
+
+rm -r ./server/certs/*
+
+echo "root generating...."
+
+openssl genrsa -out ./client/certs/ca_priv.pem 4096
+
+openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
+
+openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
+
+echo "server key pair, csr generating...."
+
+openssl genrsa -out ./server/certs/server.key 4096
+
+openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
+
+openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
+
+echo "signing requests for server...."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
+
+
+echo "done!"
\ No newline at end of file
diff --git a/0xetc/0xgo/grpc/chatpb/chat.pb.go b/0xetc/0xgo/grpc/chatpb/chat.pb.go
new file mode 100644 (file)
index 0000000..630514c
--- /dev/null
@@ -0,0 +1,551 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+//     protoc-gen-go v1.34.0
+//     protoc        v4.25.0
+// source: chat.proto
+
+package chatpb
+
+import (
+       protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+       protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+       reflect "reflect"
+       sync "sync"
+)
+
+const (
+       // Verify that this generated code is sufficiently up-to-date.
+       _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+       // Verify that runtime/protoimpl is sufficiently up-to-date.
+       _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type HelloRequest struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *HelloRequest) Reset() {
+       *x = HelloRequest{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_chat_proto_msgTypes[0]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *HelloRequest) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HelloRequest) ProtoMessage() {}
+
+func (x *HelloRequest) ProtoReflect() protoreflect.Message {
+       mi := &file_chat_proto_msgTypes[0]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead.
+func (*HelloRequest) Descriptor() ([]byte, []int) {
+       return file_chat_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *HelloRequest) GetName() string {
+       if x != nil {
+               return x.Name
+       }
+       return ""
+}
+
+type HelloReply struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+}
+
+func (x *HelloReply) Reset() {
+       *x = HelloReply{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_chat_proto_msgTypes[1]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *HelloReply) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HelloReply) ProtoMessage() {}
+
+func (x *HelloReply) ProtoReflect() protoreflect.Message {
+       mi := &file_chat_proto_msgTypes[1]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use HelloReply.ProtoReflect.Descriptor instead.
+func (*HelloReply) Descriptor() ([]byte, []int) {
+       return file_chat_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *HelloReply) GetMessage() string {
+       if x != nil {
+               return x.Message
+       }
+       return ""
+}
+
+type TalkRequest struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+}
+
+func (x *TalkRequest) Reset() {
+       *x = TalkRequest{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_chat_proto_msgTypes[2]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *TalkRequest) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TalkRequest) ProtoMessage() {}
+
+func (x *TalkRequest) ProtoReflect() protoreflect.Message {
+       mi := &file_chat_proto_msgTypes[2]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use TalkRequest.ProtoReflect.Descriptor instead.
+func (*TalkRequest) Descriptor() ([]byte, []int) {
+       return file_chat_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *TalkRequest) GetMessage() string {
+       if x != nil {
+               return x.Message
+       }
+       return ""
+}
+
+type TalkResponse struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       TalkContent *TalkContent `protobuf:"bytes,1,opt,name=talk_content,json=talkContent,proto3" json:"talk_content,omitempty"`
+}
+
+func (x *TalkResponse) Reset() {
+       *x = TalkResponse{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_chat_proto_msgTypes[3]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *TalkResponse) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TalkResponse) ProtoMessage() {}
+
+func (x *TalkResponse) ProtoReflect() protoreflect.Message {
+       mi := &file_chat_proto_msgTypes[3]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use TalkResponse.ProtoReflect.Descriptor instead.
+func (*TalkResponse) Descriptor() ([]byte, []int) {
+       return file_chat_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *TalkResponse) GetTalkContent() *TalkContent {
+       if x != nil {
+               return x.TalkContent
+       }
+       return nil
+}
+
+type TalkContent struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       Index   int64  `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
+       Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"`
+}
+
+func (x *TalkContent) Reset() {
+       *x = TalkContent{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_chat_proto_msgTypes[4]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *TalkContent) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TalkContent) ProtoMessage() {}
+
+func (x *TalkContent) ProtoReflect() protoreflect.Message {
+       mi := &file_chat_proto_msgTypes[4]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use TalkContent.ProtoReflect.Descriptor instead.
+func (*TalkContent) Descriptor() ([]byte, []int) {
+       return file_chat_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *TalkContent) GetIndex() int64 {
+       if x != nil {
+               return x.Index
+       }
+       return 0
+}
+
+func (x *TalkContent) GetContent() string {
+       if x != nil {
+               return x.Content
+       }
+       return ""
+}
+
+type HistoryRequest struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       Index int64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
+}
+
+func (x *HistoryRequest) Reset() {
+       *x = HistoryRequest{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_chat_proto_msgTypes[5]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *HistoryRequest) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HistoryRequest) ProtoMessage() {}
+
+func (x *HistoryRequest) ProtoReflect() protoreflect.Message {
+       mi := &file_chat_proto_msgTypes[5]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead.
+func (*HistoryRequest) Descriptor() ([]byte, []int) {
+       return file_chat_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *HistoryRequest) GetIndex() int64 {
+       if x != nil {
+               return x.Index
+       }
+       return 0
+}
+
+type HistoryResponse struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       History []*TalkContent `protobuf:"bytes,1,rep,name=history,proto3" json:"history,omitempty"`
+}
+
+func (x *HistoryResponse) Reset() {
+       *x = HistoryResponse{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_chat_proto_msgTypes[6]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *HistoryResponse) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HistoryResponse) ProtoMessage() {}
+
+func (x *HistoryResponse) ProtoReflect() protoreflect.Message {
+       mi := &file_chat_proto_msgTypes[6]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use HistoryResponse.ProtoReflect.Descriptor instead.
+func (*HistoryResponse) Descriptor() ([]byte, []int) {
+       return file_chat_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *HistoryResponse) GetHistory() []*TalkContent {
+       if x != nil {
+               return x.History
+       }
+       return nil
+}
+
+var File_chat_proto protoreflect.FileDescriptor
+
+var file_chat_proto_rawDesc = []byte{
+       0x0a, 0x0a, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x68,
+       0x61, 0x74, 0x70, 0x62, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71,
+       0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+       0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c,
+       0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+       0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+       0x22, 0x27, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+       0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+       0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x46, 0x0a, 0x0c, 0x54, 0x61, 0x6c,
+       0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x74, 0x61, 0x6c,
+       0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+       0x13, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e,
+       0x74, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x74, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+       0x74, 0x22, 0x3d, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+       0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+       0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+       0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+       0x22, 0x26, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,
+       0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28,
+       0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x40, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74,
+       0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x68,
+       0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63,
+       0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+       0x74, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x32, 0xba, 0x01, 0x0a, 0x07, 0x43,
+       0x68, 0x61, 0x74, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c,
+       0x6c, 0x6f, 0x12, 0x14, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x6c, 0x6c,
+       0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70,
+       0x62, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x37, 0x0a, 0x08,
+       0x54, 0x61, 0x6c, 0x6b, 0x54, 0x6f, 0x4d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70,
+       0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e,
+       0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
+       0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0d, 0x57, 0x68, 0x61, 0x74, 0x44, 0x69, 0x64,
+       0x59, 0x6f, 0x75, 0x53, 0x61, 0x79, 0x12, 0x16, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e,
+       0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17,
+       0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52,
+       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75,
+       0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x61, 0x6e, 0x74, 0x79, 0x77, 0x6f, 0x72, 0x6b,
+       0x2f, 0x30, 0x78, 0x67, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x70,
+       0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+       file_chat_proto_rawDescOnce sync.Once
+       file_chat_proto_rawDescData = file_chat_proto_rawDesc
+)
+
+func file_chat_proto_rawDescGZIP() []byte {
+       file_chat_proto_rawDescOnce.Do(func() {
+               file_chat_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_proto_rawDescData)
+       })
+       return file_chat_proto_rawDescData
+}
+
+var file_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_chat_proto_goTypes = []interface{}{
+       (*HelloRequest)(nil),    // 0: chatpb.HelloRequest
+       (*HelloReply)(nil),      // 1: chatpb.HelloReply
+       (*TalkRequest)(nil),     // 2: chatpb.TalkRequest
+       (*TalkResponse)(nil),    // 3: chatpb.TalkResponse
+       (*TalkContent)(nil),     // 4: chatpb.TalkContent
+       (*HistoryRequest)(nil),  // 5: chatpb.HistoryRequest
+       (*HistoryResponse)(nil), // 6: chatpb.HistoryResponse
+}
+var file_chat_proto_depIdxs = []int32{
+       4, // 0: chatpb.TalkResponse.talk_content:type_name -> chatpb.TalkContent
+       4, // 1: chatpb.HistoryResponse.history:type_name -> chatpb.TalkContent
+       0, // 2: chatpb.Chatter.SayHello:input_type -> chatpb.HelloRequest
+       2, // 3: chatpb.Chatter.TalkToMe:input_type -> chatpb.TalkRequest
+       5, // 4: chatpb.Chatter.WhatDidYouSay:input_type -> chatpb.HistoryRequest
+       1, // 5: chatpb.Chatter.SayHello:output_type -> chatpb.HelloReply
+       3, // 6: chatpb.Chatter.TalkToMe:output_type -> chatpb.TalkResponse
+       6, // 7: chatpb.Chatter.WhatDidYouSay:output_type -> chatpb.HistoryResponse
+       5, // [5:8] is the sub-list for method output_type
+       2, // [2:5] is the sub-list for method input_type
+       2, // [2:2] is the sub-list for extension type_name
+       2, // [2:2] is the sub-list for extension extendee
+       0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_chat_proto_init() }
+func file_chat_proto_init() {
+       if File_chat_proto != nil {
+               return
+       }
+       if !protoimpl.UnsafeEnabled {
+               file_chat_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*HelloRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_chat_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*HelloReply); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_chat_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*TalkRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_chat_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*TalkResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_chat_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*TalkContent); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_chat_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*HistoryRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_chat_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*HistoryResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+       }
+       type x struct{}
+       out := protoimpl.TypeBuilder{
+               File: protoimpl.DescBuilder{
+                       GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+                       RawDescriptor: file_chat_proto_rawDesc,
+                       NumEnums:      0,
+                       NumMessages:   7,
+                       NumExtensions: 0,
+                       NumServices:   1,
+               },
+               GoTypes:           file_chat_proto_goTypes,
+               DependencyIndexes: file_chat_proto_depIdxs,
+               MessageInfos:      file_chat_proto_msgTypes,
+       }.Build()
+       File_chat_proto = out.File
+       file_chat_proto_rawDesc = nil
+       file_chat_proto_goTypes = nil
+       file_chat_proto_depIdxs = nil
+}
diff --git a/0xetc/0xgo/grpc/chatpb/chat.proto b/0xetc/0xgo/grpc/chatpb/chat.proto
new file mode 100644 (file)
index 0000000..2174a91
--- /dev/null
@@ -0,0 +1,59 @@
+syntax = "proto3";
+
+option go_package = "github.com/seantywork/go/grpc/chatpb";
+
+
+package chatpb;
+
+
+service Chatter {
+
+  rpc SayHello (HelloRequest) returns (HelloReply);
+
+  rpc TalkToMe (TalkRequest) returns (stream TalkResponse);
+
+  rpc WhatDidYouSay (HistoryRequest) returns (HistoryResponse);
+
+}
+
+message HelloRequest {
+  string name = 1;
+}
+
+message HelloReply {
+  string message = 1;
+}
+
+message TalkRequest {
+
+  string message = 1;
+
+}
+
+message TalkResponse {
+
+  TalkContent talk_content = 1;
+
+}
+
+
+message TalkContent{
+
+  int64 index = 1;
+  string content = 2;
+
+}
+
+message HistoryRequest {
+
+  int64 index = 1;
+
+}
+
+message HistoryResponse{
+
+  repeated TalkContent history = 1;
+
+}
+
+
diff --git a/0xetc/0xgo/grpc/chatpb/chat_grpc.pb.go b/0xetc/0xgo/grpc/chatpb/chat_grpc.pb.go
new file mode 100644 (file)
index 0000000..1335b34
--- /dev/null
@@ -0,0 +1,201 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+
+package chatpb
+
+import (
+       context "context"
+       grpc "google.golang.org/grpc"
+       codes "google.golang.org/grpc/codes"
+       status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// ChatterClient is the client API for Chatter service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ChatterClient interface {
+       SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
+       TalkToMe(ctx context.Context, in *TalkRequest, opts ...grpc.CallOption) (Chatter_TalkToMeClient, error)
+       WhatDidYouSay(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error)
+}
+
+type chatterClient struct {
+       cc grpc.ClientConnInterface
+}
+
+func NewChatterClient(cc grpc.ClientConnInterface) ChatterClient {
+       return &chatterClient{cc}
+}
+
+func (c *chatterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) {
+       out := new(HelloReply)
+       err := c.cc.Invoke(ctx, "/chatpb.Chatter/SayHello", in, out, opts...)
+       if err != nil {
+               return nil, err
+       }
+       return out, nil
+}
+
+func (c *chatterClient) TalkToMe(ctx context.Context, in *TalkRequest, opts ...grpc.CallOption) (Chatter_TalkToMeClient, error) {
+       stream, err := c.cc.NewStream(ctx, &Chatter_ServiceDesc.Streams[0], "/chatpb.Chatter/TalkToMe", opts...)
+       if err != nil {
+               return nil, err
+       }
+       x := &chatterTalkToMeClient{stream}
+       if err := x.ClientStream.SendMsg(in); err != nil {
+               return nil, err
+       }
+       if err := x.ClientStream.CloseSend(); err != nil {
+               return nil, err
+       }
+       return x, nil
+}
+
+type Chatter_TalkToMeClient interface {
+       Recv() (*TalkResponse, error)
+       grpc.ClientStream
+}
+
+type chatterTalkToMeClient struct {
+       grpc.ClientStream
+}
+
+func (x *chatterTalkToMeClient) Recv() (*TalkResponse, error) {
+       m := new(TalkResponse)
+       if err := x.ClientStream.RecvMsg(m); err != nil {
+               return nil, err
+       }
+       return m, nil
+}
+
+func (c *chatterClient) WhatDidYouSay(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) {
+       out := new(HistoryResponse)
+       err := c.cc.Invoke(ctx, "/chatpb.Chatter/WhatDidYouSay", in, out, opts...)
+       if err != nil {
+               return nil, err
+       }
+       return out, nil
+}
+
+// ChatterServer is the server API for Chatter service.
+// All implementations must embed UnimplementedChatterServer
+// for forward compatibility
+type ChatterServer interface {
+       SayHello(context.Context, *HelloRequest) (*HelloReply, error)
+       TalkToMe(*TalkRequest, Chatter_TalkToMeServer) error
+       WhatDidYouSay(context.Context, *HistoryRequest) (*HistoryResponse, error)
+       mustEmbedUnimplementedChatterServer()
+}
+
+// UnimplementedChatterServer must be embedded to have forward compatible implementations.
+type UnimplementedChatterServer struct {
+}
+
+func (UnimplementedChatterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) {
+       return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
+}
+func (UnimplementedChatterServer) TalkToMe(*TalkRequest, Chatter_TalkToMeServer) error {
+       return status.Errorf(codes.Unimplemented, "method TalkToMe not implemented")
+}
+func (UnimplementedChatterServer) WhatDidYouSay(context.Context, *HistoryRequest) (*HistoryResponse, error) {
+       return nil, status.Errorf(codes.Unimplemented, "method WhatDidYouSay not implemented")
+}
+func (UnimplementedChatterServer) mustEmbedUnimplementedChatterServer() {}
+
+// UnsafeChatterServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ChatterServer will
+// result in compilation errors.
+type UnsafeChatterServer interface {
+       mustEmbedUnimplementedChatterServer()
+}
+
+func RegisterChatterServer(s grpc.ServiceRegistrar, srv ChatterServer) {
+       s.RegisterService(&Chatter_ServiceDesc, srv)
+}
+
+func _Chatter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+       in := new(HelloRequest)
+       if err := dec(in); err != nil {
+               return nil, err
+       }
+       if interceptor == nil {
+               return srv.(ChatterServer).SayHello(ctx, in)
+       }
+       info := &grpc.UnaryServerInfo{
+               Server:     srv,
+               FullMethod: "/chatpb.Chatter/SayHello",
+       }
+       handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+               return srv.(ChatterServer).SayHello(ctx, req.(*HelloRequest))
+       }
+       return interceptor(ctx, in, info, handler)
+}
+
+func _Chatter_TalkToMe_Handler(srv interface{}, stream grpc.ServerStream) error {
+       m := new(TalkRequest)
+       if err := stream.RecvMsg(m); err != nil {
+               return err
+       }
+       return srv.(ChatterServer).TalkToMe(m, &chatterTalkToMeServer{stream})
+}
+
+type Chatter_TalkToMeServer interface {
+       Send(*TalkResponse) error
+       grpc.ServerStream
+}
+
+type chatterTalkToMeServer struct {
+       grpc.ServerStream
+}
+
+func (x *chatterTalkToMeServer) Send(m *TalkResponse) error {
+       return x.ServerStream.SendMsg(m)
+}
+
+func _Chatter_WhatDidYouSay_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+       in := new(HistoryRequest)
+       if err := dec(in); err != nil {
+               return nil, err
+       }
+       if interceptor == nil {
+               return srv.(ChatterServer).WhatDidYouSay(ctx, in)
+       }
+       info := &grpc.UnaryServerInfo{
+               Server:     srv,
+               FullMethod: "/chatpb.Chatter/WhatDidYouSay",
+       }
+       handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+               return srv.(ChatterServer).WhatDidYouSay(ctx, req.(*HistoryRequest))
+       }
+       return interceptor(ctx, in, info, handler)
+}
+
+// Chatter_ServiceDesc is the grpc.ServiceDesc for Chatter service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Chatter_ServiceDesc = grpc.ServiceDesc{
+       ServiceName: "chatpb.Chatter",
+       HandlerType: (*ChatterServer)(nil),
+       Methods: []grpc.MethodDesc{
+               {
+                       MethodName: "SayHello",
+                       Handler:    _Chatter_SayHello_Handler,
+               },
+               {
+                       MethodName: "WhatDidYouSay",
+                       Handler:    _Chatter_WhatDidYouSay_Handler,
+               },
+       },
+       Streams: []grpc.StreamDesc{
+               {
+                       StreamName:    "TalkToMe",
+                       Handler:       _Chatter_TalkToMe_Handler,
+                       ServerStreams: true,
+               },
+       },
+       Metadata: "chat.proto",
+}
diff --git a/0xetc/0xgo/grpc/chatpb/protoc.sh b/0xetc/0xgo/grpc/chatpb/protoc.sh
new file mode 100755 (executable)
index 0000000..98dc947
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+export PATH="$PATH:$(go env GOPATH)/bin"
+
+protoc --go_out=. --go_opt=paths=source_relative \
+    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
+    ./chat.proto
\ No newline at end of file
diff --git a/0xetc/0xgo/grpc/client/certs/ca.pem b/0xetc/0xgo/grpc/client/certs/ca.pem
new file mode 100644 (file)
index 0000000..bce9d76
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/zCCAuegAwIBAgIUfHY1zHmm3s9LbMImhCYdyb5bCwYwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MTEwNzA1NDJaFw0zNDA1MDkwNzA1
+NDJaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCmEElAsjMBtS3yHcp6j3HOU0QGfGL8j5AacRqw8mt6xAtgWqZmwDD/Bkn8
+9tYV+quRY8ZgQM2imtV78NtVQedsrNJlCnAi1krJquTEv6UMf6k91h2pEMghvP05
+Lenr6EpKPlHvpWoO6cfZa3N9cogwn5WaApQYvX9O9cGbN6dSjd/mwSddqo+LBy27
+BQEfDIieeVVc4Kcb61ZY16tYWqB9GybtaNoElZE1lsrBVJOnX2hDSKj+yoR46DgI
+BsDkofCKCUrTI4YcUOSYS1sd/JbEeRkPvwXg/2BtUR9W29vV1pYVFBmzqFiC0sbf
+9XQhy30fnQjJrGrWJA6RDVLYnSykNOoYNuLkGgm1ZlGlipwrbBz1kIP99554dXGN
+4lnXk7js7l5lEsOo/c3lDtmjYRQlmPepyD2KCEbbbkK/u3DcMnS+AKL5m2VQuwvw
+LTTDTvvXF+9yV69c6pRHh/w3JSPVh3HgMSe6dKc5S0CDunXh+cBNk9iIvKT7WKqJ
+m5NuHITVVxOWlbBH2Wl1AOjzFjiYVLMvFNRAT3Cwh6h0ewWRYxm9bdLspZsEHhQK
+Gz10f8KiK+Z9wNCRCKp1TMEsgXw7Q5jdzQNwFjaAu0uxTl4x5syCWI2zW2cPPwCg
+SLSsozxbeson2Zj5/9ZDQngrbwCq0tEZPgHZaujW7igKQfwXdwIDAQABo1MwUTAd
+BgNVHQ4EFgQUIm4H+A+/zncV06Pm4qSUetmIUBswHwYDVR0jBBgwFoAUIm4H+A+/
+zncV06Pm4qSUetmIUBswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
+AgEAJ12ZZyIvb0LQgsZuct0u54/23K0aula1B6vIZ/XxPmdb3wk87hL1D87Es2MU
+MbM/5ZXVIK9SWB4pYqP2hxJq4Pcm/4HPxUrw3Cl3lh2uMnnYikX2IfofypwOaFUY
+e5HMjO9r4AnosbxS85gVHRIcPKfQJdSEYUb/gPX9tpycWKse6FzE69p9dvh4oSBe
+LTDAkNrkn5GC4Y/RqCfbhFytytEaUG/GN9e3P1Ye9Q6mxYXgkDC51+F4/EMzR1sp
+rrR1mvP2y43JLV4WsUAhvNJfkIhd2IcKo7IYol4wYSb8HVt9h47KpTUzEIG/SS3+
+FuO/oc2Am27jKsj36IREA8gN0rQdIP8S3JQYy0Tp5+RYuk+l4p8uKzu+NCabKEh9
+ypINTKyyYRAWaQ5ns+xKuIEcIEroakL0fRvcivYBoea9Tk/P2cSYE8MBkjwfgsFp
+8AQIF5AZhXV/428orAMUYj0OvDD3mx5mBwiD/6iV8PFpp0VWMsyF6e6KRV7PXJWV
+r9GMfdMDaqg9+2Hf5ezBkvh2T50xJpc9BHoN6s5h4s+IE6nXzksc9OSXhfbSDlDZ
+G/FNuIEV4rAZv1lAa3qa+JmZKYi+Ex66IS4FyGLFHAYDfGPyJKOwrLvu6FDDzDLP
+jpkR2jP/4Duhyy0xX9UdMo3s88cuAMJG/GbaA3hjbibmw84=
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/grpc/client/certs/ca_priv.pem b/0xetc/0xgo/grpc/client/certs/ca_priv.pem
new file mode 100644 (file)
index 0000000..2dd7175
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+29CM/6ulbLzZRmRhZ6iH2H+MVH/6WA==
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/grpc/client/certs/ca_pub.pem b/0xetc/0xgo/grpc/client/certs/ca_pub.pem
new file mode 100644 (file)
index 0000000..64c7019
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAphBJQLIzAbUt8h3Keo9x
+zlNEBnxi/I+QGnEasPJresQLYFqmZsAw/wZJ/PbWFfqrkWPGYEDNoprVe/DbVUHn
+bKzSZQpwItZKyarkxL+lDH+pPdYdqRDIIbz9OS3p6+hKSj5R76VqDunH2WtzfXKI
+MJ+VmgKUGL1/TvXBmzenUo3f5sEnXaqPiwctuwUBHwyInnlVXOCnG+tWWNerWFqg
+fRsm7WjaBJWRNZbKwVSTp19oQ0io/sqEeOg4CAbA5KHwiglK0yOGHFDkmEtbHfyW
+xHkZD78F4P9gbVEfVtvb1daWFRQZs6hYgtLG3/V0Ict9H50Iyaxq1iQOkQ1S2J0s
+pDTqGDbi5BoJtWZRpYqcK2wc9ZCD/feeeHVxjeJZ15O47O5eZRLDqP3N5Q7Zo2EU
+JZj3qcg9ighG225Cv7tw3DJ0vgCi+ZtlULsL8C00w0771xfvclevXOqUR4f8NyUj
+1Ydx4DEnunSnOUtAg7p14fnATZPYiLyk+1iqiZuTbhyE1VcTlpWwR9lpdQDo8xY4
+mFSzLxTUQE9wsIeodHsFkWMZvW3S7KWbBB4UChs9dH/CoivmfcDQkQiqdUzBLIF8
+O0OY3c0DcBY2gLtLsU5eMebMgliNs1tnDz8AoEi0rKM8W3rKJ9mY+f/WQ0J4K28A
+qtLRGT4B2Wro1u4oCkH8F3cCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/grpc/client/main.go b/0xetc/0xgo/grpc/client/main.go
new file mode 100644 (file)
index 0000000..e3c81d7
--- /dev/null
@@ -0,0 +1,113 @@
+package main
+
+import (
+       "context"
+       "crypto/tls"
+       "crypto/x509"
+       "flag"
+       "io"
+       "log"
+       "os"
+       "time"
+
+       pb "github.com/seantywork/go/grpc/chatpb"
+       "google.golang.org/grpc"
+       "google.golang.org/grpc/credentials"
+)
+
+const (
+       defaultName = "world"
+)
+
+var (
+       addr = flag.String("addr", "localhost:50051", "the address to connect to")
+       name = flag.String("name", defaultName, "Name to greet")
+)
+
+func main() {
+       flag.Parse()
+
+       pemServerCA, err := os.ReadFile("certs/ca.pem")
+       if err != nil {
+               log.Fatalf("failed to load cert")
+       }
+
+       certPool := x509.NewCertPool()
+       if !certPool.AppendCertsFromPEM(pemServerCA) {
+               log.Fatalf("failed to add server CA's certificate")
+       }
+
+       config := &tls.Config{
+               RootCAs: certPool,
+       }
+
+       newTLSconfig := credentials.NewTLS(config)
+
+       conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(newTLSconfig))
+       if err != nil {
+               log.Fatalf("did not connect: %v", err)
+       }
+       defer conn.Close()
+       c := pb.NewChatterClient(conn)
+
+       ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+       defer cancel()
+       r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})
+       if err != nil {
+               log.Fatalf("could not greet: %v", err)
+       }
+
+       my_id := r.GetMessage()
+
+       log.Printf("Greeting: %s", r.GetMessage())
+
+       r_stream, err := c.TalkToMe(ctx, &pb.TalkRequest{Message: my_id})
+
+       if err != nil {
+               log.Fatalf("could not get to talk to: %v", err)
+       }
+
+       done := make(chan bool)
+
+       recent_id := 0
+
+       go func() {
+               for {
+                       resp, err := r_stream.Recv()
+                       if err == io.EOF {
+                               done <- true
+                               return
+                       }
+                       if err != nil {
+                               log.Fatalf("cannot receive %v", err)
+                       }
+
+                       tc := resp.GetTalkContent()
+
+                       recent_id = int(tc.GetIndex())
+
+                       log.Printf("Resp received: %s", tc.GetContent())
+               }
+       }()
+
+       <-done
+
+       r2, err := c.WhatDidYouSay(ctx, &pb.HistoryRequest{Index: int64(recent_id)})
+
+       if err != nil {
+               log.Fatalf("could not ask: %v", err)
+       }
+
+       it_said := r2.GetHistory()
+
+       for i := 0; i < len(it_said); i++ {
+
+               at := it_said[i].GetIndex()
+
+               word := it_said[i].GetContent()
+
+               log.Printf("it said [%d]: %s", at, word)
+
+       }
+
+}
diff --git a/0xetc/0xgo/grpc/server/certs/server.csr b/0xetc/0xgo/grpc/server/certs/server.csr
new file mode 100644 (file)
index 0000000..aecbae8
--- /dev/null
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAwnG8PiklMSrK05Umy6hCjGUVhpfyWPfOs2siwkYh
+0ysjZZ0sYyupzGhTmsQQDI61TVjn14H/fK6JcNCHmfMIim9JET8rhOhxUMURgNJn
+CT7TM5SYw8a/EM4Kns5GTAqfA9+LUbPCurWT3cNmJlujJFvp6mnfsZv/bjmcPddt
+F+vj/hY9RiPrj2esvmXcTPthkD+slisHmi0myeV89Nfqoekwdumzc0zPaBtPNw7o
+g+AuKL5Msxj018WFVe17MV/uabxXIWK7kA3PUdT2doX9QWji/M+vnX00bnqoG6gE
+HlfK1IgrHTXLsp0qE+RMyIhcgLSSy+L8YxuU6y0tVhI3zY4pPFPJNileetswLMlO
+2jOMndEKjk49zjTiapmGzoK4InwhfbiQlAysWoCukIcRv0AgerWoXVYZ0sECi28v
+P+ZuKallh1Yl+w0g8ZyKEb82KcN+BleexSTqEYoMXxy2Qk+q+qctzwcjosRL3VtV
+vrwdTfczyAX1FCPB2+lDrbHNBt4NYEahGNHN+yrWURMeavrfuP5/osUo55bnMetw
+PvMbQ737IaS7blogvKvKNUEgfuniQDXMmTOI/wKWSLt5kzv/FOKVjCcUqL/WJchS
+AlE/NpATAN+pZIBZkfnqxEX5ERAd6Melngyv549kExnPIiphWxhL28ae6okVabMh
+T9ECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBjyokE3Sg/SWmcHRB95xJAW7rX
+pFEatk+jC7kcChCltyqJjqsHrrv3xhLNO7oZ06uwYVgxSwVpLmEXSaIwvLdjdSQm
+oOdXAOfyJNyqbzzNf8jBOq6g8tpM6mMCOS/qGM2dvH6lUTi4Rb3Zo08ArStMyFbI
+GMh411ldy3lN2qAzascCrthtnMCqckEgs53hy8GEybb8qsqFC26GNUWFddab1lnj
+1OZv+oNXD7iw+KB99wQm57Mj6ag1mp6sCbBgQefNGF0FCTVmquubNEyo0LV0u7PT
+hVNG9dsVEoNQJiulJrLwZ0NxH/Do40Mdmmr677WWG2SL00kD/cADgA6TnXk5UeK9
+WeCec8uigp+rCHDyQV8SgsPiM92OZnFHuXGuqwuyvcSdb6oRSl0AJ0AigSmIA8m0
+1kwytUoh910wP4Bv2HIk+R8XnSxuqQzPeooV3swuiNSA0HHP2OR8mGZU4rLokgOQ
+/rX1Oznqm7Vt6YYvh1EzdnPvYDv0e3XR5LtzUGhVF9VFAx8oIJ+UFnqHeTYEVbPr
+qanZ6YCJj2F5lUYUz7ks/INVSDIOBiYnnmzOtUAbnphB9enNdhEGlcLLPpATFyhS
+sriGg+hPeBEXL8QTmO2s96mcT7A9wDR5VgF9FcdmIKZWy+oXmM0hp+TIOdT3KkkX
+YO6XW8nXYfog/hv98w==
+-----END CERTIFICATE REQUEST-----
diff --git a/0xetc/0xgo/grpc/server/certs/server.key b/0xetc/0xgo/grpc/server/certs/server.key
new file mode 100644 (file)
index 0000000..8e0c7d1
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+/6TjB2rKRjS0oMT76Qj95oAiG1IR
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/grpc/server/certs/server.pem b/0xetc/0xgo/grpc/server/certs/server.pem
new file mode 100644 (file)
index 0000000..0329993
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIFCTCCAvGgAwIBAgIUK0kjySLAqJHUbhc5Q0upk/b6HhQwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MTEwNzA1NDRaFw0yNTA1MTEwNzA1
+NDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMJxvD4pJTEqytOVJsuoQoxlFYaX8lj3zrNrIsJGIdMrI2WdLGMr
+qcxoU5rEEAyOtU1Y59eB/3yuiXDQh5nzCIpvSRE/K4TocVDFEYDSZwk+0zOUmMPG
+vxDOCp7ORkwKnwPfi1Gzwrq1k93DZiZboyRb6epp37Gb/245nD3XbRfr4/4WPUYj
+649nrL5l3Ez7YZA/rJYrB5otJsnlfPTX6qHpMHbps3NMz2gbTzcO6IPgLii+TLMY
+9NfFhVXtezFf7mm8VyFiu5ANz1HU9naF/UFo4vzPr519NG56qBuoBB5XytSIKx01
+y7KdKhPkTMiIXIC0ksvi/GMblOstLVYSN82OKTxTyTYpXnrbMCzJTtozjJ3RCo5O
+Pc404mqZhs6CuCJ8IX24kJQMrFqArpCHEb9AIHq1qF1WGdLBAotvLz/mbimpZYdW
+JfsNIPGcihG/NinDfgZXnsUk6hGKDF8ctkJPqvqnLc8HI6LES91bVb68HU33M8gF
+9RQjwdvpQ62xzQbeDWBGoRjRzfsq1lETHmr637j+f6LFKOeW5zHrcD7zG0O9+yGk
+u25aILyryjVBIH7p4kA1zJkziP8Clki7eZM7/xTilYwnFKi/1iXIUgJRPzaQEwDf
+qWSAWZH56sRF+REQHejHpZ4Mr+ePZBMZzyIqYVsYS9vGnuqJFWmzIU/RAgMBAAGj
+WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUKDVEnh6vH1beZ6r4
+aF2jgcXZTLUwHwYDVR0jBBgwFoAUIm4H+A+/zncV06Pm4qSUetmIUBswDQYJKoZI
+hvcNAQELBQADggIBAC6pDuSa+lUxW0cbf7Tzvo5NbB7tix4/XY6fNviSzwdpjAh+
+c9VqHoTT24j35bMx76Tlg7aGJbKKFsjk++njM3u/Digb7A95FQ/0Ly5myMpkjK8D
+TedhTx2vEPbUY+nG2Au4yRvAN0WU7vDypTYPZ0AQVRokq2zeUmP60BE7xnb6+NdL
+fJwTis4QX653S0D68aoV0w4RtiB9VhitODeEhwvsWGGqa+I20XqX3eI0KI3JkMCz
+9fJtLRKn70Gnidh1TCfvlnfmWqoSTZz5/UGEBKa7bbNXIgW1S0EZYD+D583XOA9o
+NKv8Ektw/lhwRzsfN0j1SNzPhBXX7TQt8eZCdGopw9UlXzF1+BZlQuG+MVh9JTzP
+xXW/Uo7CmPMT5jZSQsfQb0mvG5JRQQ4x+4TlmA67OxBMM8+ko9W/4TJf9yxAmRIu
+GLVS5xjgvG5yo9ckcexy/OEY9qXFWgWXn8pfbbNWW8CoL1Mk1hLICdxrUL6pyrFC
+fdHhPJcDJPFaILqSRhT77UKpm4Y29V97ikb6sIjKWj1d2Z49yZN4yjtNQFeWlkVm
+CuOFzHAHpI7SnFz9AzH1vwaM4XI+v6pTulrkXlCVt4+6GLJAXHUKBDiuFnEqqp0J
+Mkx65S017e8WFTxLcmTbcKX/w15+2pi0kiCbm2IDiTEDJFzAjUhL7OJvceGg
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/grpc/server/certs/server.pub b/0xetc/0xgo/grpc/server/certs/server.pub
new file mode 100644 (file)
index 0000000..28a26b8
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwnG8PiklMSrK05Umy6hC
+jGUVhpfyWPfOs2siwkYh0ysjZZ0sYyupzGhTmsQQDI61TVjn14H/fK6JcNCHmfMI
+im9JET8rhOhxUMURgNJnCT7TM5SYw8a/EM4Kns5GTAqfA9+LUbPCurWT3cNmJluj
+JFvp6mnfsZv/bjmcPddtF+vj/hY9RiPrj2esvmXcTPthkD+slisHmi0myeV89Nfq
+oekwdumzc0zPaBtPNw7og+AuKL5Msxj018WFVe17MV/uabxXIWK7kA3PUdT2doX9
+QWji/M+vnX00bnqoG6gEHlfK1IgrHTXLsp0qE+RMyIhcgLSSy+L8YxuU6y0tVhI3
+zY4pPFPJNileetswLMlO2jOMndEKjk49zjTiapmGzoK4InwhfbiQlAysWoCukIcR
+v0AgerWoXVYZ0sECi28vP+ZuKallh1Yl+w0g8ZyKEb82KcN+BleexSTqEYoMXxy2
+Qk+q+qctzwcjosRL3VtVvrwdTfczyAX1FCPB2+lDrbHNBt4NYEahGNHN+yrWURMe
+avrfuP5/osUo55bnMetwPvMbQ737IaS7blogvKvKNUEgfuniQDXMmTOI/wKWSLt5
+kzv/FOKVjCcUqL/WJchSAlE/NpATAN+pZIBZkfnqxEX5ERAd6Melngyv549kExnP
+IiphWxhL28ae6okVabMhT9ECAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/grpc/server/main.go b/0xetc/0xgo/grpc/server/main.go
new file mode 100644 (file)
index 0000000..31a4d85
--- /dev/null
@@ -0,0 +1,202 @@
+package main
+
+import (
+       "context"
+       "crypto/tls"
+       "flag"
+       "fmt"
+       "log"
+       "net"
+       "strconv"
+       "time"
+
+       pb "github.com/seantywork/go/grpc/chatpb"
+       "google.golang.org/grpc"
+       "google.golang.org/grpc/credentials"
+)
+
+var allowed_names []string
+
+var user_idx int = 0
+
+var loop_idx int = 0
+
+var word_idx int = 0
+
+var words = []string{
+       "hello",
+       "my",
+       "name",
+       "is",
+       "test",
+       "program",
+}
+
+var history pb.HistoryResponse
+
+var (
+       port = flag.Int("port", 50051, "The server port")
+)
+
+type server struct {
+       pb.UnimplementedChatterServer
+}
+
+func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
+       log.Printf("Received: %v", in.GetName())
+
+       allowing := in.GetName() + "-" + strconv.FormatInt(int64(user_idx), 10)
+
+       user_idx += 1
+
+       allowed_names = append(allowed_names, allowing)
+
+       return &pb.HelloReply{Message: allowing}, nil
+}
+
+func (s *server) TalkToMe(in *pb.TalkRequest, srv pb.Chatter_TalkToMeServer) error {
+
+       log.Printf("Received: %v", "talk")
+
+       if len(allowed_names) == 0 {
+
+               return fmt.Errorf("no allowed user")
+       }
+
+       hit := 0
+       name := ""
+
+       for i := 0; i < len(allowed_names); i++ {
+
+               name = in.GetMessage()
+
+               if name == allowed_names[i] {
+
+                       log.Printf("found: %v", name)
+
+                       hit = 1
+
+                       break
+
+               }
+
+       }
+
+       if hit != 1 {
+
+               return fmt.Errorf("failed to retrieve user")
+
+       }
+
+       max_idx := len(words) - 1
+
+       for {
+
+               if loop_idx > max_idx {
+
+                       loop_idx = 0
+
+                       break
+
+               }
+
+               tc := pb.TalkContent{
+                       Index:   int64(word_idx),
+                       Content: words[word_idx],
+               }
+
+               history.History = append(history.History, &tc)
+
+               resp := pb.TalkResponse{
+                       TalkContent: &tc,
+               }
+
+               if err := srv.Send(&resp); err != nil {
+
+                       log.Printf("send error %v", err)
+
+               }
+
+               loop_idx += 1
+
+               word_idx += 1
+
+               time.Sleep(time.Second * 1)
+
+       }
+
+       return nil
+}
+
+func (s *server) WhatDidYouSay(ctx context.Context, in *pb.HistoryRequest) (*pb.HistoryResponse, error) {
+
+       log.Printf("Received: %v", in.GetIndex())
+
+       if len(history.History) < 3 {
+
+               null_array := []*pb.TalkContent{}
+
+               hr := pb.HistoryResponse{
+                       History: null_array,
+               }
+
+               return &hr, fmt.Errorf("not enough has been said")
+
+       }
+
+       idx_from := in.GetIndex()
+
+       i := 0
+
+       resp_array := []*pb.TalkContent{}
+
+       for {
+
+               if i > 2 {
+                       break
+               }
+
+               target_idx := int(idx_from) - i
+
+               history_el := history.History[target_idx]
+
+               resp_array = append(resp_array, history_el)
+
+               i += 1
+       }
+
+       resp := pb.HistoryResponse{
+               History: resp_array,
+       }
+
+       return &resp, nil
+}
+
+func main() {
+       flag.Parse()
+
+       serverCert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key")
+       if err != nil {
+               log.Fatalf("failed to load cert and key")
+       }
+
+       config := &tls.Config{
+               Certificates: []tls.Certificate{serverCert},
+       }
+
+       newTLSconfig := credentials.NewTLS(config)
+
+       lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
+       if err != nil {
+               log.Fatalf("failed to listen: %v", err)
+       }
+       s := grpc.NewServer(
+               grpc.Creds(newTLSconfig),
+       )
+
+       pb.RegisterChatterServer(s, &server{})
+       log.Printf("server listening at %v", lis.Addr())
+       if err := s.Serve(lis); err != nil {
+               log.Fatalf("failed to serve: %v", err)
+       }
+}
diff --git a/0xetc/0xgo/gsheet/.gitignore b/0xetc/0xgo/gsheet/.gitignore
new file mode 100644 (file)
index 0000000..1eb0597
--- /dev/null
@@ -0,0 +1,2 @@
+config.yaml
+token.json
\ No newline at end of file
diff --git a/0xetc/0xgo/gsheet/Makefile b/0xetc/0xgo/gsheet/Makefile
new file mode 100644 (file)
index 0000000..8cc72f9
--- /dev/null
@@ -0,0 +1,7 @@
+all:
+
+       go build -o gsheet.out .
+
+clean:
+
+       rm -r *.out
\ No newline at end of file
diff --git a/0xetc/0xgo/gsheet/core/modules.go b/0xetc/0xgo/gsheet/core/modules.go
new file mode 100644 (file)
index 0000000..c3a2b61
--- /dev/null
@@ -0,0 +1,111 @@
+package core
+
+import (
+       "context"
+       "encoding/json"
+       "fmt"
+       "log"
+       "net/http"
+       "os"
+
+       "golang.org/x/oauth2"
+       "gopkg.in/yaml.v3"
+)
+
+type GsheetConfig struct {
+       CRED_PATH string   `yaml:"CRED_PATH"`
+       SHEET_ID  string   `yaml:"SHEET_ID"`
+       SHEETS    []string `yaml:"SHEETS"`
+}
+
+func GetGsheetConfig() (GsheetConfig, error) {
+
+       var gsh_conf GsheetConfig
+
+       file_b, err := os.ReadFile("./config.yaml")
+
+       if err != nil {
+
+               return gsh_conf, fmt.Errorf("failed to read conf: %s", err.Error())
+
+       }
+
+       err = yaml.Unmarshal(file_b, &gsh_conf)
+
+       if err != nil {
+
+               return gsh_conf, fmt.Errorf("failed to read conf: %s", err.Error())
+
+       }
+
+       return gsh_conf, nil
+}
+
+func GetGsheetClient(config *oauth2.Config) (*http.Client, error) {
+
+       var http_client *http.Client
+
+       tokFile := "token.json"
+       tok, err := GetGsheetTokenFromFile(tokFile)
+       if err != nil {
+               tok, err = GetGsheetTokenFromWeb(config)
+
+               if err != nil {
+
+                       return http_client, fmt.Errorf("failed to get gsheet client: %s", err.Error())
+
+               }
+
+               SaveGsheetToken(tokFile, tok)
+       }
+
+       http_client = config.Client(context.Background(), tok)
+
+       return http_client, nil
+}
+
+func GetGsheetTokenFromWeb(config *oauth2.Config) (*oauth2.Token, error) {
+
+       var tok *oauth2.Token
+
+       authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
+
+       fmt.Printf("Go to the following link in your browser then type the "+
+               "authorization code: \n%v\n", authURL)
+
+       var authCode string
+
+       if _, err := fmt.Scan(&authCode); err != nil {
+
+               return tok, fmt.Errorf("failed to get web token: %s", err.Error())
+       }
+
+       tok, err := config.Exchange(context.TODO(), authCode)
+
+       if err != nil {
+               return tok, fmt.Errorf("unable to retrive token from web: %s", err.Error())
+       }
+
+       return tok, nil
+}
+
+func GetGsheetTokenFromFile(file string) (*oauth2.Token, error) {
+       f, err := os.Open(file)
+       if err != nil {
+               return nil, err
+       }
+       defer f.Close()
+       tok := &oauth2.Token{}
+       err = json.NewDecoder(f).Decode(tok)
+       return tok, err
+}
+
+func SaveGsheetToken(path string, token *oauth2.Token) {
+       fmt.Printf("Saving credential file to: %s\n", path)
+       f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
+       if err != nil {
+               log.Fatalf("Unable to cache oauth token: %v", err)
+       }
+       defer f.Close()
+       json.NewEncoder(f).Encode(token)
+}
diff --git a/0xetc/0xgo/gsheet/main.go b/0xetc/0xgo/gsheet/main.go
new file mode 100644 (file)
index 0000000..40b9d7b
--- /dev/null
@@ -0,0 +1,110 @@
+package main
+
+import (
+       "context"
+       "fmt"
+       "os"
+
+       "golang.org/x/oauth2/google"
+       "google.golang.org/api/option"
+       "google.golang.org/api/sheets/v4"
+
+       gshcore "github.com/seantywork/go/gsheet/core"
+)
+
+func main() {
+
+       ctx := context.Background()
+
+       gsh_conf, err := gshcore.GetGsheetConfig()
+
+       if err != nil {
+
+               fmt.Println(err.Error())
+
+               return
+
+       }
+
+       cred_path := gsh_conf.CRED_PATH
+
+       cred_b, err := os.ReadFile(cred_path)
+
+       if err != nil {
+
+               fmt.Println(err.Error())
+
+               return
+       }
+
+       client_config, err := google.ConfigFromJSON(cred_b, "https://www.googleapis.com/auth/spreadsheets.readonly")
+
+       if err != nil {
+
+               fmt.Println(err.Error())
+
+               return
+       }
+
+       client, err := gshcore.GetGsheetClient(client_config)
+
+       if err != nil {
+
+               fmt.Println(err.Error())
+
+               return
+
+       }
+
+       srv, err := sheets.NewService(ctx, option.WithHTTPClient(client))
+
+       if err != nil {
+
+               fmt.Println(err.Error())
+
+               return
+
+       }
+
+       sheet_id := gsh_conf.SHEET_ID
+
+       sheets_len := len(gsh_conf.SHEETS)
+
+       for i := 0; i < sheets_len; i++ {
+
+               target_sheet := gsh_conf.SHEETS[i]
+
+               resp, err := srv.Spreadsheets.Values.Get(sheet_id, target_sheet).Do()
+
+               if err != nil {
+
+                       fmt.Printf("failed to get values from: %s: %s\n", target_sheet, err.Error())
+
+                       return
+
+               }
+
+               if len(resp.Values) == 0 {
+
+                       fmt.Printf("no data found for: %s\n", target_sheet)
+
+               } else {
+
+                       for _, row := range resp.Values {
+
+                               col_len := len(row)
+
+                               for j := 0; j < col_len; j++ {
+
+                                       fmt.Printf("%s ", row[j])
+
+                               }
+
+                               fmt.Printf("\n")
+
+                       }
+               }
+
+       }
+
+}
diff --git a/0xetc/0xgo/gui/main.go b/0xetc/0xgo/gui/main.go
new file mode 100644 (file)
index 0000000..7dc372a
--- /dev/null
@@ -0,0 +1,22 @@
+package main
+
+import (
+       "fyne.io/fyne/v2/app"
+       "fyne.io/fyne/v2/container"
+       "fyne.io/fyne/v2/widget"
+)
+
+func main() {
+       a := app.New()
+       w := a.NewWindow("Hello")
+
+       hello := widget.NewLabel("Hello Fyne!")
+       w.SetContent(container.NewVBox(
+               hello,
+               widget.NewButton("Hi!", func() {
+                       hello.SetText("Welcome :)")
+               }),
+       ))
+
+       w.ShowAndRun()
+}
diff --git a/0xetc/0xgo/http/Makefile b/0xetc/0xgo/http/Makefile
new file mode 100644 (file)
index 0000000..804008c
--- /dev/null
@@ -0,0 +1,9 @@
+all:
+
+       go build -o client/client.out ./client
+
+       go build -o server/server.out ./server
+
+
+
+
diff --git a/0xetc/0xgo/http/certgen.sh b/0xetc/0xgo/http/certgen.sh
new file mode 100755 (executable)
index 0000000..bdb69b5
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+rm -r ./client/certs/*
+
+rm -r ./server/certs/*
+
+
+mkdir -p ./client/certs
+
+mkdir -p ./server/certs
+
+echo "root generating...."
+
+openssl genrsa -out ./client/certs/ca_priv.pem 4096
+
+openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
+
+openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
+
+echo "server key pair, csr generating...."
+
+openssl genrsa -out ./server/certs/server.key 4096
+
+openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
+
+openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
+
+echo "signing requests for server...."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
+
+
+echo "done!"
\ No newline at end of file
diff --git a/0xetc/0xgo/http/client/certs/ca.pem b/0xetc/0xgo/http/client/certs/ca.pem
new file mode 100644 (file)
index 0000000..4468555
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/zCCAuegAwIBAgIUTe8SZnDGd5n9bMbehALXP2GGBeEwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODM2NThaFw0zNDEwMzEwODM2
+NThaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQDTv+CZXgDHH7Vh9wqa63EwW7suKDOaKsL94Hcf6wu2LccF5mlouuWbB2U1
+Ji1SoFrsZ1apqR5x/1xk99UN5vagP8zJSvAIRok46xbab+Ci2L7CbKofENm9VhS5
+qAZuGb824pcoKCsywoectrGRrGvL+2dCJvmvSTimqz+/Pb8b5ur22y9zze3l67RB
+ggkQZTFKL8URNP1LJWosnI5h6l8+3tAa78Bm6lLVmb3A6eP/DP1f8A7A5iO7z/EP
+qoCPP5yf3/9+nWhZIJEEO5CKQFiRdo/RSAaGK+eY0tfvT5hFq89PIR6PHvggAwgB
+sTpBFeuSuEgdcTQ7v6yChB3t+0jh1YtiuSmjOQ+4Uix8TYlGMf0vaIVPKzUEFYB9
+BYLXWN9BvQmyMLeqxOXgGvGUmUtXKfesQZIJ1ro8jl0h+Isjv61dQGgs01DDvBV8
+pKzs+vB0tcHP6+V7XSu98SCdM6i4w2aerXZO7KVfj3gRpb+IRcvGXvK0j2al4h23
+HTf2lVNBKHIQYPSZAr+wKo4oLJqWrVKdI34qB0GBprz8bYTxWM7UZJtu6MnJhyFT
+O0fS6hbD266HyrQILpURRmc/8AL+I/U5oVAK1U+6ViGKNcyqpN/d6rwNYFyKLnab
+T5VcsyLFPoutizjGo4wFTab83ddkwLOR14TdLP+Xq0d0DZ6w6QIDAQABo1MwUTAd
+BgNVHQ4EFgQUCI7gGU1vOV0ENPD/eujH47lzH6kwHwYDVR0jBBgwFoAUCI7gGU1v
+OV0ENPD/eujH47lzH6kwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
+AgEAnF2DWc+A6P85ND6T4yqQ6Xr+S5qTYl2d5AUKDaU1IEg6z6eMUxnu5DZRukD5
+HLSUJa13qRR935oth/EG+r78td3BFmbS9eMjlp+FA3Bkh9PIxtfj0IaUoitiSV1c
+kg6FGE7XYfSYh6TkCK5WN8fJ0Qtr40PyI2Uz9UfMIbMEtGtsJZ5enG5H6IGp5cCo
+5+pKRwdMBObeiceh28nloiktJJQrIbOWF/SaiL5U2+zmeEpNO0w041BwObBttBE7
+lB1MtgSsPuDgKjOVrWOjYTWg7eA5arZ1Ush8p8POYtJiWV5mmOK/ancKjvj05Ouv
+HTZvfDNBpMWG7DsMgJINvuqLXSbBfDk5UGw8VCdhtqW/3wuR9Wspt6eIgxst/JPD
+pXP3ddxJ3xeNE3cujZTQWASNIcXRbEU0AF/leqydOdtDWLQCI4jWKpGx+ZtZ3c96
+8uJwmI3V8ILZF75H1z3JyCqdmFHHQw+n3Q6CFMqOFXucKsHK8aEH8h48yMhS90wN
+VXJ9pbI2TYi5bBn+XmImcRv0kd7mASF/1n9s1hK5r/dNHbEhyCNNl8kBnIoQak4g
+EcLIma7XPZJg4g00JnR+w8Zx4YG5oeNIFii+OxCHwNSWYYNE/mHrzeJvGi2NQuHW
+vIVlZgebDgPxkxd+jvcnxMm6Dn9TOqWHiTUiPxkQu05rgXg=
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/http/client/certs/ca_priv.pem b/0xetc/0xgo/http/client/certs/ca_priv.pem
new file mode 100644 (file)
index 0000000..ad15298
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+22FUN0cT9cuPJkirjHxJ6UA+whMp
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/http/client/certs/ca_pub.pem b/0xetc/0xgo/http/client/certs/ca_pub.pem
new file mode 100644 (file)
index 0000000..0027ba9
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA07/gmV4Axx+1YfcKmutx
+MFu7LigzmirC/eB3H+sLti3HBeZpaLrlmwdlNSYtUqBa7GdWqakecf9cZPfVDeb2
+oD/MyUrwCEaJOOsW2m/goti+wmyqHxDZvVYUuagGbhm/NuKXKCgrMsKHnLaxkaxr
+y/tnQib5r0k4pqs/vz2/G+bq9tsvc83t5eu0QYIJEGUxSi/FETT9SyVqLJyOYepf
+Pt7QGu/AZupS1Zm9wOnj/wz9X/AOwOYju8/xD6qAjz+cn9//fp1oWSCRBDuQikBY
+kXaP0UgGhivnmNLX70+YRavPTyEejx74IAMIAbE6QRXrkrhIHXE0O7+sgoQd7ftI
+4dWLYrkpozkPuFIsfE2JRjH9L2iFTys1BBWAfQWC11jfQb0JsjC3qsTl4BrxlJlL
+Vyn3rEGSCda6PI5dIfiLI7+tXUBoLNNQw7wVfKSs7PrwdLXBz+vle10rvfEgnTOo
+uMNmnq12TuylX494EaW/iEXLxl7ytI9mpeIdtx039pVTQShyEGD0mQK/sCqOKCya
+lq1SnSN+KgdBgaa8/G2E8VjO1GSbbujJyYchUztH0uoWw9uuh8q0CC6VEUZnP/AC
+/iP1OaFQCtVPulYhijXMqqTf3eq8DWBcii52m0+VXLMixT6LrYs4xqOMBU2m/N3X
+ZMCzkdeE3Sz/l6tHdA2esOkCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/http/client/main.go b/0xetc/0xgo/http/client/main.go
new file mode 100644 (file)
index 0000000..0590ec3
--- /dev/null
@@ -0,0 +1,74 @@
+package main
+
+import (
+       "bytes"
+       "crypto/tls"
+       "crypto/x509"
+       "encoding/json"
+       "log"
+       "net/http"
+       "os"
+)
+
+type CommJSON struct {
+       Data string `json:"data"`
+}
+
+func main() {
+
+       certpool := x509.NewCertPool()
+
+       file_b, err := os.ReadFile("certs/ca.pem")
+
+       certpool.AppendCertsFromPEM(file_b)
+
+       tlsConfig := &tls.Config{
+               RootCAs: certpool,
+       }
+
+       transport := &http.Transport{TLSClientConfig: tlsConfig}
+       client := &http.Client{Transport: transport}
+
+       req := CommJSON{
+               Data: "hello",
+       }
+
+       respjson := CommJSON{}
+
+       jb, err := json.Marshal(req)
+
+       if err != nil {
+               log.Println(err)
+               return
+       }
+
+       r, err := http.NewRequest("POST", "https://localhost:8888/hello", bytes.NewBuffer(jb))
+
+       if err != nil {
+               log.Println(err)
+               return
+       }
+
+       r.Header.Add("Content-Type", "application/json")
+
+       resp, err := client.Do(r)
+
+       if err != nil {
+               log.Println(err)
+               return
+       }
+       defer resp.Body.Close()
+
+       log.Printf("is HTTP 1: %v (%s)\n\n", resp.ProtoAtLeast(1, 0), resp.Proto)
+
+       derr := json.NewDecoder(resp.Body).Decode(&respjson)
+
+       if derr != nil {
+               log.Println(err)
+               return
+
+       }
+
+       log.Printf("server data: %s\n", respjson.Data)
+
+}
diff --git a/0xetc/0xgo/http/server/certs/server.csr b/0xetc/0xgo/http/server/certs/server.csr
new file mode 100644 (file)
index 0000000..6ddb8f2
--- /dev/null
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAp+OQE6FCz+k0KXJEsVFQA9Y1FbEGElToEt033eTv
+dlQEnllvFTLItpDHWQ23mCv2I7y44znjxdFt0/x1pEu9eRGMDJFu04Xzk7Btb8Q7
+gX4f1/oJx020rfK8eFfNmZe9nx7FEQl9yJq/ujNof03dKvGe2riOmcbQtLl46MDY
+RTlAemUyDXe3BC0Nmf/lbIc/auDVGj0F6Dv/qfPaO3NNgztjvN6o+C3sjl/GLSkM
+5hPyVbkdA7O8fZEdJCbRiNIHLsURnOGwCZTjAkm5BdhwX8tlWlZcAiW29lKAr9MF
+zOGDTxK/uI+W3iRczF2deYJ4BrQeC0QQ6Nj7CGlHgJnLW2SNWC1mDL0qqC/UlOle
+YjYkTIw1/3ZIEEC4yp6wh39l2RjYnPU5ziEq5elcwaJN5ftcECCPHp2pZYSnLyuq
+CsGRzU8hs0dCk36bjtRESVBLa3pQGb9ifU42lwqszDrune+AIhz6TyglXA5YN1az
+WEpg/OHxPSOFWmZY2EFGj0+1ocLy1jabaR0Dcft+/Z8EDIR2qkDu/Y/b/C5u1kM6
+EU5pKXS3dlWOku7XOxnIdKIOTwu83LzoCAnhfgA2p5W7ON77gOPrVIE+Bb5KwDR7
+FK4nEHzlXc5Uv4Wog2ZscMOzKI9KVo/cywB8qGPRlXklbFR0RPzUNMFoOgAJ0/EJ
+w+MCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBN7eYXm1UbAP4poWU3z6GxBZKY
+yhFu2QBky1ONenyDk6mvZHmQItzSycx/bpV0MwRdyH/w4FriVJcuuEm5DiLYyvEm
+nIdxb/4zl728ZLQg/9o+mR9gN/wE8nSHg0B2reB5/aeDcRxGi3x9eBXyblG56nuO
+Gte5jsCn0vqjLbbTNAQakk/YKzekpME1fMbEKxd4xP9r3rlK0ZFd9hs7WRld3zWX
+pG+bw+U5MS/IPfm4Rar/l0eGc7D5H2hpzuJCClukdFWvn1Vco3c1Owv4JYGG6lJs
+JS2hy2yNFBzJlhXyF1v51TDCLVisyEPm8lkRfMx5EUFPesbmd2t5VIw9A88gnUIK
+b8Wn+kmV1TkCdOswwPC5IbUrKejyrCn4a49pXPfdpXyI0uhwkrWoUz91EZgUnqcO
+UMdvxjZuWXx25I+rhMFeR4qHLyMfm5vbnS0+HwTLNuy2qpd5xIUCwtCVOgcUONez
+5Ax/HMmPUdpCCpKaDRjp/xl8B76eY5ex/YSCCeKaKy42vZ0qoUvXKM6fsg7HRQHr
+p551Gv+xIv2ikdbg/p2xLGQPAsVVRLeBhcTvQJokgPNsY/RcaSy5cprSE7ux0Rpd
+VDuPPLSM5fe3pfGBUXxbCNsULdAL6bLQcrwe1OCV9GMZ7sVdmvgFoDtGT1yc34tF
+xa7gfed6079H5p6Bfg==
+-----END CERTIFICATE REQUEST-----
diff --git a/0xetc/0xgo/http/server/certs/server.key b/0xetc/0xgo/http/server/certs/server.key
new file mode 100644 (file)
index 0000000..c2eb360
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+GnWPPl7p4Kc8fCTK1vZnmhI4kAK+Lw==
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/http/server/certs/server.pem b/0xetc/0xgo/http/server/certs/server.pem
new file mode 100644 (file)
index 0000000..d5ba7bc
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIFCTCCAvGgAwIBAgIUKXjjSj2aCl9FGUjbp8HZlPjABAswDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODM3MDBaFw0yNTExMDIwODM3
+MDBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKfjkBOhQs/pNClyRLFRUAPWNRWxBhJU6BLdN93k73ZUBJ5ZbxUy
+yLaQx1kNt5gr9iO8uOM548XRbdP8daRLvXkRjAyRbtOF85OwbW/EO4F+H9f6CcdN
+tK3yvHhXzZmXvZ8exREJfciav7ozaH9N3Srxntq4jpnG0LS5eOjA2EU5QHplMg13
+twQtDZn/5WyHP2rg1Ro9Beg7/6nz2jtzTYM7Y7zeqPgt7I5fxi0pDOYT8lW5HQOz
+vH2RHSQm0YjSBy7FEZzhsAmU4wJJuQXYcF/LZVpWXAIltvZSgK/TBczhg08Sv7iP
+lt4kXMxdnXmCeAa0HgtEEOjY+whpR4CZy1tkjVgtZgy9Kqgv1JTpXmI2JEyMNf92
+SBBAuMqesId/ZdkY2Jz1Oc4hKuXpXMGiTeX7XBAgjx6dqWWEpy8rqgrBkc1PIbNH
+QpN+m47URElQS2t6UBm/Yn1ONpcKrMw67p3vgCIc+k8oJVwOWDdWs1hKYPzh8T0j
+hVpmWNhBRo9PtaHC8tY2m2kdA3H7fv2fBAyEdqpA7v2P2/wubtZDOhFOaSl0t3ZV
+jpLu1zsZyHSiDk8LvNy86AgJ4X4ANqeVuzje+4Dj61SBPgW+SsA0exSuJxB85V3O
+VL+FqINmbHDDsyiPSlaP3MsAfKhj0ZV5JWxUdET81DTBaDoACdPxCcPjAgMBAAGj
+WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUJUhYdx2t7K6kqubV
+e4Ls3gzjbecwHwYDVR0jBBgwFoAUCI7gGU1vOV0ENPD/eujH47lzH6kwDQYJKoZI
+hvcNAQELBQADggIBAIzZatOoI8fvzRiqOEQp+wJ2nErevSbNijJZta0aWOAWNuaj
+cikA4nlRCKbUiIlo1iIBUwf6VE2nSNHn7Z5Cbe4UMcAKBYbGe/eUWj4UOYAsrGfT
+Ueg6Tr9sfVZ2ipllX576RNHXkBM/z2whOmdVbDslIe0Z/4bQ0RKbj+V/qq5N2GQ3
+6mjDWsuuHgv0aGoOUYIe3NU5oB51ZPQySUFr7uk6Qkd+oz/3OID+RYOivuIk8u1Q
+fryGdEwjmhPDHwX1w7ibUlzfiJpV65u7Iv9qg4e3clvPy7CLUqzOb0m+zpefYwb8
+ED+Gm4SKRDJZb8Uu4gNvKIZwyWtuPhVla97xdviOxI/uyY+1rNQqr5/bQHVGjr6M
+iop1D3aEL+DWFqoZ5FM2lPx3ced/b4qHKA6uFk0/U4NusmMEWWhE6djfmTupWx+H
+nntYCyDk2y7qxMLI6Ft3LeQCbrfcM0e7XT9dfbIHM4R/cGrUOfCChoKlnsvt8SaJ
+6ZYO0qH90VLdJ3m4dYD3wZqYRUwgqQaYkJlpeGsrDMaiqJwK/OIARhbckRsBamop
+JOILc0T1TzAuQIUFdjFTdefzVymwcI6uOVcEui1OF7WMzS8A35MKEXKRqhXtNTX0
+8RRFNwRKcufvd1SAvWR/MWCAN6U19vcz/I4JmkMv6oj9uFE5A9cMswRAnJDV
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/http/server/certs/server.pub b/0xetc/0xgo/http/server/certs/server.pub
new file mode 100644 (file)
index 0000000..e0c2b96
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp+OQE6FCz+k0KXJEsVFQ
+A9Y1FbEGElToEt033eTvdlQEnllvFTLItpDHWQ23mCv2I7y44znjxdFt0/x1pEu9
+eRGMDJFu04Xzk7Btb8Q7gX4f1/oJx020rfK8eFfNmZe9nx7FEQl9yJq/ujNof03d
+KvGe2riOmcbQtLl46MDYRTlAemUyDXe3BC0Nmf/lbIc/auDVGj0F6Dv/qfPaO3NN
+gztjvN6o+C3sjl/GLSkM5hPyVbkdA7O8fZEdJCbRiNIHLsURnOGwCZTjAkm5Bdhw
+X8tlWlZcAiW29lKAr9MFzOGDTxK/uI+W3iRczF2deYJ4BrQeC0QQ6Nj7CGlHgJnL
+W2SNWC1mDL0qqC/UlOleYjYkTIw1/3ZIEEC4yp6wh39l2RjYnPU5ziEq5elcwaJN
+5ftcECCPHp2pZYSnLyuqCsGRzU8hs0dCk36bjtRESVBLa3pQGb9ifU42lwqszDru
+ne+AIhz6TyglXA5YN1azWEpg/OHxPSOFWmZY2EFGj0+1ocLy1jabaR0Dcft+/Z8E
+DIR2qkDu/Y/b/C5u1kM6EU5pKXS3dlWOku7XOxnIdKIOTwu83LzoCAnhfgA2p5W7
+ON77gOPrVIE+Bb5KwDR7FK4nEHzlXc5Uv4Wog2ZscMOzKI9KVo/cywB8qGPRlXkl
+bFR0RPzUNMFoOgAJ0/EJw+MCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/http/server/main.go b/0xetc/0xgo/http/server/main.go
new file mode 100644 (file)
index 0000000..31a047f
--- /dev/null
@@ -0,0 +1,59 @@
+package main
+
+import (
+       "log"
+       "net/http"
+
+       "github.com/gin-gonic/contrib/sessions"
+       "github.com/gin-gonic/gin"
+)
+
+type CommJSON struct {
+       Data string `json:"data"`
+}
+
+func handlePostHello(c *gin.Context) {
+
+       req := CommJSON{}
+       resp := CommJSON{}
+
+       if err := c.BindJSON(&req); err != nil {
+
+               log.Printf("failed to bind json: %s\n", err.Error())
+
+               c.JSON(http.StatusBadRequest, resp)
+
+               return
+       }
+
+       resp.Data = req.Data
+
+       c.JSON(http.StatusOK, resp)
+
+}
+
+func createServer() *gin.Engine {
+
+       genserver := gin.Default()
+
+       store := sessions.NewCookieStore([]byte("SOLIAGAIN"))
+
+       genserver.Use(sessions.Sessions("SOLIAGAIN", store))
+
+       //      genserver.LoadHTMLGlob("view/**/*")
+
+       //      genserver.Static("/public", "./public")
+
+       genserver.POST("/hello", handlePostHello)
+
+       return genserver
+
+}
+
+func main() {
+
+       e := createServer()
+
+       e.RunTLS("0.0.0.0:8888", "certs/server.pem", "certs/server.key")
+
+}
diff --git a/0xetc/0xgo/http2/Makefile b/0xetc/0xgo/http2/Makefile
new file mode 100644 (file)
index 0000000..804008c
--- /dev/null
@@ -0,0 +1,9 @@
+all:
+
+       go build -o client/client.out ./client
+
+       go build -o server/server.out ./server
+
+
+
+
diff --git a/0xetc/0xgo/http2/certgen.sh b/0xetc/0xgo/http2/certgen.sh
new file mode 100755 (executable)
index 0000000..81dd186
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+rm -r ./client/certs/*
+
+rm -r ./server/certs/*
+
+mkdir -p ./client/certs
+
+mkdir -p ./server/certs
+
+echo "root generating...."
+
+openssl genrsa -out ./client/certs/ca_priv.pem 4096
+
+openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
+
+openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
+
+echo "server key pair, csr generating...."
+
+openssl genrsa -out ./server/certs/server.key 4096
+
+openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
+
+openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
+
+echo "signing requests for server...."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
+
+
+echo "done!"
\ No newline at end of file
diff --git a/0xetc/0xgo/http2/client/certs/ca.pem b/0xetc/0xgo/http2/client/certs/ca.pem
new file mode 100644 (file)
index 0000000..6d56e87
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/zCCAuegAwIBAgIUMm3y7oQMKrW33ouncVunNZJAqGUwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwNzQxNDFaFw0zNDEwMzEwNzQx
+NDFaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCnQRtxoldMAoPUKy1JbSX1r3FGTs9nLKidsl8vpFKplWpCvjLRYCAfFlhY
+hltMAEYihnsPWJBEqp/UKHMATJeLY/d0iiEdJIntc5O3HGnXgbaH0wB6dvJRpwxR
+sW8b4f9cHguQbbNqCk84ZTnX3xPajzAdUlt6eQwGwwI3OIfUJqXPO6X5AuZQlNt/
+stG6ZVCXj8/H0/u5SiEfTT2uW3DKmugoswy9fgNguIFWTOstz1RrW6Oxe0CinAtw
+f40VsBG4bwhWlGFHOdVGLBHe/FVv4LFQo9C5pn05H4gxRa/Oly+G0v2+fHwbK/vb
+6B2Evxn0IODT6wL+owujdvxztd9f0OjBAiA/0+6wc9AyOvdiOfmqXGoM8vADU1RF
+ZFx8ZWCAHs5jbglzvwWzHHyc0y9jijc2y72aEl1jWDJTPXGRQpYD95cgyOlVHnx/
+qSzLpGZmnls40JPUP5fCcyj+mXIV+KF5JO4HV2fTvFme5xZJCjujbXTAn24ELtkN
+LTiyx9iOZkXYEa1I+Pvjiv5sNgI8tNwpZAKSgwQJ1Le4eqPzP0YSLrfDbNJdnGFQ
+PAZGXzCk3JARM8PPo+/s8T+i0kGMwee2p5rI5593joKTLM6lLO3ou+R34CAFe9Ae
+OOkHjWQ93JiONo5EgHCes8RBgzfRn8rmOVRxB0FnxrqvS1tSmwIDAQABo1MwUTAd
+BgNVHQ4EFgQUgoQLRoUoITdNuR2EcO1+gCnNHrwwHwYDVR0jBBgwFoAUgoQLRoUo
+ITdNuR2EcO1+gCnNHrwwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
+AgEAFaZv4LRlap5v8chyeme3MOEZh+SexQPcD/E5ZLuYxTT5fDa6oSDz1Sa8zyYj
+g5bqOqoGOvUjpY2stdZyQKJOGSLQk+Qs2atAPSz1n+MuyAVh/IgEk13/kA9R6dXc
+IBTDDAZT2zwGFfz0K2cL1NlD4KZlC+POhYNWQfaR7vk3hjt3d7kbq2wBPkenVNVu
+HA05vYpVhoZ/bZDwR7V5hwDOR6JvPLoe48gBE7AV3F+ZWEnv/E2qum0pTWpmIy0k
+wIXES0g4ItVIlHj+BZF8rWPFW155S8yHHCvNw7FY9VJFfoG6JnZokxkUQR/M6L4w
+dIrkcmdfL7QPXMecWiX6sFV6MHP/5ulNYi05jwbi+F0yrUIi2m/AmMyFp8LO5jbW
+5uGL+9JDuVLFmrdOO9s5zv5upCKwPeZ1XVMlK5w/uS7uJ5+CfrjFooTv/+4RRrvS
+udKRwvXz2Q25yo5GiwgSBQCKI56DIlmUyHI9WcxjBvG91Kpj6jkRgcHbtJrDMc+f
+LaQEOoSvZQbi0YUP72YDYCspijlJ8QR4g/MM+HNOetOwTNTRlb7wsTURzWDn6VVo
+1ZyJS/a9Snd8f24fUXSlpajTbTa+Ya/A7Qzkgk4Ck+CSwCWzyT2EXMQerljdMyhc
+6sheDhGn9f5X038dyaewL0in36QhNqKxEwon4TO9VWV5ll4=
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/http2/client/certs/ca_priv.pem b/0xetc/0xgo/http2/client/certs/ca_priv.pem
new file mode 100644 (file)
index 0000000..d0dc859
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+lIYAoKcwoRG7WlexQm7SRnHWMGGW9Q==
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/http2/client/certs/ca_pub.pem b/0xetc/0xgo/http2/client/certs/ca_pub.pem
new file mode 100644 (file)
index 0000000..13b36e2
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp0EbcaJXTAKD1CstSW0l
+9a9xRk7PZyyonbJfL6RSqZVqQr4y0WAgHxZYWIZbTABGIoZ7D1iQRKqf1ChzAEyX
+i2P3dIohHSSJ7XOTtxxp14G2h9MAenbyUacMUbFvG+H/XB4LkG2zagpPOGU5198T
+2o8wHVJbenkMBsMCNziH1Calzzul+QLmUJTbf7LRumVQl4/Px9P7uUohH009rltw
+yproKLMMvX4DYLiBVkzrLc9Ua1ujsXtAopwLcH+NFbARuG8IVpRhRznVRiwR3vxV
+b+CxUKPQuaZ9OR+IMUWvzpcvhtL9vnx8Gyv72+gdhL8Z9CDg0+sC/qMLo3b8c7Xf
+X9DowQIgP9PusHPQMjr3Yjn5qlxqDPLwA1NURWRcfGVggB7OY24Jc78Fsxx8nNMv
+Y4o3Nsu9mhJdY1gyUz1xkUKWA/eXIMjpVR58f6ksy6RmZp5bONCT1D+XwnMo/ply
+FfiheSTuB1dn07xZnucWSQo7o210wJ9uBC7ZDS04ssfYjmZF2BGtSPj744r+bDYC
+PLTcKWQCkoMECdS3uHqj8z9GEi63w2zSXZxhUDwGRl8wpNyQETPDz6Pv7PE/otJB
+jMHntqeayOefd46CkyzOpSzt6Lvkd+AgBXvQHjjpB41kPdyYjjaORIBwnrPEQYM3
+0Z/K5jlUcQdBZ8a6r0tbUpsCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/http2/client/main.go b/0xetc/0xgo/http2/client/main.go
new file mode 100644 (file)
index 0000000..402a613
--- /dev/null
@@ -0,0 +1,41 @@
+package main
+
+import (
+       "crypto/tls"
+       "crypto/x509"
+       "fmt"
+       "io"
+       "log"
+       "net/http"
+       "os"
+
+       "golang.org/x/net/http2"
+)
+
+func main() {
+
+       certpool := x509.NewCertPool()
+
+       file_b, err := os.ReadFile("certs/ca.pem")
+
+       certpool.AppendCertsFromPEM(file_b)
+
+       tlsConfig := &tls.Config{
+               RootCAs: certpool,
+       }
+
+       transport := &http2.Transport{TLSClientConfig: tlsConfig}
+       client := &http.Client{Transport: transport}
+
+       resp, err := client.Get("https://localhost:8888/hello")
+
+       if err != nil {
+               log.Println(err)
+               return
+       }
+       defer resp.Body.Close()
+
+       fmt.Printf("is HTTP2: %v (%s)\n\n", resp.ProtoAtLeast(2, 0), resp.Proto)
+
+       io.Copy(os.Stdout, resp.Body)
+}
diff --git a/0xetc/0xgo/http2/server/certs/server.csr b/0xetc/0xgo/http2/server/certs/server.csr
new file mode 100644 (file)
index 0000000..a8ff909
--- /dev/null
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAoxI3a2Syb8E0WC9zzUv60l4QTOtec1ilSs6vaVGz
+iLZJSdw8F8w0P3LGyw0T+8Hxsb8cySxXX/2BxfaUCldGhrhQmHcpj7uGodZ0SMQU
+n228xLFxvTjnjrL1mKIAN9o2rJyouwcTFiTpJ4nPowqtxzEaN1GdnxLjjigG9hAE
+k8d1O8WG4JMl3G3CepxV38QXacjMQueW0gpzerd6ShH29Ql/NV79cHEFzoWJX831
+EdhKVL24Vjn82Wn3anNxOO/meITSH9Jo/p8Upw7S0ZbjSw5MrkMk7mToJOfnKuHY
+NYwa3yNNhTkKgiJru5iLepJAXZN63LhRcSmP3cGt2QDIguCJtvxavM7iY8XFhZj2
+SZ4iWSn+Lxdb4HEBt9lVzl5AsQh73lSS2MRxcjovVjUTH1Zgoz8LF0AXN37pl2nq
+SwkaIY7edrG6xMVIn0m3mgkHJkzF26HsqvIL36iSiw4dZjvBePK8UUG6F3lltJu0
+DakYSx/rWwmBAgDluYman6eZcL8LZq/7VEZt7YfWPvYSi02RRq0HDn/ApH9uwT+f
+L8CTbVTm1OzpImf/PvQQj4yJLH1koTHdqDfyUKASERu7MppHLvfAJdF3SusbDgoU
+vZ32FCpznL0yMcDu817wV7y7PQTwAXp4+qeo2krNWBl9n9DQEnIhdNu9jD3bGQhx
+Aw8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCOsJn45TZzgno61B+3G6vB3N/2
+ZTfOSDef/HQyc0JVZbR5uoxw/4ac1GV/iDIFKiwBvC8siG5sNb1xvQTHm5MQPuqY
+Avs/JCsO9FTfoo9GG8DeobtxC01PV4gNk5/BCtwNhr7ztjltdzA/hosX2b1D4iXC
+DCnHm/NlMjohyPFWsleET6H1aGqY4sprunHAvj3nvM5kIHAy347ZKGBkSousGZs9
++ysgq1N42cpmVMp9TZe4WOdpDrkTxXAxpRZhPnKU1uyPDv5tcI/d7DtNgmdiH4Hm
+lwIw27Vkt3x7ZbQDYMbsoKY2wGzNgIjQOHjHS5eQZEtdneH6BDNkRTmkwnXG06q1
+Qdw/MSY667tJyKtdQlBSHWTMcYCSe01amkWPsYH1Ud9L05c0WuKHV2I4nhKAc6vZ
+H3RX/Pj2WoWIikr7D6C1w6G47qTieCIh+N85AWEizjnlQKkaf8zzwMoiOJOjB/bQ
+DYreYbC9sV9JZDHFzBiuou+WDB0nTkUnRxi4fVac2hU8xcg5hLrbVobSug2yqccv
+s+qTgf2rQBcHDtYBS+ORPp6l1uE6bRpe3eUP6e20sjYmv5XPd5tSgoMcCo9IYi3b
+9L25fFY9oCLAUjyE7spjknrfBfYUUaZV1u+ssQ/l+1AMWmp2JNEt0kCZnyzTMDtY
+bsT3KS3zgcyxrcjwqg==
+-----END CERTIFICATE REQUEST-----
diff --git a/0xetc/0xgo/http2/server/certs/server.key b/0xetc/0xgo/http2/server/certs/server.key
new file mode 100644 (file)
index 0000000..5052679
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+Z73kid71Rbb2DAbXN9OXUmSDNTC1
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/http2/server/certs/server.pem b/0xetc/0xgo/http2/server/certs/server.pem
new file mode 100644 (file)
index 0000000..cf3b1aa
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIFCTCCAvGgAwIBAgIUNiH3wgbZ2sa232ix2HMRSTX/p9YwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwNzQxNDJaFw0yNTExMDIwNzQx
+NDJaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKMSN2tksm/BNFgvc81L+tJeEEzrXnNYpUrOr2lRs4i2SUncPBfM
+ND9yxssNE/vB8bG/HMksV1/9gcX2lApXRoa4UJh3KY+7hqHWdEjEFJ9tvMSxcb04
+546y9ZiiADfaNqycqLsHExYk6SeJz6MKrccxGjdRnZ8S444oBvYQBJPHdTvFhuCT
+JdxtwnqcVd/EF2nIzELnltIKc3q3ekoR9vUJfzVe/XBxBc6FiV/N9RHYSlS9uFY5
+/Nlp92pzcTjv5niE0h/SaP6fFKcO0tGW40sOTK5DJO5k6CTn5yrh2DWMGt8jTYU5
+CoIia7uYi3qSQF2Tety4UXEpj93BrdkAyILgibb8WrzO4mPFxYWY9kmeIlkp/i8X
+W+BxAbfZVc5eQLEIe95UktjEcXI6L1Y1Ex9WYKM/CxdAFzd+6Zdp6ksJGiGO3nax
+usTFSJ9Jt5oJByZMxduh7KryC9+okosOHWY7wXjyvFFBuhd5ZbSbtA2pGEsf61sJ
+gQIA5bmJmp+nmXC/C2av+1RGbe2H1j72EotNkUatBw5/wKR/bsE/ny/Ak21U5tTs
+6SJn/z70EI+MiSx9ZKEx3ag38lCgEhEbuzKaRy73wCXRd0rrGw4KFL2d9hQqc5y9
+MjHA7vNe8Fe8uz0E8AF6ePqnqNpKzVgZfZ/Q0BJyIXTbvYw92xkIcQMPAgMBAAGj
+WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUI53WKowOvtTqI4Pm
+h2Ak+AVURfQwHwYDVR0jBBgwFoAUgoQLRoUoITdNuR2EcO1+gCnNHrwwDQYJKoZI
+hvcNAQELBQADggIBABEiS9WRtkMIgEfhwIl2Vrb12BHKcveGs+iJuzNKCEYE40R7
+j3c5FpPZ3X2rxvU/U4TTGCSQ8/ZtjcL/oRM6nVNw4pf3y3CvXsNVHd0QMnLGc2NZ
+swkmvE4CKCzmHOTAHVcPefyMC1fG7xf6IzLGH0P36QQw3M6Qcv4462ZGY07iZGwV
+qzEBYbOCVL1aawuz3Mu1+3Z/xTRlp3kaNjjkAM4xMvu8kxdfH2iCMu/6ExVwE+vu
+qZ6B9sRXvfvoZQsfKlXSnqPMOAVfgbi0iqQmr+s00azI/2G9oVt632KPtRgWFsZx
+yNPuiljo8DrhszSkwbZtGV0xkwTatz28scpO97OZfD3NaEdeCsc+oQgGC6ZYgDWD
+e+hU4B9e9gnLK5T+uRaklBrFFMXjftP2wOmOWLsu+iizJOU9OGnbQmFJ/zPehUYb
+Y4+5XifC0+UkR1/gwCsqb1VKRtqP2frLmyqe+3XXKHUDPcLE1OPmghMemc88UuxR
+sAClRxD24xjasPf0CJHRlq9rpWnqHxdVWqcKt5eVzao+42xK0o9hYmfMtzbaFJ1O
+UperlRXOfPHfDXhoEuOjmiVzz7pf3JtsVUjt01/3pl6oUZjvnDJGm5B7ipqvHYUV
+FRlIf7ltL/wvHAxYzlploypqr8oQN9fadIQ3IfdtqhM+0EMRyMRqKHQVspdq
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/http2/server/certs/server.pub b/0xetc/0xgo/http2/server/certs/server.pub
new file mode 100644 (file)
index 0000000..6889ab0
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoxI3a2Syb8E0WC9zzUv6
+0l4QTOtec1ilSs6vaVGziLZJSdw8F8w0P3LGyw0T+8Hxsb8cySxXX/2BxfaUCldG
+hrhQmHcpj7uGodZ0SMQUn228xLFxvTjnjrL1mKIAN9o2rJyouwcTFiTpJ4nPowqt
+xzEaN1GdnxLjjigG9hAEk8d1O8WG4JMl3G3CepxV38QXacjMQueW0gpzerd6ShH2
+9Ql/NV79cHEFzoWJX831EdhKVL24Vjn82Wn3anNxOO/meITSH9Jo/p8Upw7S0Zbj
+Sw5MrkMk7mToJOfnKuHYNYwa3yNNhTkKgiJru5iLepJAXZN63LhRcSmP3cGt2QDI
+guCJtvxavM7iY8XFhZj2SZ4iWSn+Lxdb4HEBt9lVzl5AsQh73lSS2MRxcjovVjUT
+H1Zgoz8LF0AXN37pl2nqSwkaIY7edrG6xMVIn0m3mgkHJkzF26HsqvIL36iSiw4d
+ZjvBePK8UUG6F3lltJu0DakYSx/rWwmBAgDluYman6eZcL8LZq/7VEZt7YfWPvYS
+i02RRq0HDn/ApH9uwT+fL8CTbVTm1OzpImf/PvQQj4yJLH1koTHdqDfyUKASERu7
+MppHLvfAJdF3SusbDgoUvZ32FCpznL0yMcDu817wV7y7PQTwAXp4+qeo2krNWBl9
+n9DQEnIhdNu9jD3bGQhxAw8CAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/http2/server/main.go b/0xetc/0xgo/http2/server/main.go
new file mode 100644 (file)
index 0000000..5dde53d
--- /dev/null
@@ -0,0 +1,27 @@
+package main
+
+import (
+       "log"
+       "net/http"
+
+       "golang.org/x/net/http2"
+)
+
+func helloHandler(w http.ResponseWriter, r *http.Request) {
+
+       w.Write([]byte("hello"))
+}
+
+func main() {
+
+       http.HandleFunc("/hello", helloHandler)
+
+       var srv http.Server
+       srv.Addr = "0.0.0.0:8888"
+       http2.ConfigureServer(&srv, &http2.Server{})
+
+       err := srv.ListenAndServeTLS("certs/server.pem", "certs/server.key")
+       if err != nil {
+               log.Fatal("ListenAndServe: ", err)
+       }
+}
diff --git a/0xetc/0xgo/http3/Makefile b/0xetc/0xgo/http3/Makefile
new file mode 100644 (file)
index 0000000..804008c
--- /dev/null
@@ -0,0 +1,9 @@
+all:
+
+       go build -o client/client.out ./client
+
+       go build -o server/server.out ./server
+
+
+
+
diff --git a/0xetc/0xgo/http3/certgen.sh b/0xetc/0xgo/http3/certgen.sh
new file mode 100755 (executable)
index 0000000..bdb69b5
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+rm -r ./client/certs/*
+
+rm -r ./server/certs/*
+
+
+mkdir -p ./client/certs
+
+mkdir -p ./server/certs
+
+echo "root generating...."
+
+openssl genrsa -out ./client/certs/ca_priv.pem 4096
+
+openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
+
+openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
+
+echo "server key pair, csr generating...."
+
+openssl genrsa -out ./server/certs/server.key 4096
+
+openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
+
+openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
+
+echo "signing requests for server...."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
+
+
+echo "done!"
\ No newline at end of file
diff --git a/0xetc/0xgo/http3/client/certs/ca.pem b/0xetc/0xgo/http3/client/certs/ca.pem
new file mode 100644 (file)
index 0000000..f889c44
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/zCCAuegAwIBAgIUS2Xr3/K1AiMYppcYEqVyQ8BB39IwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MDMwNzI1MzJaFw0zNDA1MDEwNzI1
+MzJaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQDCdLeyc2+abS9AcrDwlqyVAuACxnVsR14+P77krZobHCcXOTtNF3YHB4f9
+3hpXRMaQiLlO8ZxtFXbw8IPT+x0vZ+imFA+IqWT7/J9hXIU6QIdO+MXAG4DwzvVL
+krCuVypp+Gvu7/V00hPJIne/w8lCKp86BPm4LsJE3pVf7RuMgJa7bzt1p/bvzOlZ
+7yMSE4hp8fyoiHUSedjA4VO2ycg3kDnts9Ldqg4GguwGQ5QDfAluDymwoLwpPwAs
+sDyDObmsdo/clGVWT6MUsjwm8j76Of3FZ5yu6yywXqSsSXybNYpAkw/a0wapH31d
+ONZ6qAvdmcJYaZJoQReJXkfaJtGRNV5I7NbZeoAekSJK40nM/vG2LWAcJJo2G6uV
+aRbhB7AkN59zTduLFn06VmEJuWNcOyOWwcWZ8Fbp8TlV4kELXO/MX0wTkwpAHj9E
+WxOOH5qmncyHOESyzou1wbMpyEOSSA0J8ySoBZob06hVqbtJoDj/uiGg1SIcy14s
+gofdKJ++NwK6e1ZGoy5b6S4X/JgNnbdq4gS0M3A3KAGYA6PeU1ymS22YdXqTtatf
+NVm1jaAGGkMyOZm6W92YKZdzQksMHLuLz2CkS4BuF9CFowrDNMCgk/CUsi4BFp27
+zvqXYWCIYOhS4BUZTuscAQpeI/Oo9BcCtZSgb0CqcpVGf+efVQIDAQABo1MwUTAd
+BgNVHQ4EFgQUFQ+swYvYbeIM6DFpxjVYVJ0G4G0wHwYDVR0jBBgwFoAUFQ+swYvY
+beIM6DFpxjVYVJ0G4G0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
+AgEANqPpKGUIxjCuKEjDeCo8iQVg/VQSsbyygmh4S3oX92rtxfL0STbyGHcN2uOo
+V2x6NAoZJS96Pr782e99TYbEmMDSowFeWQKslytJJgR00XkiCXRC49Rev62LkJe/
+tb30i9TmbEFNzGYhcIqU0kmLr/gP0uZmWthBU2D2XKErNTsEYMsQGGVDbK0xblC2
+dSda/XoBG9FRSpalG30PZkg1adBCJgIUa5uxKqc6Ik/zx3yZjVI7R15cdNASH8Po
+4B3LASd2b+zSZNIiG94rxCv3K86xtpEncvfDNRZckZZ+5OxDlu0++W6bqCKIJAvQ
+XzIjoypEzfosBPgS49J42KSC4dE+o3rRZmNICuyxJETCOcDIPWjHlifR45p8Ugjn
+sCduQgk/6068QIQVwEJ3/lM4c/b2J2nFEVDa3+cpJLwgLpajUdMm9tgqcA3Vv5ce
+xRYE1qJo09MPKG6/uq09K0q4yIDK6Oma4RMBjcLciUQA82AyNcHN31YbkASxCyeV
+N4ySr3fM975o5JOPhHV7N/6xBWrUOS2eaOOridiMyzLl4/06Hg0y5b3mP6L3LlgK
+QY32Ar0cEHJJRNCoyUgy5g1tkiDcw6H7DG+GL9kVXed6N3A5wReVal/1/5ulhEiv
+A8N3rQrka2ccM7EMTzEEJwA3Dt9OWsl85OJz2RI3RN9oQBk=
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/http3/client/certs/ca_priv.pem b/0xetc/0xgo/http3/client/certs/ca_priv.pem
new file mode 100644 (file)
index 0000000..e576be0
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+6vyNiA+8sZAEJEQ9JfzRZ+simU+0Nw==
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/http3/client/certs/ca_pub.pem b/0xetc/0xgo/http3/client/certs/ca_pub.pem
new file mode 100644 (file)
index 0000000..1bd892d
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwnS3snNvmm0vQHKw8Jas
+lQLgAsZ1bEdePj++5K2aGxwnFzk7TRd2BweH/d4aV0TGkIi5TvGcbRV28PCD0/sd
+L2fophQPiKlk+/yfYVyFOkCHTvjFwBuA8M71S5Kwrlcqafhr7u/1dNITySJ3v8PJ
+QiqfOgT5uC7CRN6VX+0bjICWu287daf278zpWe8jEhOIafH8qIh1EnnYwOFTtsnI
+N5A57bPS3aoOBoLsBkOUA3wJbg8psKC8KT8ALLA8gzm5rHaP3JRlVk+jFLI8JvI+
++jn9xWecrusssF6krEl8mzWKQJMP2tMGqR99XTjWeqgL3ZnCWGmSaEEXiV5H2ibR
+kTVeSOzW2XqAHpEiSuNJzP7xti1gHCSaNhurlWkW4QewJDefc03bixZ9OlZhCblj
+XDsjlsHFmfBW6fE5VeJBC1zvzF9ME5MKQB4/RFsTjh+app3MhzhEss6LtcGzKchD
+kkgNCfMkqAWaG9OoVam7SaA4/7ohoNUiHMteLIKH3SifvjcCuntWRqMuW+kuF/yY
+DZ23auIEtDNwNygBmAOj3lNcpkttmHV6k7WrXzVZtY2gBhpDMjmZulvdmCmXc0JL
+DBy7i89gpEuAbhfQhaMKwzTAoJPwlLIuARadu876l2FgiGDoUuAVGU7rHAEKXiPz
+qPQXArWUoG9AqnKVRn/nn1UCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/http3/client/main.go b/0xetc/0xgo/http3/client/main.go
new file mode 100644 (file)
index 0000000..d4f31b3
--- /dev/null
@@ -0,0 +1,80 @@
+package main
+
+import (
+       "bytes"
+       "crypto/tls"
+       "crypto/x509"
+       "flag"
+       "io"
+       "log"
+       "net/http"
+       "os"
+       "sync"
+
+       "github.com/quic-go/quic-go"
+       "github.com/quic-go/quic-go/http3"
+)
+
+func main() {
+       quiet := flag.Bool("q", false, "don't print the data")
+       keyLogFile := flag.String("keylog", "", "key log file")
+       insecure := flag.Bool("insecure", false, "skip certificate verification")
+       flag.Parse()
+       urls := flag.Args()
+
+       var keyLog io.Writer
+       if len(*keyLogFile) > 0 {
+               f, err := os.Create(*keyLogFile)
+               if err != nil {
+                       log.Fatal(err)
+               }
+               defer f.Close()
+               keyLog = f
+       }
+
+       caCert, err := os.ReadFile("certs/ca.pem")
+       if err != nil {
+               log.Fatalf("Reading server certificate: %s", err)
+       }
+       caCertPool := x509.NewCertPool()
+       caCertPool.AppendCertsFromPEM(caCert)
+
+       roundTripper := &http3.Transport{
+               TLSClientConfig: &tls.Config{
+                       RootCAs:            caCertPool,
+                       InsecureSkipVerify: *insecure,
+                       KeyLogWriter:       keyLog,
+               },
+               QUICConfig: &quic.Config{},
+       }
+       defer roundTripper.Close()
+       hclient := &http.Client{
+               Transport: roundTripper,
+       }
+
+       var wg sync.WaitGroup
+       wg.Add(len(urls))
+       for _, addr := range urls {
+               log.Printf("GET %s", addr)
+               go func(addr string) {
+                       rsp, err := hclient.Get(addr)
+                       if err != nil {
+                               log.Fatal(err)
+                       }
+                       log.Printf("Got response for %s: %#v", addr, rsp)
+
+                       body := &bytes.Buffer{}
+                       _, err = io.Copy(body, rsp.Body)
+                       if err != nil {
+                               log.Fatal(err)
+                       }
+                       if *quiet {
+                               log.Printf("Response Body: %d bytes", body.Len())
+                       } else {
+                               log.Printf("Response Body (%d bytes):\n%s", body.Len(), body.Bytes())
+                       }
+                       wg.Done()
+               }(addr)
+       }
+       wg.Wait()
+}
diff --git a/0xetc/0xgo/http3/server/certs/server.csr b/0xetc/0xgo/http3/server/certs/server.csr
new file mode 100644 (file)
index 0000000..fb291c1
--- /dev/null
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA0SFKaMBnIM6O0Djz9pz8POhrlqlIty5j6i95GfCA
+4bzAqcit4ugJ5NFAmiNfhLDTtnS2j0kNeBYsLjr5dOUkNBLHwbh5fZzMxXpzZ6EG
+9+AAaYEmwV3vjsyxZU34WY9E2EmgSdadkIZ/T3m0rhMdzdcU7/eGKnYrl2KWSNCh
+ZgOOgg3bElOqahky6MStfs0rdRBvCT4HzGz9DcE/TTozbuiABSTBt71+7AXnPfmA
+YkAVT9XiDdu3yIXF7AKV3RY6JjHPRgj2t5A3+jHBNXJ7+FEpSz40gEkZQAMOuUTL
+4yugLxdnqJt9vi1noyVTg7p3FrBCzFuYwbwQFoim+WGTYKEI9hfLP3nHHQhUfb6N
+VHhKh1EzxYItc4T7xFAznzNWEWxlL2duiYZfwqest6amR2fOQ/PBty3eFspxF7HL
+NUpC5PuXy2p8ZBPXieW4pc1O8bVTKhqnL5QE3c3KpFuNjdbXviouRZWP4JnCs9wU
+k7uEF/KysLqfMSGGrlGA9YQA/SH+v7iOR6JMiYpAEjSmV5QW6Rb2DJ/XI+NLKsIe
+FeX2VXwFzrGfn2zMIzGEsm5AXrY3SskxLckt6QSDw5I9AZOJBF5pKHAalf+vFzCp
+5cknPLwHd6KrKijIchpb9r96rFtQw6rCFIfPj6sACLaYiRMKasWFslUm74wOgPA1
+KIMCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQAeMrdaO0OS1FN3qLOkWdk7lLQs
+1OYh5sQ81N6HMRO7yCLdIgZrK25i/w5RLb/amKGg2IUBW/5TmuGGfcn44g4MnKcw
+MYAaEov72v4bSLtchMC3adcJq29+achKJsC9rBhKTN0wOCgpQqJIz6Vy+uYdKlcP
+N4WrE9LmavmDLHcBDlV1BohYobzvl/VrLLlm46NmCwlAyyxwa1kF5Pcb6pmEY2qd
+J/EeQjIx3GRZECibanWqvefHcLsDHcfHnbPxA4/W/8F1qzkcH5NKeyENXbluK5cL
+Bo+FS9Zshn0/lOuj6DZcnYRGFh9HNrikG53ktZe256Q8AM9X1O1nOItFtjHBs5/F
+lO6kcoOxDL3CCqr0ykF8pnQ4geeQq6T0Im6n8kQP8+OH+0MSES79HlZsp6fQk5E5
+uFMkHLEPdvi4GOmWM9tANb3oaeL73a+wytAkAwLccnzxuHnZAiORQeLWk6nrU/sP
+Uq8yjsn0EgUmyHghlCghFprz8KTd8jzEI+MVgyIjCDGzhNnzoEvcnlMUnEyz84Ag
+CxPE5rbgv7VvBcPFsDLRExYsCsHTsbRioOe/U6ol/avApwI0Cu8VjGK6nDGh2RSH
+wDrBMX/m9Kh1D3vDfhUhstloWKcvPUFsJlUQea0H2P2SrYdLxYNFvFplbvwOtMw6
++NPTjzkgsbvjgtvw8Q==
+-----END CERTIFICATE REQUEST-----
diff --git a/0xetc/0xgo/http3/server/certs/server.key b/0xetc/0xgo/http3/server/certs/server.key
new file mode 100644 (file)
index 0000000..7eddacd
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQDRIUpowGcgzo7Q
+OPP2nPw86GuWqUi3LmPqL3kZ8IDhvMCpyK3i6Ank0UCaI1+EsNO2dLaPSQ14Fiwu
+Ovl05SQ0EsfBuHl9nMzFenNnoQb34ABpgSbBXe+OzLFlTfhZj0TYSaBJ1p2Qhn9P
+ebSuEx3N1xTv94YqdiuXYpZI0KFmA46CDdsSU6pqGTLoxK1+zSt1EG8JPgfMbP0N
+wT9NOjNu6IAFJMG3vX7sBec9+YBiQBVP1eIN27fIhcXsApXdFjomMc9GCPa3kDf6
+McE1cnv4USlLPjSASRlAAw65RMvjK6AvF2eom32+LWejJVODuncWsELMW5jBvBAW
+iKb5YZNgoQj2F8s/eccdCFR9vo1UeEqHUTPFgi1zhPvEUDOfM1YRbGUvZ26Jhl/C
+p6y3pqZHZ85D88G3Ld4WynEXscs1SkLk+5fLanxkE9eJ5bilzU7xtVMqGqcvlATd
+zcqkW42N1te+Ki5FlY/gmcKz3BSTu4QX8rKwup8xIYauUYD1hAD9If6/uI5HokyJ
+ikASNKZXlBbpFvYMn9cj40sqwh4V5fZVfAXOsZ+fbMwjMYSybkBetjdKyTEtyS3p
+BIPDkj0Bk4kEXmkocBqV/68XMKnlySc8vAd3oqsqKMhyGlv2v3qsW1DDqsIUh8+P
+qwAItpiJEwpqxYWyVSbvjA6A8DUogwIDAQABAoICAGRBAtRTxDyYeSM94kpruIoU
+W5tmvOq/7PsT1gjG4GoXG/9oql94IGIWpFMgOQa55Ex4CBqJiVDzxCtHb1YIEUJ7
+bFKkdm1u0UWsLY3UxqvmsRvi46rYNuLsovAvICsDARx0s0gif/eMWpTFggXfOS73
++FwPe7x4WO5iPyxaA72NX/Bd5xMSk8P4H40x2ABNKBOfFLPIDmIEL428AfYqPATj
+pZeRpuJIEAPi0pfFt7OiB/V1UcCV/7U72AWLub86jBbKUxS+cFPQad1ho79VCjQg
+6FxfTjjfkiC7NoA/iER3ofthS3qrS+zzBFdUKgSgy71PMz6XfJQHbWj4Cp/LlKPk
+xEbQR9BjqqLpJYoCyDh5hdQsqnJWkkJKt4x+/1z1x7jh0ZDvn49waoBNkTMz586V
+khimB6eT8dUQVuwy+z8/y0eOWp4P98qgnTz6uEp5PHUNKrALG+VyuStYwA9X7S4/
+N9yAZxW0WehgcgpFrAFOMXG/1ZhfLKvGUKlnIdJ3acT/nRik8rJVMq2lpsXMdoHq
+SRbj6vI4cXCcTXb0IYzT+C7SAdTMeLQWlYF5PIVptiMarS7agXDYnDrp3U9tLTR9
+5KRrQKhS0fdHkpJ43poKytoXzqPQzPIMas4K7pMzUWXDYnIiTjXZ9RCA/lRCeiSb
+iEZjpha2WGwB4kWR8zMpAoIBAQDlP3ANxsVmFCJJ9SYitjOFqxKrjpx7GxSitZVT
+Lr+7Vt7uwRd+lWNkTkuYtBUzbMkf/j7O12ZLxPA3fqu+Q6F/ziEy/BDAu7UHgMSV
+VQWFKSg7JzlDmCATdBnlvfWKaotC45UY+rdXgWj7Yp31tYy7XSLUTEgT9gQDTOBW
+LJob+7ZuEc6/KymIOmUJCNokgYgBxDjqfQz4qOD1gSpYkbRk/YZzJSUFgI+7y2eg
+AI/JiGnkMUjSOXxwtnhJeTuEgAYtoXuSXkiUFqFQ7wUgwwM6589Rsnf8F2cgYHq6
+wQrU5NfoBQ1gKUZTxIQCdZQGIu1J3+6L5q+palee3WMi0S6ZAoIBAQDpiNqPrXBr
+3SJauyXq6v8NhJ0L5s2acAAFcpxNRNqaX4eL91az/XYiLssOEArh2rQy8G2jJYyg
+O2POqX1iqkApAUWKYM4jC7Z42vj1XK2We2pZPghM/n2Ph2gFw18jfunioQeH1hK2
+3eKVObabie66rGcwX1evGzI4EqNOfERJoSeEHU7C0r5HRQBqzew0TbZbt4rqWrn7
+UJ9bf1xhtKAzb7ojAg5jIwNDTBBAgna1MrqIatSqqQBjUtZ/lLuaqZRZdwUOR5Mk
+pKf/mFfQ+tx/jI5qLvcfu4XYF4GI1ru2M/WuV0Qo6sSpBWxrU/IOksdi1QSjBiMD
+GAK+l+hsxg17AoIBAGqZBvfA98Uxk4gkUClP48FB/Rp849JykzPdj6PwVwM7r8oB
+S3V27ZKUvZ4yDrGs4hDYXkg77LtKxhBn/GAqfow5Q0K75uZX4iOtArwVns1+h9CJ
+upztveyNzgUAQY6tYDgoLwpAesRbzn8mKiE43Em7Uxi4p8NwYAlQ0/f+IWLltryT
+1zkZTuSjkpuS3CyhdqaroXOX1lJB5OkDuLcaeXGEWeJs4TwfvbYrLPI/kJy7q9GK
+ATyPsoeOsXwovT4tcbICJr22zbTemQBTRGUpiPT5GXP5ssUr9K4fbrIsVWcNSj//
+KWsPhj4pYODr33rC/uedEwVGrWPvqPKcKx7jefECggEAfARcJN6zC+T0IICwIy/G
+YHRjPfXEi9YcfMgfbv04pbBDeDXSSmU4ffChjodAcC5HcaGyZ2hCZLkFSLNDTckh
+p2TwfArqjTvkHAwVF5+u43IIyPmjSNgA7961hBH7jQsRw3NGX4F0kL4GXL64VaML
+LwDtD4giNXBY2+Qx6zUcwokdRhCWSenGeGyRSyat4BzA0bYHxGqHx4lKBzn8Yjqc
+tJQJohuubkEis3NKUie2SIV2/4jUBQkYlqZgGIJwmjKiAFyvR6UE4/m46YgKYoVF
+4UpQOt1UCPr5mgbpmDSInLq9JmdbX+tEoompyNlcexbBYZ/EBZr1rufqVTKwkEsg
+zwKCAQAbUztM035ud+XXX8Nc/yz44IohgE9W5lvpsZJVWRWP3/D0iwzyL1YCOZ0y
+1F73FbnQKgsusiGqtU3ql5HfNsCpzbBcuHcPMYtTEp+ASOErirBBvWGP5/vBwoIT
+Ed8rYJYunkSoPZNM+gVc0jbkAnZTi0YMDEh0c9zlVIOtTTzoslSvxmx+kXVCLzko
+Mr66hlw8qcG6xiLJDI/XXPG90IFlQWwjKjR18KvoIkDnqCmTZFX2NnL+vNGUJZP/
+2bkCiwpGHlMilRUNedzvU3gd2n7ze9bV5NLIYUdDRtjN56Qb0KgDAJBFt0YvHyGy
+KLkG/qJU5C3Mvjes7O8jYjmCjxfL
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/http3/server/certs/server.pem b/0xetc/0xgo/http3/server/certs/server.pem
new file mode 100644 (file)
index 0000000..04fa24c
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIFCTCCAvGgAwIBAgIUQr1JK18kJWCKyu7WBogsB5gZGIEwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MDMwNzI1MzRaFw0yNTA1MDMwNzI1
+MzRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBANEhSmjAZyDOjtA48/ac/Dzoa5apSLcuY+oveRnwgOG8wKnIreLo
+CeTRQJojX4Sw07Z0to9JDXgWLC46+XTlJDQSx8G4eX2czMV6c2ehBvfgAGmBJsFd
+747MsWVN+FmPRNhJoEnWnZCGf095tK4THc3XFO/3hip2K5dilkjQoWYDjoIN2xJT
+qmoZMujErX7NK3UQbwk+B8xs/Q3BP006M27ogAUkwbe9fuwF5z35gGJAFU/V4g3b
+t8iFxewCld0WOiYxz0YI9reQN/oxwTVye/hRKUs+NIBJGUADDrlEy+MroC8XZ6ib
+fb4tZ6MlU4O6dxawQsxbmMG8EBaIpvlhk2ChCPYXyz95xx0IVH2+jVR4SodRM8WC
+LXOE+8RQM58zVhFsZS9nbomGX8KnrLempkdnzkPzwbct3hbKcRexyzVKQuT7l8tq
+fGQT14nluKXNTvG1Uyoapy+UBN3NyqRbjY3W174qLkWVj+CZwrPcFJO7hBfysrC6
+nzEhhq5RgPWEAP0h/r+4jkeiTImKQBI0pleUFukW9gyf1yPjSyrCHhXl9lV8Bc6x
+n59szCMxhLJuQF62N0rJMS3JLekEg8OSPQGTiQReaShwGpX/rxcwqeXJJzy8B3ei
+qyooyHIaW/a/eqxbUMOqwhSHz4+rAAi2mIkTCmrFhbJVJu+MDoDwNSiDAgMBAAGj
+WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUztOHY4D+a1LHqT5U
+Jy6DVw4m3pwwHwYDVR0jBBgwFoAUFQ+swYvYbeIM6DFpxjVYVJ0G4G0wDQYJKoZI
+hvcNAQELBQADggIBAG/VaN8jCvcBuuo5tqgMgV1Ss8P/Arm63xhJ5nGNdiK+SbKC
+BPB9ihqO+sXCUpV3/m2e83IdfRi7FZeJVwfBxQttjYeEwvp4M8ffzKucj9h1mxcG
+T0AamVMPnEWKUtoh98r1cpbh8FvMtUpwuL1MMEYxN4TmJIG1X5Hj17h5M7bdEP7g
+mumAs+CN4BQX4EQkBDQHlj/qjh9yaWL80XsvBJyhqFPYU1Mqd34mqzp1YR4bkQCn
+x5LF3bIB36zOSP2tgJGOhu32bZCCyBAduH7jWtpfr7UXnp3k7xPl79yPkJ9ZDmn6
+lSaXUOWdKMiQJSi65H+LR4StfKUj7D/iyz21nhh6NNUwO94DOqDmJTSH00kONkIO
+xvcMlt13YXZMvgLxzu4JKR9Cm3g3E7HicskKRzLeSmWH2K3jKMPivDJinwDI1Z8C
+/i1G/10/eUT6USrvXrtVyxsVxWgND20PRJDnbh5018+4k+92b6O4CUhjf3EJwMsH
+00U7XNyLRxIVXoCjM4q3ORKHDm5cKBtckCtpQj/9gVuQfOeJqJaZrb4etfGKappM
+OtNg1tVpJb2oYBmgB2EBu5LnjsQIyUEzi1iEUEiMSjMMnHXk6iwVtkYcZDwJ2oXN
+cdmRl9zwqxGVL8+jYMTClBEoObSF9WfR63mOpLd9/ABmCZtw1ixnWN4Q0ODp
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/http3/server/certs/server.pub b/0xetc/0xgo/http3/server/certs/server.pub
new file mode 100644 (file)
index 0000000..09ec88f
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0SFKaMBnIM6O0Djz9pz8
+POhrlqlIty5j6i95GfCA4bzAqcit4ugJ5NFAmiNfhLDTtnS2j0kNeBYsLjr5dOUk
+NBLHwbh5fZzMxXpzZ6EG9+AAaYEmwV3vjsyxZU34WY9E2EmgSdadkIZ/T3m0rhMd
+zdcU7/eGKnYrl2KWSNChZgOOgg3bElOqahky6MStfs0rdRBvCT4HzGz9DcE/TToz
+buiABSTBt71+7AXnPfmAYkAVT9XiDdu3yIXF7AKV3RY6JjHPRgj2t5A3+jHBNXJ7
++FEpSz40gEkZQAMOuUTL4yugLxdnqJt9vi1noyVTg7p3FrBCzFuYwbwQFoim+WGT
+YKEI9hfLP3nHHQhUfb6NVHhKh1EzxYItc4T7xFAznzNWEWxlL2duiYZfwqest6am
+R2fOQ/PBty3eFspxF7HLNUpC5PuXy2p8ZBPXieW4pc1O8bVTKhqnL5QE3c3KpFuN
+jdbXviouRZWP4JnCs9wUk7uEF/KysLqfMSGGrlGA9YQA/SH+v7iOR6JMiYpAEjSm
+V5QW6Rb2DJ/XI+NLKsIeFeX2VXwFzrGfn2zMIzGEsm5AXrY3SskxLckt6QSDw5I9
+AZOJBF5pKHAalf+vFzCp5cknPLwHd6KrKijIchpb9r96rFtQw6rCFIfPj6sACLaY
+iRMKasWFslUm74wOgPA1KIMCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/http3/server/main.go b/0xetc/0xgo/http3/server/main.go
new file mode 100644 (file)
index 0000000..9e30d7e
--- /dev/null
@@ -0,0 +1,184 @@
+package main
+
+import (
+       "crypto/md5"
+       "errors"
+       "flag"
+       "fmt"
+       "io"
+       "log"
+       "mime/multipart"
+       "net/http"
+       "strconv"
+       "strings"
+       "sync"
+
+       _ "net/http/pprof"
+
+       "github.com/quic-go/quic-go"
+       "github.com/quic-go/quic-go/http3"
+)
+
+type binds []string
+
+func (b binds) String() string {
+       return strings.Join(b, ",")
+}
+
+func (b *binds) Set(v string) error {
+       *b = strings.Split(v, ",")
+       return nil
+}
+
+// Size is needed by the /demo/upload handler to determine the size of the uploaded file
+type Size interface {
+       Size() int64
+}
+
+// See https://en.wikipedia.org/wiki/Lehmer_random_number_generator
+func generatePRData(l int) []byte {
+       res := make([]byte, l)
+       seed := uint64(1)
+       for i := 0; i < l; i++ {
+               seed = seed * 48271 % 2147483647
+               res[i] = byte(seed)
+       }
+       return res
+}
+
+func setupHandler(www string) http.Handler {
+       mux := http.NewServeMux()
+
+       if len(www) > 0 {
+               mux.Handle("/", http.FileServer(http.Dir(www)))
+       } else {
+               mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+                       fmt.Printf("%#v\n", r)
+                       const maxSize = 1 << 30 // 1 GB
+                       num, err := strconv.ParseInt(strings.ReplaceAll(r.RequestURI, "/", ""), 10, 64)
+                       if err != nil || num <= 0 || num > maxSize {
+                               w.WriteHeader(400)
+                               return
+                       }
+                       w.Write(generatePRData(int(num)))
+               })
+       }
+
+       mux.HandleFunc("/demo/tile", func(w http.ResponseWriter, r *http.Request) {
+               // Small 40x40 png
+               w.Write([]byte{
+                       0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+                       0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28,
+                       0x01, 0x03, 0x00, 0x00, 0x00, 0xb6, 0x30, 0x2a, 0x2e, 0x00, 0x00, 0x00,
+                       0x03, 0x50, 0x4c, 0x54, 0x45, 0x5a, 0xc3, 0x5a, 0xad, 0x38, 0xaa, 0xdb,
+                       0x00, 0x00, 0x00, 0x0b, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0x63, 0x18,
+                       0x61, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xe2, 0xb8, 0x75, 0x22, 0x00,
+                       0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
+               })
+       })
+
+       mux.HandleFunc("/demo/tiles", func(w http.ResponseWriter, r *http.Request) {
+               io.WriteString(w, "<html><head><style>img{width:40px;height:40px;}</style></head><body>")
+               for i := 0; i < 200; i++ {
+                       fmt.Fprintf(w, `<img src="/demo/tile?cachebust=%d">`, i)
+               }
+               io.WriteString(w, "</body></html>")
+       })
+
+       mux.HandleFunc("/demo/echo", func(w http.ResponseWriter, r *http.Request) {
+               body, err := io.ReadAll(r.Body)
+               if err != nil {
+                       fmt.Printf("error reading body while handling /echo: %s\n", err.Error())
+               }
+               w.Write(body)
+       })
+
+       // accept file uploads and return the MD5 of the uploaded file
+       // maximum accepted file size is 1 GB
+       mux.HandleFunc("/demo/upload", func(w http.ResponseWriter, r *http.Request) {
+               if r.Method == http.MethodPost {
+                       err := r.ParseMultipartForm(1 << 30) // 1 GB
+                       if err == nil {
+                               var file multipart.File
+                               file, _, err = r.FormFile("uploadfile")
+                               if err == nil {
+                                       var size int64
+                                       if sizeInterface, ok := file.(Size); ok {
+                                               size = sizeInterface.Size()
+                                               b := make([]byte, size)
+                                               file.Read(b)
+                                               md5 := md5.Sum(b)
+                                               fmt.Fprintf(w, "%x", md5)
+                                               return
+                                       }
+                                       err = errors.New("couldn't get uploaded file size")
+                               }
+                       }
+                       log.Printf("Error receiving upload: %#v", err)
+               }
+               io.WriteString(w, `<html><body><form action="/demo/upload" method="post" enctype="multipart/form-data">
+                               <input type="file" name="uploadfile"><br>
+                               <input type="submit">
+                       </form></body></html>`)
+       })
+
+       return mux
+}
+
+func main() {
+       // defer profile.Start().Stop()
+       go func() {
+               log.Println(http.ListenAndServe("localhost:6060", nil))
+       }()
+       // runtime.SetBlockProfileRate(1)
+
+       bs := binds{}
+       flag.Var(&bs, "bind", "bind to")
+       www := flag.String("www", "", "www data")
+       tcp := flag.Bool("tcp", false, "also listen on TCP")
+       key := flag.String("key", "", "TLS key (requires -cert option)")
+       cert := flag.String("cert", "", "TLS certificate (requires -key option)")
+       flag.Parse()
+
+       if len(bs) == 0 {
+               bs = binds{"localhost:6121"}
+       }
+
+       handler := setupHandler(*www)
+
+       var wg sync.WaitGroup
+       wg.Add(len(bs))
+       var certFile, keyFile string
+       if *key != "" && *cert != "" {
+               keyFile = *key
+               certFile = *cert
+       } else {
+
+               certFile = "certs/server.pem"
+
+               keyFile = "certs/server.key"
+
+       }
+       for _, b := range bs {
+               fmt.Println("listening on", b)
+               bCap := b
+               go func() {
+                       var err error
+                       if *tcp {
+                               err = http3.ListenAndServeQUIC(bCap, certFile, keyFile, handler)
+                       } else {
+                               server := http3.Server{
+                                       Handler:    handler,
+                                       Addr:       bCap,
+                                       QUICConfig: &quic.Config{},
+                               }
+                               err = server.ListenAndServeTLS(certFile, keyFile)
+                       }
+                       if err != nil {
+                               fmt.Println(err)
+                       }
+                       wg.Done()
+               }()
+       }
+       wg.Wait()
+}
diff --git a/0xetc/0xgo/mysql-query/.gitignore b/0xetc/0xgo/mysql-query/.gitignore
new file mode 100644 (file)
index 0000000..c8691c4
--- /dev/null
@@ -0,0 +1 @@
+.data
\ No newline at end of file
diff --git a/0xetc/0xgo/mysql-query/Dockerfile b/0xetc/0xgo/mysql-query/Dockerfile
new file mode 100644 (file)
index 0000000..aab7eb5
--- /dev/null
@@ -0,0 +1,9 @@
+FROM mysql:8
+
+ENV MYSQL_ROOT_PASSWORD universalpassword
+ENV MYSQL_HOST localhost
+ENV MYSQL_TCP_PORT 3306
+
+EXPOSE 3306
+
+ADD ./init.sql /docker-entrypoint-initdb.d
\ No newline at end of file
diff --git a/0xetc/0xgo/mysql-query/core/modules.go b/0xetc/0xgo/mysql-query/core/modules.go
new file mode 100644 (file)
index 0000000..e060159
--- /dev/null
@@ -0,0 +1,67 @@
+package core
+
+import (
+       "database/sql"
+       "fmt"
+       "time"
+
+       _ "github.com/go-sql-driver/mysql"
+)
+
+var DB *sql.DB
+
+func DbEstablish(db_id string, db_pw string, db_addr string, db_name string) error {
+
+       var err error
+
+       db_info := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", db_id, db_pw, db_addr, db_name)
+
+       DB, err = sql.Open("mysql", db_info)
+
+       if err != nil {
+
+               return fmt.Errorf("failed to open db: %s", err.Error())
+       }
+
+       DB.SetConnMaxLifetime(time.Second * 10)
+       DB.SetConnMaxIdleTime(time.Second * 5)
+       DB.SetMaxOpenConns(10)
+       DB.SetMaxIdleConns(10)
+
+       return nil
+}
+
+func DbQuery(query string, args []any) (*sql.Rows, error) {
+
+       var empty_row *sql.Rows
+
+       results, err := DB.Query(query, args[0:]...)
+
+       if err != nil {
+
+               return empty_row, fmt.Errorf("db query: %s", err.Error())
+
+       }
+
+       return results, err
+
+}
+
+func DbExec(query string, args []any) error {
+
+       result, err := DB.Exec(query, args[0:]...)
+
+       if err != nil {
+               return fmt.Errorf("db exec: %s", err.Error())
+       }
+
+       _, err = result.RowsAffected()
+
+       if err != nil {
+
+               return fmt.Errorf("db exec: rows: %s", err.Error())
+       }
+
+       return nil
+
+}
diff --git a/0xetc/0xgo/mysql-query/docker-compose.yaml b/0xetc/0xgo/mysql-query/docker-compose.yaml
new file mode 100644 (file)
index 0000000..53a5951
--- /dev/null
@@ -0,0 +1,12 @@
+version: "3"
+
+services:
+                        
+        mysql-db:
+                build: .
+                container_name: mysql-db
+                ports:
+                        - "3306:3306"
+                volumes:
+                        - ./.data:/var/lib/mysql
+        
\ No newline at end of file
diff --git a/0xetc/0xgo/mysql-query/init.sql b/0xetc/0xgo/mysql-query/init.sql
new file mode 100644 (file)
index 0000000..2effb03
--- /dev/null
@@ -0,0 +1,32 @@
+CREATE USER 'mysqldb'@'%' IDENTIFIED BY 'universalpassword';
+
+GRANT ALL PRIVILEGES ON *.* TO 'mysqldb'@'%';
+
+CREATE DATABASE mysqldb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+USE mysqldb;
+
+
+CREATE TABLE user (
+
+    user_id INT NOT NULL AUTO_INCREMENT,
+    user_name VARCHAR(128),
+    user_pass TEXT,
+    PRIMARY KEY (user_id)
+
+);
+
+
+
+INSERT INTO 
+    user (
+        user_name,
+        user_pass
+    )
+    VALUES (
+
+        "test1",
+        "test1pw"
+    );
+
+COMMIT;
\ No newline at end of file
diff --git a/0xetc/0xgo/mysql-query/main.go b/0xetc/0xgo/mysql-query/main.go
new file mode 100644 (file)
index 0000000..dec593c
--- /dev/null
@@ -0,0 +1,263 @@
+package main
+
+import (
+       "fmt"
+       "log"
+
+       pkgdbquery "github.com/seantywork/go/mysql-query/core"
+)
+
+type DB_User struct {
+       UserId   int    `json:"user_id"`
+       UserName string `json:"user_name"`
+       UserPass string `json:"user_pass"`
+}
+
+func GetUsers() ([]DB_User, error) {
+
+       var dbuser_records []DB_User
+
+       q := `
+       
+               SELECT
+                       user_id,
+                       user_name,
+                       user_pass
+               FROM
+                       user
+       
+       `
+
+       a := []any{}
+
+       res, err := pkgdbquery.DbQuery(q, a)
+
+       if err != nil {
+
+               return nil, fmt.Errorf("failed to get user: %s", err.Error())
+
+       }
+
+       defer res.Close()
+
+       for res.Next() {
+
+               dbuser := DB_User{}
+
+               err = res.Scan(
+                       &dbuser.UserId,
+                       &dbuser.UserName,
+                       &dbuser.UserPass,
+               )
+
+               if err != nil {
+
+                       return nil, fmt.Errorf("failed to get user: row: %s", err.Error())
+               }
+
+               dbuser_records = append(dbuser_records, dbuser)
+       }
+
+       return dbuser_records, nil
+
+}
+
+func GetUserByName(name string) (*DB_User, error) {
+
+       var dbuser_records []DB_User
+
+       var dbuser DB_User
+
+       q := `
+       
+               SELECT
+                       user_id,
+                       user_pass
+               FROM
+                       user
+               WHERE
+                       user_name = ?
+       
+       `
+
+       a := []any{
+               name,
+       }
+
+       res, err := pkgdbquery.DbQuery(q, a)
+
+       if err != nil {
+
+               return nil, fmt.Errorf("failed to get user: %s", err.Error())
+
+       }
+
+       defer res.Close()
+
+       for res.Next() {
+
+               dbuser := DB_User{}
+
+               err = res.Scan(
+                       &dbuser.UserId,
+                       &dbuser.UserPass,
+               )
+
+               if err != nil {
+
+                       return nil, fmt.Errorf("failed to get user: row: %s", err.Error())
+               }
+
+               dbuser_records = append(dbuser_records, dbuser)
+       }
+
+       rlen := len(dbuser_records)
+
+       if rlen != 1 {
+               return nil, nil
+       }
+
+       dbuser = dbuser_records[0]
+
+       return &dbuser, nil
+}
+
+func SetUser(name string, pass string) error {
+
+       check, err := GetUserByName(name)
+
+       if err != nil {
+
+               return fmt.Errorf("set user: %s", err.Error())
+       }
+
+       var q string
+
+       a := make([]any, 0)
+
+       if check != nil {
+
+               log.Printf("user: %s: already exists: overriding\n", name)
+
+               q = `
+               
+                       UPDATE
+                               user
+                       SET
+                               user_pass = ?
+                       WHERE
+                               user_id = ?
+
+               
+               `
+
+               a = append(a, pass)
+
+               a = append(a, check.UserId)
+
+       } else {
+
+               log.Printf("user: %s: doesn't exist: create\n", name)
+
+               q = `
+               
+                       INSERT INTO
+                               user(
+                                       user_name,
+                                       user_pass
+                               )
+                               VALUES(
+                                       ?,
+                                       ?
+                               )
+
+               
+               `
+
+               a = append(a, name)
+               a = append(a, pass)
+       }
+
+       err = pkgdbquery.DbExec(q, a)
+
+       if err != nil {
+               return fmt.Errorf("failed to set user: %s", err.Error())
+       }
+
+       return nil
+}
+
+func run() error {
+
+       err := pkgdbquery.DbEstablish(
+               "mysqldb",
+               "universalpassword",
+               "localhost:3306",
+               "mysqldb",
+       )
+
+       if err != nil {
+
+               return fmt.Errorf("failed to establish db conn: %s", err.Error())
+       }
+
+       urecall, err := GetUsers()
+
+       if err != nil {
+
+               return fmt.Errorf("failed to get all users: %s\n", err.Error())
+
+       }
+
+       ulen := len(urecall)
+
+       for i := 0; i < ulen; i++ {
+
+               fmt.Printf("user: %d ===================\n", i)
+               fmt.Printf("id    : %d\n", urecall[i].UserId)
+               fmt.Printf("name  : %s\n", urecall[i].UserName)
+               fmt.Printf("pw    : %s\n", urecall[i].UserPass)
+               fmt.Printf("=============================\n")
+
+       }
+
+       newuser := "test2"
+       newpw := "test2pw"
+
+       err = SetUser(newuser, newpw)
+
+       if err != nil {
+               return fmt.Errorf("failed to set new user: %s", err.Error())
+       }
+
+       urecall2, err := GetUsers()
+
+       if err != nil {
+
+               return fmt.Errorf("failed to get all users 2: %s\n", err.Error())
+
+       }
+
+       ulen2 := len(urecall2)
+
+       for i := 0; i < ulen2; i++ {
+
+               fmt.Printf("user: %d ===================\n", i)
+               fmt.Printf("id    : %d\n", urecall2[i].UserId)
+               fmt.Printf("name  : %s\n", urecall2[i].UserName)
+               fmt.Printf("pw    : %s\n", urecall2[i].UserPass)
+               fmt.Printf("=============================\n")
+
+       }
+
+       return nil
+}
+
+func main() {
+
+       if err := run(); err != nil {
+
+               log.Fatal(err)
+       }
+
+}
diff --git a/0xetc/0xgo/sock-tcp-async/certgen.sh b/0xetc/0xgo/sock-tcp-async/certgen.sh
new file mode 100755 (executable)
index 0000000..493976f
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+rm -r ./client/certs/*
+
+rm -r ./server/certs/*
+
+echo "root generating...."
+
+openssl genrsa -out ./client/certs/ca_priv.pem 4096
+
+openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
+
+openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
+
+echo "server key pair, csr generating...."
+
+openssl genrsa -out ./server/certs/server.key 4096
+
+openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
+
+openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
+
+echo "signing requests for server...."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
+
+
+echo "done!"
\ No newline at end of file
diff --git a/0xetc/0xgo/sock-tcp-async/client/certs/ca.pem b/0xetc/0xgo/sock-tcp-async/client/certs/ca.pem
new file mode 100644 (file)
index 0000000..06e44c9
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/zCCAuegAwIBAgIUffjPF3nZtca+YmxkhFpPSg8+8r8wDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMDBaFw0zNTAyMDYxMTQx
+MDBaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCrNVWpVf4qCCS+PHmRPTRA7EnAfgYwTQ0tUYtirsrPipbrlPX5zLF2vfTO
+lJqzvDB0xnGC5pYAFeh6PRsar6HmkG5z46QZJeukybDIvcRBpHKn3Wg1xJ/Bswpe
+76UbzNYmvnhkAeJgtptMXq0aGrn/us9f1jKX3EFNjipH2+c11XshVUNtPKT5XSqg
+oveReVgBhJU8Vl/1qGvQdyI/CsT4C1BJ4r148J580Hg5BVla1fg610NPwjvWvT9q
+rikjR1BPfzRrwiEgUoewLuZqDNeOXyeZCBhxWo5ugXqsMFSoBnUc4UYzTKPSVZXL
+ceXXiHkk+EF7KdD4ZugLzO3StrH7EngO25iXNsJoKB3JBs/cgpNybS7HhP96VRBi
+VCuhQJnqtmRVNnHMYR42RI0dxDlCewX16w2jM+XgEQ9YWwTE3gZp8+q1aKCFM/3c
+F0TnHyWB5ENE0vjIJjHBLcKz6e4baYBTiPWq1TjBtRLKEOGHJhnxuLCRwNe3IDJI
+1pCQhorr1/WFEDTrq5axbsNZUVnl7CeskojMsHEGYDVhTYMbBwscRqRPVd+C9XFi
+AsfyHJb5QwwEMxzkwt5JyJvSEY483FwvQkiI8YDGydgdUPCOmYkEMahS7+QfHhwu
+Ybnnn0xBHwcE6BQ8LjYLeMhP3hfyI5NJpRnhpVkIefRZm2untwIDAQABo1MwUTAd
+BgNVHQ4EFgQUNTLhikFTfYlRZvi7OXJDrw0apSIwHwYDVR0jBBgwFoAUNTLhikFT
+fYlRZvi7OXJDrw0apSIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
+AgEAD6wBsPD4U4BJWKpUv56gfqqqhZ319u3aWy/+GDoV6ZQjDRGuwvxvzWGXbpI8
+kJA4ZWK3TNXb+h+z06ivY3oLRKuIEQs/vS7mwzv8EAf+4JVs/nvW3+dhbFW1u1FL
+5OoV5al+w4TyO50T8QejmSiYJkgfe0x2uDf2PP8tcmlv0LoHjHOJ+HA4X5eUvZOQ
+ehe9z4VOsflRv14eGuEYofy4+7YHzXbHVEvBIUqcnNxs99eLzZN3P2N7r0a3PazK
+eeUPbx8TBbwHGWAHJFkYgOGpUQQ61ejHTwAWctc8rlNd0uLFnPRzAlSuwFK/ezZa
+do8RE2B4fguyJup+DVwYW7mvbX3FlFrNSnH/sdo6dqGiqgxfCygKxG4GHdLVw1p6
+S+qwQjZYCtgl9dzVoXs5SBknSq1fUxS1WLzoseTpAy37O5ppXyqNUogl45FB/lSb
+p4fZpHXaQ3hrtCR81UbRR2plUYx56GPZLi80MhOeFm2xJ+O82jkv8YGH11ePV+JO
+AXyA3NX25DoTWIRbHOcNubaYCDQIIscNTuwQLYQgNqvHe5f+/coV8npOafCchY0j
+pB0jfIZ09tNENLkqtvJ5tNQKMe9EFzL5ctynst383UdjDz8rDa6ZB9tVoicF3dW0
+xyC+qGlBpJE7W+Bs6VCFdXKuzqqewIvoTs0mka5jTEfXV0I=
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/sock-tcp-async/client/certs/ca.srl b/0xetc/0xgo/sock-tcp-async/client/certs/ca.srl
new file mode 100644 (file)
index 0000000..7ff6484
--- /dev/null
@@ -0,0 +1 @@
+24A3A8C4B775B0724F02BB952BB38A54EE85CCC6
diff --git a/0xetc/0xgo/sock-tcp-async/client/certs/ca_priv.pem b/0xetc/0xgo/sock-tcp-async/client/certs/ca_priv.pem
new file mode 100644 (file)
index 0000000..e371c5e
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+HvhSKWc8Lsus1sPYi7BXTC2qJhPn5esv
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/sock-tcp-async/client/certs/ca_pub.pem b/0xetc/0xgo/sock-tcp-async/client/certs/ca_pub.pem
new file mode 100644 (file)
index 0000000..1f2732c
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqzVVqVX+Kggkvjx5kT00
+QOxJwH4GME0NLVGLYq7Kz4qW65T1+cyxdr30zpSas7wwdMZxguaWABXoej0bGq+h
+5pBuc+OkGSXrpMmwyL3EQaRyp91oNcSfwbMKXu+lG8zWJr54ZAHiYLabTF6tGhq5
+/7rPX9Yyl9xBTY4qR9vnNdV7IVVDbTyk+V0qoKL3kXlYAYSVPFZf9ahr0HciPwrE
++AtQSeK9ePCefNB4OQVZWtX4OtdDT8I71r0/aq4pI0dQT380a8IhIFKHsC7magzX
+jl8nmQgYcVqOboF6rDBUqAZ1HOFGM0yj0lWVy3Hl14h5JPhBeynQ+GboC8zt0rax
++xJ4DtuYlzbCaCgdyQbP3IKTcm0ux4T/elUQYlQroUCZ6rZkVTZxzGEeNkSNHcQ5
+QnsF9esNozPl4BEPWFsExN4GafPqtWighTP93BdE5x8lgeRDRNL4yCYxwS3Cs+nu
+G2mAU4j1qtU4wbUSyhDhhyYZ8biwkcDXtyAySNaQkIaK69f1hRA066uWsW7DWVFZ
+5ewnrJKIzLBxBmA1YU2DGwcLHEakT1XfgvVxYgLH8hyW+UMMBDMc5MLeScib0hGO
+PNxcL0JIiPGAxsnYHVDwjpmJBDGoUu/kHx4cLmG5559MQR8HBOgUPC42C3jIT94X
+8iOTSaUZ4aVZCHn0WZtrp7cCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/sock-tcp-async/client/main.go b/0xetc/0xgo/sock-tcp-async/client/main.go
new file mode 100644 (file)
index 0000000..573819f
--- /dev/null
@@ -0,0 +1,37 @@
+package main
+
+import (
+       "fmt"
+       "net"
+       "os"
+)
+
+func main() {
+
+       mode := os.Args[1]
+
+       if mode == "net" {
+               conn, err := net.Dial("tcp", "localhost:8080")
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               wbuf := make([]byte, 1024)
+
+               copy(wbuf, "Hello, server!")
+
+               _, err = conn.Write(wbuf)
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               conn.Close()
+
+       } else if mode == "tls" {
+
+               TlsConnection()
+       }
+
+}
diff --git a/0xetc/0xgo/sock-tcp-async/client/tls.go b/0xetc/0xgo/sock-tcp-async/client/tls.go
new file mode 100644 (file)
index 0000000..574c0e5
--- /dev/null
@@ -0,0 +1,69 @@
+package main
+
+import (
+       "crypto/tls"
+       "crypto/x509"
+       "fmt"
+       "log"
+       "os"
+       "time"
+)
+
+func TlsConnection() {
+
+       certpool := x509.NewCertPool()
+
+       file_b, err := os.ReadFile("certs/ca.pem")
+
+       /*
+               ca_pem := new(bytes.Buffer)
+
+               pem.Encode(ca_pem, &pem.Block{
+                       Type:  "CERTIFICATE",
+                       Bytes: file_b,
+               })
+       */
+       certpool.AppendCertsFromPEM(file_b)
+
+       config := tls.Config{RootCAs: certpool}
+       conn, err := tls.Dial("tcp", "localhost:8080", &config)
+       if err != nil {
+               log.Fatalf("client: dial: %s", err)
+       }
+       defer conn.Close()
+       log.Println("client: connected to: ", conn.RemoteAddr())
+
+       state := conn.ConnectionState()
+       for _, v := range state.PeerCertificates {
+               fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey))
+               fmt.Println(v.Subject)
+       }
+       log.Println("client: handshake: ", state.HandshakeComplete)
+       log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual)
+       wbuf := make([]byte, 1024)
+
+       copy(wbuf, "Hello, tls server!")
+       n, err := conn.Write(wbuf)
+       if err != nil {
+               log.Fatalf("client: write: %s", err)
+       }
+
+       reply := make([]byte, 1024)
+
+       readlen := 0
+
+       for readlen != 1024 {
+
+               n, err = conn.Read(reply[readlen:])
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               readlen += n
+       }
+
+       log.Printf("client: read :%s (%d bytes)", string(reply[:readlen]), readlen)
+       time.Sleep(time.Millisecond * 1000)
+       log.Print("client: exiting")
+}
diff --git a/0xetc/0xgo/sock-tcp-async/server/certs/server.csr b/0xetc/0xgo/sock-tcp-async/server/certs/server.csr
new file mode 100644 (file)
index 0000000..d1716a7
--- /dev/null
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAyZ3Q53iz5sEydVn6ZweetnvPhYwY9UPcQwlHuEw6
+dMiwbWLFl3bvy0pMbK2Q2Jd/TNd1xQnG2IX7uMVsmecJCV9eKFJ5C1WyePglNBCg
+rPwccFPFWqAXj6s27meaNxUAge7S3LqZlwVSmdfyTtjCgvDSj1WvFv+3myG83sdH
+yRpiXVal4R5Lsd2pEIvJ+BnAGxazVdRWIcYT2yLdz32eaoFVCNMmi08c9xZSbT8+
+5mqBhhBDw20yhiH7cUsGg49mYVM9rUgz0DjQalqg01QQUOG7afJHMzSX3zDsKPDJ
+IucHgIfIEtoIIOD0i1IVqgHRywzue18S/5M/I4YctDxzPZntRUu6iPZQlPGCGlcQ
+XAlai5+u/jfg953dSMBLUoGSxmIFixHhN8QcSRRY10OK88BLIJM7twDGiD17YMhh
+iTA3DmkIOODAHaVN4akdfhmMP4gP20PaD/ULVUIl67p217sROouCa6Id/v6KmEfs
+9+8MVSZjz1xYNv/+nWMxla1IomLskifGPQaJYW6eH0h7JFe/Xgfn/ihJXpMiB2vP
+sSO1hio4NM3Ci1whP3H6iPjW6r2/gGJ/UOQ1H5zZde+UxW3BrLvfMGq8T9MNz2Du
+rIiG7lBBZEKpoL/slHf28MX7ALXqnhfq891Qb3Kl2zKySX7wAtbgJUG5lMazUzUb
+6OUCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQDBarvtlgaaiF32tTzMDAU+94+F
+0WKdstbGIcUDjW126WhiDMD9nsbjNscdkFpw7/JqvnD6CX3nOaE7EmO0Zh5+AXn+
+SgD+KsdEPDAw40zX/ceaEyLo13HYTqEXXf9GyVYFoUrPs1kI4ncvOcY6T6hGsoCn
+OzqzkQA0M44ct+VZkLZHtdotI/Pt0O3EGTIvxpH9LssI2XsAazRakudnECgf7krq
+qqtWceclClqmGR3xSpV5oWPt2V3Y1dDFvX0W1spxiMG8FHgT1b4Gf5WM4jOfcNm9
+g23PFc+ffqeEs1+1LhFWf+r61NLjrKKH82JEzXPj+kXSZ844JJrGdsjh8tuVtMvf
+ivYL8Di8AbEE2zSo7/bP3WKDkVN5oHC3/oz3V7vtPTfaWUHsJwI8qBkMO200KwH9
+FvTodg+NI8z7EOWhBvCE+hjlL1fn+9l2pLUV+fqjeXBQEsrHep+vN7zCCkJAmM0A
+mpU7OPNc7zm28L6zGK5TkKUHU4aGVyeItam6eU8+d/sZjkrQqQ/lEJbiLVCz//Kd
+/qGchrSksm6rKEcwYGE5h31wl8SAIjADk2cx/iQianhTdZaliL1I+s7pR67esTvi
+BhK16uLW+x6fuASKU5kDqLuHc+3rT+icu/DNEsQvR6j3t5i/iu6GYLLBHhWZWH1T
+0rS8ffinyso9IuImyQ==
+-----END CERTIFICATE REQUEST-----
diff --git a/0xetc/0xgo/sock-tcp-async/server/certs/server.key b/0xetc/0xgo/sock-tcp-async/server/certs/server.key
new file mode 100644 (file)
index 0000000..e45fe9b
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+Ug07IGqNaURkyoQerKUv7X+DOFO1Qo4=
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/sock-tcp-async/server/certs/server.pem b/0xetc/0xgo/sock-tcp-async/server/certs/server.pem
new file mode 100644 (file)
index 0000000..9973288
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIFCTCCAvGgAwIBAgIUJKOoxLd1sHJPAruVK7OKVO6FzMYwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMDBaFw0yNjAyMDgxMTQx
+MDBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMmd0Od4s+bBMnVZ+mcHnrZ7z4WMGPVD3EMJR7hMOnTIsG1ixZd2
+78tKTGytkNiXf0zXdcUJxtiF+7jFbJnnCQlfXihSeQtVsnj4JTQQoKz8HHBTxVqg
+F4+rNu5nmjcVAIHu0ty6mZcFUpnX8k7YwoLw0o9Vrxb/t5shvN7HR8kaYl1WpeEe
+S7HdqRCLyfgZwBsWs1XUViHGE9si3c99nmqBVQjTJotPHPcWUm0/PuZqgYYQQ8Nt
+MoYh+3FLBoOPZmFTPa1IM9A40GpaoNNUEFDhu2nyRzM0l98w7CjwySLnB4CHyBLa
+CCDg9ItSFaoB0csM7ntfEv+TPyOGHLQ8cz2Z7UVLuoj2UJTxghpXEFwJWoufrv43
+4Ped3UjAS1KBksZiBYsR4TfEHEkUWNdDivPASyCTO7cAxog9e2DIYYkwNw5pCDjg
+wB2lTeGpHX4ZjD+ID9tD2g/1C1VCJeu6dte7ETqLgmuiHf7+iphH7PfvDFUmY89c
+WDb//p1jMZWtSKJi7JInxj0GiWFunh9IeyRXv14H5/4oSV6TIgdrz7EjtYYqODTN
+wotcIT9x+oj41uq9v4Bif1DkNR+c2XXvlMVtway73zBqvE/TDc9g7qyIhu5QQWRC
+qaC/7JR39vDF+wC16p4X6vPdUG9ypdsyskl+8ALW4CVBuZTGs1M1G+jlAgMBAAGj
+WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUbVC6F4cp3g11LRik
+jHUBSlLFXF4wHwYDVR0jBBgwFoAUNTLhikFTfYlRZvi7OXJDrw0apSIwDQYJKoZI
+hvcNAQELBQADggIBAHq7EV5kIo/RNG4Uzwnob6Zwi94la8ZDq7qFQoj6GJbbd/l0
+bQCIDTeIl5JzrPTv6Ka00DbSJ4BbY6OUTgUCeBDOX/lJ/FAYHhRMeTtOi7KTxyX2
+D8FKdQ/ZAYrU/GY0bC4vVwDqCmn5t+xkD2cXQlAAJIlQWVNEXIMrdDY4Q0jYyIiY
+lFyCu/cJY2phOzltbcwTOHzFSyPTyYSGacyE7xAyWj9va9renOQ3+kmj5Nu+jkMv
+hsAWNH6RjaJgOSYN5ItUi+i7qyqhWHOuU3ParKr0SEdl8cx9zvDRzNd2ZJQLtPvo
+CLlyifI0IAhe/Xh52mTEAJ8WBzjbVazPLBn9RUpN330h3mbFi3LxqZjyGmYNr5L3
+GwxVLcnRr8nL7FPb0AP1GlzTkxWULSwAJuivPgZywwZCxfkRdPGe7bq6c92W/bAx
+qAjEiqKZBzEpHMhwOvJXMo79/DmE4Q4N2yQxaA7vx8FQbFYvX0NhFIymKo6D4Uu+
+kYyFbSE3LymWbzGh0kFEf9xXl3xqQy1rXBYf8d9Z5+5acZG+6jcwmVQxqnWloajE
+uZmO7CKnUW8uJgE/1WCR7pF0DFWvNpq3zOssOV3dJZhvgEp6XXiwymbF8RlBnUy0
+4/GwXud7beKomxBwbYmYmGKO6lmQOQou7VP6Ag/637oOt8YaU/DKEdKwpKdQ
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/sock-tcp-async/server/certs/server.pub b/0xetc/0xgo/sock-tcp-async/server/certs/server.pub
new file mode 100644 (file)
index 0000000..9901d75
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyZ3Q53iz5sEydVn6Zwee
+tnvPhYwY9UPcQwlHuEw6dMiwbWLFl3bvy0pMbK2Q2Jd/TNd1xQnG2IX7uMVsmecJ
+CV9eKFJ5C1WyePglNBCgrPwccFPFWqAXj6s27meaNxUAge7S3LqZlwVSmdfyTtjC
+gvDSj1WvFv+3myG83sdHyRpiXVal4R5Lsd2pEIvJ+BnAGxazVdRWIcYT2yLdz32e
+aoFVCNMmi08c9xZSbT8+5mqBhhBDw20yhiH7cUsGg49mYVM9rUgz0DjQalqg01QQ
+UOG7afJHMzSX3zDsKPDJIucHgIfIEtoIIOD0i1IVqgHRywzue18S/5M/I4YctDxz
+PZntRUu6iPZQlPGCGlcQXAlai5+u/jfg953dSMBLUoGSxmIFixHhN8QcSRRY10OK
+88BLIJM7twDGiD17YMhhiTA3DmkIOODAHaVN4akdfhmMP4gP20PaD/ULVUIl67p2
+17sROouCa6Id/v6KmEfs9+8MVSZjz1xYNv/+nWMxla1IomLskifGPQaJYW6eH0h7
+JFe/Xgfn/ihJXpMiB2vPsSO1hio4NM3Ci1whP3H6iPjW6r2/gGJ/UOQ1H5zZde+U
+xW3BrLvfMGq8T9MNz2DurIiG7lBBZEKpoL/slHf28MX7ALXqnhfq891Qb3Kl2zKy
+SX7wAtbgJUG5lMazUzUb6OUCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/sock-tcp-async/server/main.go b/0xetc/0xgo/sock-tcp-async/server/main.go
new file mode 100644 (file)
index 0000000..a5dcff0
--- /dev/null
@@ -0,0 +1,104 @@
+package main
+
+import (
+       "fmt"
+       "net"
+       "os"
+)
+
+func main() {
+
+       mode := os.Args[1]
+
+       if mode == "net" {
+               ln, err := net.Listen("tcp", "0.0.0.0:8080")
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               for {
+                       conn, err := ln.Accept()
+                       if err != nil {
+                               fmt.Println(err)
+                               continue
+                       }
+
+                       rc := make(chan []byte, 1024)
+
+                       wc := make(chan []byte, 1024)
+
+                       go readHandler(conn, rc)
+
+                       go worker(rc, wc)
+
+                       go writeHandler(conn, wc)
+
+               }
+       } else if mode == "tls" {
+
+               TlsListen()
+
+       }
+
+}
+
+func readHandler(c net.Conn, rc chan []byte) {
+
+       buf := make([]byte, 1024)
+
+       for {
+
+               readlen := 0
+
+               for readlen != 1024 {
+
+                       n, err := c.Read(buf[readlen:])
+                       if err != nil {
+                               fmt.Println(err)
+                               return
+                       }
+
+                       readlen += n
+               }
+
+               fmt.Printf("Received len: %d\n", readlen)
+
+               rc <- buf
+
+       }
+
+}
+
+func worker(rc chan []byte, wc chan []byte) {
+
+       for {
+
+               rbuf := <-rc
+
+               fmt.Printf("Worker: %s\n", string(rbuf))
+
+               wc <- rbuf
+
+       }
+
+}
+
+func writeHandler(c net.Conn, wc chan []byte) {
+
+       for {
+
+               wbuf := <-wc
+
+               n, err := c.Write(wbuf)
+
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               fmt.Printf("Write len: %d\n", n)
+
+       }
+
+}
diff --git a/0xetc/0xgo/sock-tcp-async/server/tls.go b/0xetc/0xgo/sock-tcp-async/server/tls.go
new file mode 100644 (file)
index 0000000..36457fa
--- /dev/null
@@ -0,0 +1,51 @@
+package main
+
+import (
+       "crypto/rand"
+       "crypto/tls"
+       "crypto/x509"
+       "log"
+)
+
+func TlsListen() {
+       cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key")
+       if err != nil {
+               log.Fatalf("server: loadkeys: %s", err)
+       }
+       config := tls.Config{Certificates: []tls.Certificate{cert}}
+       config.Rand = rand.Reader
+       service := "0.0.0.0:8080"
+       listener, err := tls.Listen("tcp", service, &config)
+       if err != nil {
+               log.Fatalf("server: listen: %s", err)
+       }
+       log.Print("server: listening")
+       for {
+               conn, err := listener.Accept()
+               if err != nil {
+                       log.Printf("server: accept: %s", err)
+                       break
+               }
+               defer conn.Close()
+               log.Printf("server: accepted from %s", conn.RemoteAddr())
+               tlscon, ok := conn.(*tls.Conn)
+               if ok {
+                       log.Print("ok=true")
+                       state := tlscon.ConnectionState()
+                       for _, v := range state.PeerCertificates {
+                               log.Print(x509.MarshalPKIXPublicKey(v.PublicKey))
+                       }
+               }
+
+               rc := make(chan []byte, 1024)
+
+               wc := make(chan []byte, 1024)
+
+               go readHandler(conn, rc)
+
+               go worker(rc, wc)
+
+               go writeHandler(conn, wc)
+
+       }
+}
diff --git a/0xetc/0xgo/sock-tcp/certgen.sh b/0xetc/0xgo/sock-tcp/certgen.sh
new file mode 100755 (executable)
index 0000000..493976f
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+rm -r ./client/certs/*
+
+rm -r ./server/certs/*
+
+echo "root generating...."
+
+openssl genrsa -out ./client/certs/ca_priv.pem 4096
+
+openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
+
+openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
+
+echo "server key pair, csr generating...."
+
+openssl genrsa -out ./server/certs/server.key 4096
+
+openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
+
+openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
+
+echo "signing requests for server...."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
+
+
+echo "done!"
\ No newline at end of file
diff --git a/0xetc/0xgo/sock-tcp/client/certs/ca.pem b/0xetc/0xgo/sock-tcp/client/certs/ca.pem
new file mode 100644 (file)
index 0000000..a01c57f
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/zCCAuegAwIBAgIUJaxWVeWBx0o+5tTvweUncow0Ma0wDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMjlaFw0zNTAyMDYxMTQx
+MjlaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCpRl2utUhApEwha6B7Vr+8YJLWgbINjHMkzCJOyqVnvi6+Ja0pfYFXiZAp
+xewegSsK1QaEpW8zTRgmTVaA9q4MryV7PoYz5Lx+vQR+Q5TYy2WkeW3TAKmSiZOS
+tPa6UVjryGq5rK5L+3QkiJ5ckNXUpi6xYvSwWpVMVKm3XFD2VNM19wcxi42UfhSG
+ABa6F+qkz/TG/3DChCakCxEPB68ldKm9NeS0QSrDtmyvgMg2uigmupRZcbnnS6i6
+WI89N+9hO2SED0WG9AjbnpWYTkG+XyD9ljILtgO85vMPR+kcV5nRgrk6tONpDsA0
+rOsreu0zXyP6olnZyGLCrwrsDTQTda4DZ1H10OLZ6NMbEWzf6pMGS/RPLBxYKaZZ
+ITZqrF35QKlF3BUQxOwZrIeNuZlfwD7X9k5f7Z1b+ChX6wuG/qjsQNtkdQl9V0/T
+fKWeFslJvIghQjaQQef5tqiF5AGUV1MBPdYQ4M8pSEMvESaK3a7RrMImbGpi2uvq
+Ua5Rik6liw0m3jGT2tEMfOOhLUP6rpAelNzykqI7dN9yELLK57gmvKUrUt59oqdI
+wkjcYXrlxk/ntKS4sLcz9LsFYM98Gecl6irK0KqmR4fM0ueTumvMNkeKOn6BISJz
+hoDbjb6BU06N6q/p2ZBG1yJmAVgxdQ4ejJqtOuNLL8N6kX/bSQIDAQABo1MwUTAd
+BgNVHQ4EFgQUfMktrWwZkMks0TEaY4IclVFnb5IwHwYDVR0jBBgwFoAUfMktrWwZ
+kMks0TEaY4IclVFnb5IwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
+AgEAZ1kQ6OUReLN9CIz6MCb0ZMbMkvA469R5WYLuq/GbguE51l7sKfCRIc7isRe1
+ubt1qgBIIYveZu6FI4OCBgOpRJMoKFRSyo9MVNGyVjEuqqxW+MxE6LIb6NoRypNl
+XrynxlfgrLCIMNhI73Ri1A+THwc91G8NJM5AkCygMejiCMKoDFM0hadMP8B5/hqE
+WeviGenzrsuSuG/3G75RFvBpo6kYLEhIwMWfOsnOUi//M9MBOczjsOBTBbrZcIYL
+T9UP8jiKjGjcwLBrKLbwhu01zFC3vokwB+91MCyCTmNbuPY7KoIPnhKhWtgzd7g1
+EltiNwOShyS/kURHm4XquEvj95FVLGLTHm/selrJKtt+rzOvGi+MWRxfXentoDyt
+6OkbaaBToEmI9xYldKpA35yNirUEbvi7mTHm6Q5BtlSBvBL1xvVXPwUEdoJUirAl
+I9x+EEWwvFJZ0eroCkv1NjDHtpybRQbbnVNushPbfMyUFOSmLLKb5JVjWNWGCpHv
+0VFBohUr3lrm04Hc6VLcXEoTs9a/7fu5h9THsA1cnaHYq4aS8trTgx1Zh3wxDScK
+s9GfSgjfNutRvzwCaIgCio73g9k0Ac4mUxJAaEwQBbLl9pMH3NHfe6LKU94vhRHM
+PzN2NXG+uef5/OU1qp1fnJyNsoD7V9baW5FTxdBTINt0QDk=
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/sock-tcp/client/certs/ca.srl b/0xetc/0xgo/sock-tcp/client/certs/ca.srl
new file mode 100644 (file)
index 0000000..e446e15
--- /dev/null
@@ -0,0 +1 @@
+583097A8573CE10C8940EFE5892C6FB7706960C7
diff --git a/0xetc/0xgo/sock-tcp/client/certs/ca_priv.pem b/0xetc/0xgo/sock-tcp/client/certs/ca_priv.pem
new file mode 100644 (file)
index 0000000..4db6c12
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+fJIrFNbakNgT3zvHUrA2KSgwKsTW
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/sock-tcp/client/certs/ca_pub.pem b/0xetc/0xgo/sock-tcp/client/certs/ca_pub.pem
new file mode 100644 (file)
index 0000000..988570c
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqUZdrrVIQKRMIWuge1a/
+vGCS1oGyDYxzJMwiTsqlZ74uviWtKX2BV4mQKcXsHoErCtUGhKVvM00YJk1WgPau
+DK8lez6GM+S8fr0EfkOU2MtlpHlt0wCpkomTkrT2ulFY68hquayuS/t0JIieXJDV
+1KYusWL0sFqVTFSpt1xQ9lTTNfcHMYuNlH4UhgAWuhfqpM/0xv9wwoQmpAsRDwev
+JXSpvTXktEEqw7Zsr4DINrooJrqUWXG550uouliPPTfvYTtkhA9FhvQI256VmE5B
+vl8g/ZYyC7YDvObzD0fpHFeZ0YK5OrTjaQ7ANKzrK3rtM18j+qJZ2chiwq8K7A00
+E3WuA2dR9dDi2ejTGxFs3+qTBkv0TywcWCmmWSE2aqxd+UCpRdwVEMTsGayHjbmZ
+X8A+1/ZOX+2dW/goV+sLhv6o7EDbZHUJfVdP03ylnhbJSbyIIUI2kEHn+baoheQB
+lFdTAT3WEODPKUhDLxEmit2u0azCJmxqYtrr6lGuUYpOpYsNJt4xk9rRDHzjoS1D
++q6QHpTc8pKiO3TfchCyyue4JrylK1LefaKnSMJI3GF65cZP57SkuLC3M/S7BWDP
+fBnnJeoqytCqpkeHzNLnk7przDZHijp+gSEic4aA242+gVNOjeqv6dmQRtciZgFY
+MXUOHoyarTrjSy/DepF/20kCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/sock-tcp/client/main.go b/0xetc/0xgo/sock-tcp/client/main.go
new file mode 100644 (file)
index 0000000..573819f
--- /dev/null
@@ -0,0 +1,37 @@
+package main
+
+import (
+       "fmt"
+       "net"
+       "os"
+)
+
+func main() {
+
+       mode := os.Args[1]
+
+       if mode == "net" {
+               conn, err := net.Dial("tcp", "localhost:8080")
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               wbuf := make([]byte, 1024)
+
+               copy(wbuf, "Hello, server!")
+
+               _, err = conn.Write(wbuf)
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               conn.Close()
+
+       } else if mode == "tls" {
+
+               TlsConnection()
+       }
+
+}
diff --git a/0xetc/0xgo/sock-tcp/client/tls.go b/0xetc/0xgo/sock-tcp/client/tls.go
new file mode 100644 (file)
index 0000000..5cf24bd
--- /dev/null
@@ -0,0 +1,68 @@
+package main
+
+import (
+       "crypto/tls"
+       "crypto/x509"
+       "fmt"
+       "log"
+       "os"
+       "time"
+)
+
+func TlsConnection() {
+
+       certpool := x509.NewCertPool()
+
+       file_b, err := os.ReadFile("certs/ca.pem")
+
+       /*
+               ca_pem := new(bytes.Buffer)
+
+               pem.Encode(ca_pem, &pem.Block{
+                       Type:  "CERTIFICATE",
+                       Bytes: file_b,
+               })
+       */
+       certpool.AppendCertsFromPEM(file_b)
+
+       config := tls.Config{RootCAs: certpool}
+       conn, err := tls.Dial("tcp", "localhost:8080", &config)
+       if err != nil {
+               log.Fatalf("client: dial: %s", err)
+       }
+       defer conn.Close()
+       log.Println("client: connected to: ", conn.RemoteAddr())
+
+       state := conn.ConnectionState()
+       for _, v := range state.PeerCertificates {
+               fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey))
+               fmt.Println(v.Subject)
+       }
+       log.Println("client: handshake: ", state.HandshakeComplete)
+       log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual)
+
+       message := make([]byte, 1024)
+       copy(message, "hello tls server")
+       n, err := conn.Write(message)
+       if err != nil {
+               log.Fatalf("client: write: %s", err)
+       }
+
+       reply := make([]byte, 1024)
+
+       readlen := 0
+
+       for readlen != 1024 {
+
+               n, err = conn.Read(reply[readlen:])
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               readlen += n
+       }
+       log.Printf("client: read :%s (%d bytes)", string(reply[:readlen]), readlen)
+       time.Sleep(time.Millisecond * 1000)
+       log.Print("client: exiting")
+}
diff --git a/0xetc/0xgo/sock-tcp/server/certs/server.csr b/0xetc/0xgo/sock-tcp/server/certs/server.csr
new file mode 100644 (file)
index 0000000..5b41b91
--- /dev/null
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAkjTQrJ54b5bGM+dC2UBSnzfohGT2Jf+4hcckBUDi
+3w5xnvqbzCjjjy39i59WqzzblrdDmu6sgbWzLxbNLHMGm9Zugj5nW6aerycBY8Yr
+tyj6udqQ4UFnnhnN3yD0DSUhLMCxAd+j3441XabI+YL1RhEjC5UWdEtmRUIhGL5Y
+JtfomEXdpNeshpRZXU3Ui6o6zW5Vwq1ZuhAL17emLDta1R5R0VTLccnE43imhC4K
+pLmsXM5QZc+fSmHHQD3MX6v5TQN2ASYhtYvT6KuVT4dHq4EfVqfTzcScW+KDV7rg
+PH8WYh2SrONhugNtNsSc+Y2BjcEzKk3FEJmyRP0/lULpUkg5MzANHUW+D3l0sUJd
+oQ+wsq+aeLH5D2RUW0/o4dZREo7N2uJgCzWawebuIxD1Hnsrm0XNnyk1z1blEssp
+rstTbCuOQPC5HWG/SdyX5rCuiTtnSyO1x+mNBhtBrwXO8ur7bgBuzT6QUPcYtRgz
+0cEeUTofuczeLonsL+t77khK+LdtisXmCqFZelm5VoHDxBYde7uBR/IIrL29s8KF
+SFcU5hstpJKcTpbXvKOxvh2axUq2OJysn8xVSEZ1tDyOHIjH3NBwVcFkcZHEgrLA
+/ph0HwolIiH1EE7473XyGOqqyJKyk9DA6jL9UF282m42t1gHsTVwIAcpsh2U5uXe
+8GECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCLvBYMKRYpz8FWWwA8Asq7RrXl
+jPsaHhy8Bt+7s58VYKrvt10ip0qF97equA8AJB5sf8KxihfKeuWYMfuy3cyq8Erx
+geUPa+TrlVdLkbi3qqeSJaDObg/MYrZmv+dJGYRMUxlzeOGncCZEhIOKUQRRkT73
+rxOEFEc1gLPi0p9fqsTuyyLWmQUd8rwfhoMubFiXkhFnw/NEBJPl6GqpjNGTsbyN
+lUtA9wNK9ys2tuyL9yEzgmrKAkBljS6f98QIqN14EvSvF85Y910m5aC9uzadv6zr
+Llgs7s18GI4tLq9xl1IpiiVrZxE1I97rgjJa29hSF0EZy3UW0esI/ZN8GpDmHwLN
+CSbDOJDuNYsYeGrIsXzKNSK5kZYG2Zs4iVIwug335Bi/lN4g3NyMJxi2IdDHqgHw
+GRDqb24VXhS5TyuVJ16schCCqA02Qh6SOSCWyy/Ao8UWm+XnMn8alm3DGGTCZNFP
+pvSAd4YztkKcTayk7FDHczZcCDK7FMIVBSKRmsF1ahYYiiYfPAMs0Kf0D0GkSBPz
+NR1+ImpNitFh94fAffo18lTm8eUE324ajBLgj9xOD6S4e2F1Q1GvgFaIWThe3thg
+bcp9lGl+fBdmDz3wmPN+5/AitSr3W655eBoMYqObgjYpMj7/7/PTauvh/vQ4xzPX
+SpUNK+yMT+N/hc2H+w==
+-----END CERTIFICATE REQUEST-----
diff --git a/0xetc/0xgo/sock-tcp/server/certs/server.key b/0xetc/0xgo/sock-tcp/server/certs/server.key
new file mode 100644 (file)
index 0000000..1382e5c
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+YBLNr2GdmvMahJVy1gQXG9HlYIj/sA==
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/sock-tcp/server/certs/server.pem b/0xetc/0xgo/sock-tcp/server/certs/server.pem
new file mode 100644 (file)
index 0000000..2f00061
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIFCTCCAvGgAwIBAgIUWDCXqFc84QyJQO/liSxvt3BpYMcwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMzBaFw0yNjAyMDgxMTQx
+MzBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAJI00KyeeG+WxjPnQtlAUp836IRk9iX/uIXHJAVA4t8OcZ76m8wo
+448t/YufVqs825a3Q5rurIG1sy8WzSxzBpvWboI+Z1umnq8nAWPGK7co+rnakOFB
+Z54Zzd8g9A0lISzAsQHfo9+ONV2myPmC9UYRIwuVFnRLZkVCIRi+WCbX6JhF3aTX
+rIaUWV1N1IuqOs1uVcKtWboQC9e3piw7WtUeUdFUy3HJxON4poQuCqS5rFzOUGXP
+n0phx0A9zF+r+U0DdgEmIbWL0+irlU+HR6uBH1an083EnFvig1e64Dx/FmIdkqzj
+YboDbTbEnPmNgY3BMypNxRCZskT9P5VC6VJIOTMwDR1Fvg95dLFCXaEPsLKvmnix
++Q9kVFtP6OHWURKOzdriYAs1msHm7iMQ9R57K5tFzZ8pNc9W5RLLKa7LU2wrjkDw
+uR1hv0ncl+awrok7Z0sjtcfpjQYbQa8FzvLq+24Abs0+kFD3GLUYM9HBHlE6H7nM
+3i6J7C/re+5ISvi3bYrF5gqhWXpZuVaBw8QWHXu7gUfyCKy9vbPChUhXFOYbLaSS
+nE6W17yjsb4dmsVKtjicrJ/MVUhGdbQ8jhyIx9zQcFXBZHGRxIKywP6YdB8KJSIh
+9RBO+O918hjqqsiSspPQwOoy/VBdvNpuNrdYB7E1cCAHKbIdlObl3vBhAgMBAAGj
+WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU89cgoz1/aHzj2bu3
+RywilJJM5M8wHwYDVR0jBBgwFoAUfMktrWwZkMks0TEaY4IclVFnb5IwDQYJKoZI
+hvcNAQELBQADggIBAKHCXvS4uX9o24h3XGN20Q4FzfofAZ7dHDjqNglg/0SxxvgO
+2R1kyDNrD8PiaQRP990gNhodSp38XtMLro8nRWjQHyY0Wxv/msBd+BQF4kJ6/BLn
+l2TBFpGCa1VN6zKed4Nf0BW5WKEuQIiuJ2IfNpp/Eel/5duKWGbhAKr4tVGXCWRV
+SmpNl+aGKsxgrx2vZw92JgoRJ/bBOQp/C+etwI/Yravgbl6KVRhpx4Fwbu/nXErm
+YUXyynpk2wlfKvOgW0DJpeJ7VwGukwtvLdeaOq6+goVXa2rJrrjYyLBsCNIaiNiW
+cmBZp1k8zJQ0BQbY8a/FTb3yrFMo80EzpRQ10VtBztO8I11IE2K8fIEv5HpqIDYJ
+h6sdvWP7dJYyXih1cKS78LRCuyOTyrRPjpyVwyzz5bbbrlcu5smNvK5HqbM9GeAT
+R4+43ifMk9ZIObd8MlKgXTDC7QFb2GjiCUJF5hMGTlrwUZDNR4Esibe8l1xHd0yL
+XQSNzBvj0UcKmuhabx79dAZLl/DutB95kH8esjPj0eCLwlZYkAZwXuw/xIbUIL5s
+GsN0klNego9c51ey27K4CVVznt/8xPRfR182ZOr9KVE20cphK0UyAFaXhSCkZLaq
+b/3+P6Dg7dDK2k5wFLWfOX0bhVbhfYIX8GZM9VGX/Dn3DqZtC1QXxDpyFlDG
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/sock-tcp/server/certs/server.pub b/0xetc/0xgo/sock-tcp/server/certs/server.pub
new file mode 100644 (file)
index 0000000..058ca12
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkjTQrJ54b5bGM+dC2UBS
+nzfohGT2Jf+4hcckBUDi3w5xnvqbzCjjjy39i59WqzzblrdDmu6sgbWzLxbNLHMG
+m9Zugj5nW6aerycBY8Yrtyj6udqQ4UFnnhnN3yD0DSUhLMCxAd+j3441XabI+YL1
+RhEjC5UWdEtmRUIhGL5YJtfomEXdpNeshpRZXU3Ui6o6zW5Vwq1ZuhAL17emLDta
+1R5R0VTLccnE43imhC4KpLmsXM5QZc+fSmHHQD3MX6v5TQN2ASYhtYvT6KuVT4dH
+q4EfVqfTzcScW+KDV7rgPH8WYh2SrONhugNtNsSc+Y2BjcEzKk3FEJmyRP0/lULp
+Ukg5MzANHUW+D3l0sUJdoQ+wsq+aeLH5D2RUW0/o4dZREo7N2uJgCzWawebuIxD1
+Hnsrm0XNnyk1z1blEssprstTbCuOQPC5HWG/SdyX5rCuiTtnSyO1x+mNBhtBrwXO
+8ur7bgBuzT6QUPcYtRgz0cEeUTofuczeLonsL+t77khK+LdtisXmCqFZelm5VoHD
+xBYde7uBR/IIrL29s8KFSFcU5hstpJKcTpbXvKOxvh2axUq2OJysn8xVSEZ1tDyO
+HIjH3NBwVcFkcZHEgrLA/ph0HwolIiH1EE7473XyGOqqyJKyk9DA6jL9UF282m42
+t1gHsTVwIAcpsh2U5uXe8GECAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/sock-tcp/server/main.go b/0xetc/0xgo/sock-tcp/server/main.go
new file mode 100644 (file)
index 0000000..95a0920
--- /dev/null
@@ -0,0 +1,69 @@
+package main
+
+import (
+       "fmt"
+       "net"
+       "os"
+)
+
+func main() {
+
+       mode := os.Args[1]
+
+       if mode == "net" {
+               ln, err := net.Listen("tcp", "0.0.0.0:8080")
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+               for {
+                       conn, err := ln.Accept()
+                       if err != nil {
+                               fmt.Println(err)
+                               continue
+                       }
+
+                       go handleConnection(conn)
+               }
+       } else if mode == "tls" {
+
+               TlsListen()
+
+       }
+
+}
+
+func handleConnection(conn net.Conn) {
+
+       defer conn.Close()
+
+       buf := make([]byte, 1024)
+
+       for {
+
+               readlen := 0
+
+               for readlen != 1024 {
+
+                       n, err := conn.Read(buf[readlen:])
+                       if err != nil {
+                               fmt.Println(err)
+                               return
+                       }
+
+                       readlen += n
+               }
+
+               fmt.Printf("Received: %s", buf)
+
+               _, err := conn.Write(buf)
+
+               if err != nil {
+                       fmt.Println(err)
+                       return
+               }
+
+       }
+
+}
diff --git a/0xetc/0xgo/sock-tcp/server/tls.go b/0xetc/0xgo/sock-tcp/server/tls.go
new file mode 100644 (file)
index 0000000..b168244
--- /dev/null
@@ -0,0 +1,78 @@
+package main
+
+import (
+       "crypto/rand"
+       "crypto/tls"
+       "crypto/x509"
+       "log"
+       "net"
+)
+
+func TlsListen() {
+       cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key")
+       if err != nil {
+               log.Fatalf("server: loadkeys: %s", err)
+       }
+       config := tls.Config{Certificates: []tls.Certificate{cert}}
+       config.Rand = rand.Reader
+       service := "0.0.0.0:8080"
+       listener, err := tls.Listen("tcp", service, &config)
+       if err != nil {
+               log.Fatalf("server: listen: %s", err)
+       }
+       log.Print("server: listening")
+       for {
+               conn, err := listener.Accept()
+               if err != nil {
+                       log.Printf("server: accept: %s", err)
+                       break
+               }
+               defer conn.Close()
+               log.Printf("server: accepted from %s", conn.RemoteAddr())
+               tlscon, ok := conn.(*tls.Conn)
+               if ok {
+                       log.Print("ok=true")
+                       state := tlscon.ConnectionState()
+                       for _, v := range state.PeerCertificates {
+                               log.Print(x509.MarshalPKIXPublicKey(v.PublicKey))
+                       }
+               }
+               go handleClient(conn)
+       }
+}
+
+func handleClient(conn net.Conn) {
+       defer conn.Close()
+       buf := make([]byte, 1024)
+       var reterr error = nil
+       for {
+               readlen := 0
+               log.Print("server: conn: waiting")
+
+               for readlen != 1024 {
+
+                       n, err := conn.Read(buf[readlen:])
+                       if err != nil {
+
+                               reterr = err
+                               break
+                       }
+
+                       readlen += n
+               }
+
+               if reterr != nil {
+                       log.Printf("server: conn: read: %s", reterr)
+                       return
+               }
+
+               log.Printf("server: conn: echo %s\n", string(buf))
+               _, err := conn.Write(buf)
+
+               if err != nil {
+                       log.Printf("server: write: %s", err)
+                       break
+               }
+       }
+       log.Println("server: conn: closed")
+}
diff --git a/0xetc/0xgo/sock-udp/Makefile b/0xetc/0xgo/sock-udp/Makefile
new file mode 100644 (file)
index 0000000..372df8f
--- /dev/null
@@ -0,0 +1,5 @@
+all:
+
+       go build -o client/client.out ./client 
+
+       go build -o server/server.out ./server
\ No newline at end of file
diff --git a/0xetc/0xgo/sock-udp/client/main.go b/0xetc/0xgo/sock-udp/client/main.go
new file mode 100644 (file)
index 0000000..0693e2b
--- /dev/null
@@ -0,0 +1,30 @@
+package main
+
+import (
+       "fmt"
+       "net"
+)
+
+var addr = "0.0.0.0:8888"
+
+func main() {
+
+       p := make([]byte, 128)
+       conn, err := net.Dial("udp", addr)
+
+       if err != nil {
+               fmt.Printf("Some error %v", err)
+               return
+       }
+
+       copy(p, "hello udp server")
+
+       n, err := conn.Write(p)
+
+       if err == nil {
+               fmt.Printf("sent %d\n", n)
+       } else {
+               fmt.Printf("Some error %v\n", err)
+       }
+       conn.Close()
+}
diff --git a/0xetc/0xgo/sock-udp/server/main.go b/0xetc/0xgo/sock-udp/server/main.go
new file mode 100644 (file)
index 0000000..304bda3
--- /dev/null
@@ -0,0 +1,65 @@
+package main
+
+import (
+       "fmt"
+       "log"
+       "net"
+       "strings"
+)
+
+var addr = "0.0.0.0:8888"
+
+func GetServer(addr string) (*net.UDPConn, error) {
+
+       addrlist := strings.Split(addr, ":")
+
+       var port int
+
+       fmt.Sscanf(addrlist[1], "%d", &port)
+
+       ip := net.ParseIP(addrlist[0]).To4()
+
+       udpaddr := net.UDPAddr{
+
+               IP:   ip,
+               Port: port,
+       }
+
+       listener, err := net.ListenUDP("udp", &udpaddr)
+
+       if err != nil {
+
+               return nil, fmt.Errorf("failed to get server: %s", err.Error())
+       }
+
+       return listener, nil
+}
+
+func main() {
+
+       l, err := GetServer(addr)
+
+       if err != nil {
+
+               log.Printf("failed: %s\n", err.Error())
+
+               return
+       }
+
+       for {
+
+               buf := make([]byte, 128)
+
+               _, remoteaddr, err := l.ReadFromUDP(buf)
+
+               strbuf := string(buf)
+
+               fmt.Printf("Read a message from %v: %s\n", remoteaddr, strbuf)
+
+               if err != nil {
+                       fmt.Printf("Some error  %v", err)
+                       continue
+               }
+
+       }
+}
diff --git a/0xetc/0xgo/sock-unix/Makefile b/0xetc/0xgo/sock-unix/Makefile
new file mode 100644 (file)
index 0000000..8421f5a
--- /dev/null
@@ -0,0 +1,6 @@
+all:
+
+       go build -o client/client.out ./client 
+
+       go build -o server/server.out ./server 
+
diff --git a/0xetc/0xgo/sock-unix/client/main.go b/0xetc/0xgo/sock-unix/client/main.go
new file mode 100644 (file)
index 0000000..c1def0a
--- /dev/null
@@ -0,0 +1,72 @@
+package main
+
+import (
+       "fmt"
+       "log"
+       "net"
+       "time"
+)
+
+var addr = "/tmp/this.sock"
+
+func GetClient(baseAddr string) (net.Conn, error) {
+
+       c, err := net.Dial("unix", baseAddr)
+
+       if err != nil {
+
+               return nil, fmt.Errorf("failed to set ipc client: %s", err.Error())
+       }
+
+       return c, nil
+}
+
+func main() {
+
+       c, err := GetClient(addr)
+
+       if err != nil {
+
+               log.Printf("failed: %s\n", err.Error())
+
+               return
+       }
+
+       buff := make([]byte, 512)
+
+       copy(buff, "hello world")
+
+       for {
+
+               time.Sleep(1 * time.Second)
+
+               n, err := c.Write(buff)
+
+               if err != nil {
+
+                       log.Printf("write failed: %s\n", err.Error())
+
+                       break
+               }
+
+               _ = n
+
+               buff := make([]byte, 512)
+
+               n, err = c.Read(buff)
+
+               if err != nil {
+
+                       log.Printf("read failed: %s\n", err.Error())
+
+                       break
+
+               }
+
+               log.Printf("got message\n")
+
+               fmt.Println(string(buff))
+
+       }
+
+}
diff --git a/0xetc/0xgo/sock-unix/server/main.go b/0xetc/0xgo/sock-unix/server/main.go
new file mode 100644 (file)
index 0000000..2245519
--- /dev/null
@@ -0,0 +1,98 @@
+package main
+
+import (
+       "fmt"
+       "log"
+       "net"
+)
+
+var addr = "/tmp/this.sock"
+
+func GetServer(baseAddr string) (net.Listener, error) {
+
+       listener, err := net.Listen("unix", baseAddr)
+
+       if err != nil {
+
+               return nil, fmt.Errorf("listen error: %s", err.Error())
+
+       }
+
+       return listener, nil
+}
+
+func doProcess(c net.Conn) {
+
+       for {
+
+               buf := make([]byte, 512)
+
+               wbuf := make([]byte, 512)
+
+               n, err := c.Read(buf)
+
+               if err != nil {
+
+                       log.Printf("read: %s\n", err.Error())
+
+                       return
+               }
+
+               nStr := fmt.Sprintf("%d", n)
+
+               var strlen int = 0
+
+               for i := 0; i < 512; i++ {
+
+                       strlen = i
+
+                       if buf[i] == 0 {
+
+                               break
+                       }
+
+               }
+
+               copy(wbuf, buf[:strlen])
+
+               copy(wbuf[strlen:], []byte(nStr))
+
+               _, err = c.Write(wbuf)
+
+               if err != nil {
+
+                       log.Printf("write: %s\n", err.Error())
+
+                       return
+               }
+
+       }
+
+}
+
+func main() {
+
+       l, err := GetServer(addr)
+
+       if err != nil {
+               log.Printf("failed to get server: %s\n", err.Error())
+
+               return
+       }
+
+       for {
+
+               c, err := l.Accept()
+
+               if err != nil {
+
+                       log.Printf("failed to accept: %s\n", err.Error())
+
+                       continue
+               }
+
+               go doProcess(c)
+
+       }
+
+}
diff --git a/0xetc/0xgo/util/util.go b/0xetc/0xgo/util/util.go
new file mode 100644 (file)
index 0000000..c62c06e
--- /dev/null
@@ -0,0 +1,274 @@
+package util
+
+import (
+       "bytes"
+       "crypto/rand"
+       "encoding/hex"
+       "io"
+       "log"
+       "os"
+       "strconv"
+       "strings"
+       "time"
+
+       "golang.org/x/crypto/ssh"
+)
+
+var HEX_RUNES = []rune{
+       '0',
+       '1',
+       '2',
+       '3',
+       '4',
+       '5',
+       '6',
+       '7',
+       '8',
+       '9',
+       'a',
+       'b',
+       'c',
+       'd',
+       'e',
+       'f',
+}
+
+func CheckIfSliceContains[T comparable](slice []T, ele T) bool {
+
+       hit := false
+
+       for i := 0; i < len(slice); i++ {
+
+               if slice[i] == ele {
+
+                       hit = true
+
+                       return hit
+               }
+
+       }
+
+       return hit
+
+}
+
+func PopFromSliceByIndex[T comparable](slice []T, idx int) (T, []T) {
+
+       pop_val := slice[idx]
+
+       return pop_val, append(slice[:idx], slice[idx+1:]...)
+
+}
+
+func InsertToSliceByIndex[T comparable](slice []T, idx int, val T) []T {
+
+       return append(slice[:idx], append([]T{val}, slice[idx:]...)...)
+}
+
+func SplitStrict(content string) map[string]string {
+       out := map[string]string{}
+       for _, line := range strings.Split(content, "\n") {
+               parts := strings.SplitN(line, "=", 2)
+               if len(parts) != 2 {
+                       continue
+               }
+               key := parts[0]
+               if len(key) == 0 || key[0] == '#' {
+                       continue
+               }
+
+               value := parts[1]
+               if len(value) > 2 && value[0] == '"' && value[len(value)-1] == '"' {
+
+                       var err error
+                       value, err = strconv.Unquote(value)
+                       if err != nil {
+                               continue
+                       }
+               }
+               out[key] = value
+       }
+       return out
+}
+
+func MakeOSReleaseLinux() map[string]string {
+
+       var osRelease map[string]string
+
+       if osRelease == nil {
+
+               osRelease = map[string]string{}
+               if bytes, err := os.ReadFile("/etc/os-release"); err == nil {
+                       osRelease = SplitStrict(string(bytes))
+               }
+       }
+       return osRelease
+}
+
+func SliceContains(s []string, str string) bool {
+       for _, v := range s {
+               if v == str {
+                       return true
+               }
+       }
+
+       return false
+}
+
+func RandomHex(n int) (string, error) {
+       bytes := make([]byte, n)
+       if _, err := rand.Read(bytes); err != nil {
+               return "", err
+       }
+       return hex.EncodeToString(bytes), nil
+}
+
+type ShellConnection struct {
+       *ssh.Client
+       password string
+}
+
+func ShellConnect(addr, user, password string) (*ShellConnection, error) {
+
+       var hostkeyCallback = ssh.InsecureIgnoreHostKey()
+
+       sshConfig := &ssh.ClientConfig{
+               User: user,
+               Auth: []ssh.AuthMethod{
+                       ssh.Password(password),
+               },
+               HostKeyCallback: hostkeyCallback,
+       }
+
+       conn, err := ssh.Dial("tcp", addr, sshConfig)
+       if err != nil {
+               return nil, err
+       }
+
+       return &ShellConnection{conn, password}, nil
+
+}
+
+func (conn *ShellConnection) SendCommands(cmds string) ([]byte, error) {
+       session, err := conn.NewSession()
+       if err != nil {
+               log.Fatal(err)
+       }
+       defer session.Close()
+
+       modes := ssh.TerminalModes{
+               ssh.ECHO:          0,
+               ssh.TTY_OP_ISPEED: 14400,
+               ssh.TTY_OP_OSPEED: 14400,
+       }
+
+       err = session.RequestPty("xterm", 80, 40, modes)
+       if err != nil {
+               return []byte{}, err
+       }
+
+       stdoutB := new(bytes.Buffer)
+       session.Stdout = stdoutB
+       in, _ := session.StdinPipe()
+
+       go func(in io.Writer, output *bytes.Buffer) {
+
+               t_start := time.Now()
+
+               for {
+
+                       t_now := time.Now()
+
+                       diff := t_now.Sub(t_start)
+                       if strings.Contains(string(output.Bytes()), "[sudo] password for ") {
+                               _, err = in.Write([]byte(conn.password + "\n"))
+                               if err != nil {
+                                       break
+                               }
+                               break
+                       }
+                       if diff.Seconds() > 30 {
+                               break
+                       }
+               }
+       }(in, stdoutB)
+
+       err = session.Run(cmds)
+       if err != nil {
+               return []byte{}, err
+       }
+       return stdoutB.Bytes(), nil
+}
+
+func (conn *ShellConnection) SendCommandsBackground(cmds string) ([]byte, error) {
+       session, err := conn.NewSession()
+       if err != nil {
+               log.Fatal(err)
+       }
+       defer session.Close()
+
+       stdoutB := new(bytes.Buffer)
+       session.Stdout = stdoutB
+       in, _ := session.StdinPipe()
+
+       go func(in io.Writer, output *bytes.Buffer) {
+
+               t_start := time.Now()
+
+               for {
+
+                       t_now := time.Now()
+
+                       diff := t_now.Sub(t_start)
+
+                       if strings.Contains(string(output.Bytes()), "[sudo] password for ") {
+                               _, err = in.Write([]byte(conn.password + "\n"))
+                               if err != nil {
+                                       break
+                               }
+                               break
+                       }
+
+                       if diff.Seconds() > 30 {
+                               break
+                       }
+
+               }
+       }(in, stdoutB)
+
+       err = session.Start(cmds)
+       if err != nil {
+               return []byte{}, err
+       }
+       return stdoutB.Bytes(), nil
+}
+
+func SanitizeUnnecessary(line string) string {
+
+       ret := ""
+
+       line = strings.ReplaceAll(line, " ", "")
+       line = strings.ReplaceAll(line, "\n", "")
+
+       llen := len(line)
+
+       for i := 0; i < llen; i++ {
+
+               if line[i] == '[' || line[i] == ']' {
+
+                       continue
+
+               } else if line[i] == ',' {
+
+                       ret += " "
+
+               } else {
+
+                       ret += string(line[i])
+
+               }
+
+       }
+
+       return ret
+}
diff --git a/0xetc/0xgo/webrtc/Makefile b/0xetc/0xgo/webrtc/Makefile
new file mode 100644 (file)
index 0000000..c0436be
--- /dev/null
@@ -0,0 +1,6 @@
+all:
+       go build -o main.out .
+
+clean:
+
+       rm -rf *.out
\ No newline at end of file
diff --git a/0xetc/0xgo/webrtc/config.yaml b/0xetc/0xgo/webrtc/config.yaml
new file mode 100644 (file)
index 0000000..ae7f13f
--- /dev/null
@@ -0,0 +1,27 @@
+turnServerAddr:
+  - addr: turn:localhost:3478
+    id: hello
+    pw: example
+
+rooms:
+  - key: abcd
+    members:
+      - hello
+      - world
+
+url: "localhost"
+
+signalPort: 8002
+
+rtpReceivePort: 8004
+
+peerSignalAttemptSync: 5
+
+peerSignalAddr : /signal/peer/
+
+rtcpPLIInterval: 3
+
+udpMuxPort: 8006
+
+udpEphemeralPortMin: 31000
+udpEphemeralPortMax: 31100
diff --git a/0xetc/0xgo/webrtc/main.go b/0xetc/0xgo/webrtc/main.go
new file mode 100644 (file)
index 0000000..8a09baf
--- /dev/null
@@ -0,0 +1,137 @@
+package main
+
+import (
+       "fmt"
+       "log"
+       "os"
+       "time"
+
+       "github.com/gin-gonic/contrib/sessions"
+       "github.com/gin-gonic/gin"
+       "gopkg.in/yaml.v3"
+
+       "github.com/seantywork/go/webrtc/webrtc"
+)
+
+type Config struct {
+       TurnServerAddr []struct {
+               Addr string `yaml:"addr"`
+               Id   string `yaml:"id"`
+               Pw   string `yaml:"pw"`
+       } `yaml:"turnServerAddr"`
+       Rooms []struct {
+               Key     string   `yaml:"key"`
+               Members []string `yaml:"members"`
+       } `yaml:"rooms"`
+       Url                   string `yaml:"url"`
+       SignalPort            int    `yaml:"signalPort"`
+       RtpReceivePort        int    `yaml:"rtpReceivePort"`
+       PeerSignalAttemptSync int    `yaml:"peerSignalAttemptSync"`
+       PeerSignalAddr        string `yaml:"peerSignalAddr"`
+       RtcpPLIInterval       int    `yaml:"rtcpPLIInterval"`
+       UdpMuxPort            int    `yaml:"udpMuxPort"`
+       UdpEphemeralPortMin   int    `yaml:"udpEphemeralPortMin"`
+       UdpEphemeralPortMax   int    `yaml:"udpEphemeralPortMax"`
+}
+
+func GetIndex(c *gin.Context) {
+
+       c.HTML(200, "index.html", gin.H{})
+
+}
+
+func main() {
+
+       file_b, err := os.ReadFile("config.yaml")
+
+       if err != nil {
+
+               log.Printf("failed to read config.yaml: %v", err)
+
+               os.Exit(-1)
+       }
+
+       conf := Config{}
+
+       err = yaml.Unmarshal(file_b, &conf)
+
+       if err != nil {
+               log.Printf("failed to unmarshal: %v\n", err)
+
+               os.Exit(-1)
+       }
+
+       turnlen := len(conf.TurnServerAddr)
+
+       for i := 0; i < turnlen; i++ {
+
+               addr := struct {
+                       Addr string `json:"addr"`
+                       Id   string `json:"id"`
+                       Pw   string `json:"pw"`
+               }{}
+
+               addr.Addr = conf.TurnServerAddr[i].Addr
+               addr.Id = conf.TurnServerAddr[i].Id
+               addr.Pw = conf.TurnServerAddr[i].Pw
+
+               webrtc.TURN_SERVER_ADDR = append(webrtc.TURN_SERVER_ADDR, addr)
+
+       }
+
+       roomlen := len(conf.Rooms)
+
+       for i := 0; i < roomlen; i++ {
+
+               pc := webrtc.PeersCreate{}
+
+               pc.RoomName = conf.Rooms[i].Key
+
+               pc.Users = conf.Rooms[i].Members
+
+               webrtc.CreatePeers(&pc)
+
+       }
+
+       webrtc.URL = conf.Url
+       webrtc.CHANNEL_PORT = fmt.Sprintf("%d", conf.SignalPort)
+       webrtc.RTP_RECEIVE_PORT = fmt.Sprintf("%d", conf.RtpReceivePort)
+       webrtc.PEER_SIGNAL_ATTEMPT_SYNC = conf.PeerSignalAttemptSync
+       webrtc.PEERS_SIGNAL_PATH = conf.PeerSignalAddr
+       webrtc.RTCP_PLI_INTERVAL = time.Second * time.Duration(conf.RtcpPLIInterval)
+       webrtc.UDP_MUX_PORT = conf.UdpMuxPort
+       webrtc.UDP_EPHEMERAL_PORT_MIN = conf.UdpEphemeralPortMin
+       webrtc.UDP_EPHEMERAL_PORT_MAX = conf.UdpEphemeralPortMax
+
+       webrtc.InitWebRTCApi()
+
+       server := gin.Default()
+
+       store := sessions.NewCookieStore([]byte("WEBRTC"))
+
+       server.Use(sessions.Sessions("WEBRTC", store))
+
+       server.LoadHTMLGlob("view/*")
+
+       server.Static("/public", "./public")
+
+       server.GET("/", GetIndex)
+
+       server.GET("/rtmp", webrtc.GetRtmp)
+
+       server.POST("/api/rtmp/open", webrtc.RtmpOpen)
+
+       server.GET("/room/:roomId/:userId", webrtc.GetRoom)
+
+       server.GET("/api/peers/signal/address", webrtc.GetPeersSignalAddress)
+
+       go webrtc.InitRTMPServer()
+
+       webrtc.AddChannelHandler(conf.PeerSignalAddr, webrtc.RoomSignalHandler)
+
+       webrtc.AddChannelCallback(webrtc.SignalDispatcher)
+
+       go webrtc.StartAllChannelHandlers()
+
+       server.Run("0.0.0.0:8000")
+}
diff --git a/0xetc/0xgo/webrtc/public/js/room.js b/0xetc/0xgo/webrtc/public/js/room.js
new file mode 100644 (file)
index 0000000..3290502
--- /dev/null
@@ -0,0 +1,232 @@
+
+
+pc = {}
+ws = {}
+
+PEERS_SIGNAL_ADDRESS = ""
+
+TURN_SERVER_ADDRESS= {}
+
+ICE_SENT = 0
+
+MESSAGE_FORMAT = {
+
+    command: "",
+    data: ""
+
+}
+
+async function initPeers(){
+
+
+
+    let roomInfo = JSON.stringify(ROOM_INFO)
+
+    if(roomInfo == ""){
+
+        alert("no room info provided")
+
+        return
+    }
+
+    await init()
+
+
+
+    navigator.mediaDevices.getUserMedia({ video: true, audio: true })
+        .then(function(stream){
+
+            pc = new RTCPeerConnection({
+//                        iceServers: [
+//                            {
+//                                urls: TURN_SERVER_ADDRESS.addr,
+//                                username: TURN_SERVER_ADDRESS.id,
+//                                credential: TURN_SERVER_ADDRESS.pw
+//                            }
+//                        ]
+                    })
+                
+            document.getElementById('localVideo').srcObject = stream
+            stream.getTracks().forEach(function(track) {pc.addTrack(track, stream)})
+        
+            if (location.protocol !== 'https:') {
+
+                ws = new WebSocket("ws://" + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name)
+        
+            } else {
+        
+                ws = new WebSocket("wss://" + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name)
+        
+        
+            }
+
+            ws.onopen = function(evt){
+
+                ws.send(JSON.stringify({command: 'auth', data: roomInfo}))
+
+            }
+            
+            ws.onclose = function(evt) {
+                alert("Websocket has closed")
+            }
+        
+            ws.onmessage = function(evt) {
+                let msg = JSON.parse(evt.data)
+        
+                if (!msg) {
+                    return console.log('failed to parse msg')
+                }
+        
+        
+                switch (msg.command) {
+                    case 'offer':
+                    let offer = JSON.parse(atob(msg.data))
+                    if (!offer) {
+                        return console.log('failed to parse answer')
+                    }
+                    
+                    console.log("got offer")
+
+                    pc.setRemoteDescription(offer)
+                    pc.createAnswer().then(function(answer) {
+                        pc.setLocalDescription(answer)
+                        ws.send(JSON.stringify({command: 'answer', data: btoa(JSON.stringify(answer))}))
+                    })
+
+                    console.log("sent answer")
+
+                    return
+        
+                    case 'candidate':
+                    
+                    console.log("got candidate")
+
+                    let candidate = JSON.parse(atob(msg.data))
+                    if (!candidate) {
+                        return console.log('failed to parse candidate')
+                    }
+
+                    pc.addIceCandidate(candidate)
+
+                    console.log("added candidate")
+
+                    return
+
+                    case 'chat':
+                    
+                    let chatData = msg.data
+
+                    let chatMessage = JSON.parse(chatData) 
+
+                    document.getElementById("chat-reader").innerText += `<${chatMessage.user}> ${chatMessage.message} \n`
+
+                    return
+                }
+            }
+
+            ws.onerror = function(evt) {
+                console.log("ERROR: " + evt.data)
+            }
+
+            pc.ontrack = function (event) {
+                if (event.track.kind === 'audio') {
+                    return
+                }
+        
+                let el = document.createElement(event.track.kind)
+                el.srcObject = event.streams[0]
+                el.autoplay = true
+                el.controls = true
+                document.getElementById('remoteVideos').appendChild(el)
+        
+                event.track.onmute = function(event) {
+                    el.play()
+                }
+                
+                event.streams[0].onremovetrack = function({track}) {
+
+                    if (el.parentNode) {
+                        el.parentNode.removeChild(el)
+                    }
+                }
+            }
+        
+        
+            pc.onicecandidate = function(e){
+                
+                if (!e.candidate) {
+        
+                    console.log("not a candidate")
+        
+                    return
+                }
+        
+                ws.send(JSON.stringify({command: 'candidate', data: btoa(JSON.stringify(e.candidate))}))
+                console.log("sent ice candidate")
+
+
+            }
+                
+        
+        
+            console.log("opened peer connection ready")
+
+        })
+        .catch(function(e){
+
+            alert(e)
+        })
+
+
+
+}
+
+function sendChat(){
+
+    let chatConent = document.getElementById("chat-sender").value
+
+    document.getElementById("chat-sender").value = ""
+
+    let req = JSON.parse(JSON.stringify(MESSAGE_FORMAT))
+
+    req.command = "chat"
+    req.data = chatConent
+
+    ws.send(JSON.stringify(req))
+
+}
+
+
+async function init(){
+
+    let options = {
+        method: "GET"
+    }
+    let result = await fetch("/api/peers/signal/address", options)
+
+    let data = await result.json()
+
+    if(data.status != "success"){
+
+        alert("failed to get peers signal address")
+
+        return
+    }
+
+
+    PEERS_SIGNAL_ADDRESS = data.reply 
+
+    console.log("peersSignalAddr: " + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name)
+
+
+    console.log("opened channel for peer signal")
+
+}
+
+
+(async function (){
+
+    await initPeers()
+
+})()
\ No newline at end of file
diff --git a/0xetc/0xgo/webrtc/public/js/rtmp.js b/0xetc/0xgo/webrtc/public/js/rtmp.js
new file mode 100644 (file)
index 0000000..a9c2d45
--- /dev/null
@@ -0,0 +1,125 @@
+pc = {}
+
+ws = {}
+
+
+
+TURN_SERVER_ADDRESS = {}
+
+
+STREAMING_KEY = ""
+
+CLIENT_REQ = {
+    "data":""
+}
+
+SERVER_RE = {
+    "status": "",
+    "reply": ""
+}
+
+
+
+RTMP_STRUCT = {
+
+    "streaming_key":"",
+    "description": ""
+
+}
+
+
+
+async function initRTMP(){
+
+
+    pc = new RTCPeerConnection({
+//        iceServers: [
+//            {
+//                urls: TURN_SERVER_ADDRESS.addr,
+//                username: TURN_SERVER_ADDRESS.id,
+//                credential: TURN_SERVER_ADDRESS.pw
+//            }
+//        ]
+    })
+
+    pc.oniceconnectionstatechange = function(e) {console.log(pc.iceConnectionState)}
+
+    pc.onicecandidate = async function(event){
+
+        if (event.candidate === null){
+
+
+            let req = {
+                data: JSON.stringify(pc.localDescription)
+            }
+
+            let options = {
+                method: "POST",
+                headers: {
+                  "Content-Type": "application/json" 
+                },
+                body: JSON.stringify(req) 
+            }
+
+            let resp = await fetch("/api/rtmp/open", options)
+
+            let data = await resp.json()
+
+            if (data.status != "success") {
+
+                alert("failed to start cctv offer")
+            }
+            try {
+            
+                cs = JSON.parse(data.reply)
+
+                console.log(cs)
+
+                let remoteDesc = JSON.parse(cs.description)
+                
+                pc.setRemoteDescription(new RTCSessionDescription(remoteDesc))
+            
+                STREAMING_KEY = cs.streaming_key
+
+                alert("streaming address: " + cs.location)
+                
+            
+            } catch (e){
+
+                alert(e)
+            }
+
+        }
+
+
+    }
+
+    pc.ontrack = function (event) {
+
+        var el = document.createElement(event.track.kind)
+        el.srcObject = event.streams[0]
+        el.autoplay = true
+        el.controls = true
+
+        document.getElementById('cctv-reader').appendChild(el)
+
+    }
+
+    pc.addTransceiver('video')
+    pc.addTransceiver('audio')
+    
+    let offer = await pc.createOffer()
+
+    pc.setLocalDescription(offer)
+
+    console.log("init success")
+
+}
+
+
+
+
+
+
+
+
diff --git a/0xetc/0xgo/webrtc/setup.sh b/0xetc/0xgo/webrtc/setup.sh
new file mode 100755 (executable)
index 0000000..d825bc5
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+sudo apt update
+
+sudo apt install coturn -y
\ No newline at end of file
diff --git a/0xetc/0xgo/webrtc/turn.md b/0xetc/0xgo/webrtc/turn.md
new file mode 100644 (file)
index 0000000..2ca68d2
--- /dev/null
@@ -0,0 +1,25 @@
+sudo vim /etc/default/coturn
+
+TURNSERVER_ENABLED=1
+
+sudo systemctl start coturn
+
+sudo vim /etc/turnserver.conf
+
+listening-ip=0.0.0.0
+
+listening-port=3478
+
+external-ip=feebdaed.xyz/192.168.0.1 
+
+min-port=3479 max-port=3579
+
+verbose
+
+lt-cred-mech
+
+user=MYUSER:MYPASS
+
+realm=feebdaed.xyz
+
+sudo systemctl restart coturn
\ No newline at end of file
diff --git a/0xetc/0xgo/webrtc/view/index.html b/0xetc/0xgo/webrtc/view/index.html
new file mode 100644 (file)
index 0000000..4cc9b1b
--- /dev/null
@@ -0,0 +1,22 @@
+{{ define "index.html" }}
+<!DOCTYPE html>
+<html class="tui-bg-blue-black">
+  <head>
+
+    <meta charset="utf-8">
+    <title> index </title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+  </head>
+  <body>
+    
+    index
+
+    video chat: /room/:roomId/:userId
+
+    rtmp: /rtmp
+
+  </body>
+
+</html>
+{{ end }}
\ No newline at end of file
diff --git a/0xetc/0xgo/webrtc/view/room.html b/0xetc/0xgo/webrtc/view/room.html
new file mode 100644 (file)
index 0000000..eed0ac8
--- /dev/null
@@ -0,0 +1,61 @@
+{{ define "room.html" }}
+<!DOCTYPE html>
+<html class="tui-bg-blue-black">
+  <head>
+
+    <meta charset="utf-8">
+    <title> room </title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <script>
+
+      ROOM_INFO = JSON.parse("{{ .room_code }}")
+
+    </script>
+
+  </head>
+  <body>
+    <div class="container">
+      <div class="row">
+        <div class="col s12 m12 l12">
+          <div class="tui-window tui-scroll-white">
+            <fieldset class="tui-fieldset tui-border-double">
+              <legend>Video</legend>
+              <h3> Local Video </h3>
+              <fieldset class="tui-fieldset tui-border-dotted">
+                <video id="localVideo" width="160" height="120" autoplay muted></video> <br />
+              </fieldset>
+              <h3> Remote Video </h3>
+              <fieldset class="tui-fieldset tui-border-dotted">
+                <div id="remoteVideos"></div> <br>  
+              </fieldset>    
+            </fieldset>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="tui-overlap">
+      <div id="modal" class="tui-modal">
+          <div class="tui-window tui-scroll-white">
+            <fieldset class="tui-fieldset tui-border-double">
+              <legend class="red-255 yellow-255-text">Chat</legend>
+              <textarea class="tui-input purple-255" id="chat-sender"></textarea>
+              <br>
+              <input class="tui-button" type="button" value="send" onclick="sendChat()">
+              <p>Thread</p>
+              <fieldset class="tui-fieldset tui-border-dotted">
+                <pre id="chat-reader"></pre>
+              </fieldset>
+              <button class="tui-button tui-modal-close-button right" data-modal="modal">close</button>
+            </fieldset>
+          </div>
+      </div>
+    </div>
+
+
+
+  </body>
+
+  <script src="/public/js/room.js"></script>
+</html>
+{{ end }}
\ No newline at end of file
diff --git a/0xetc/0xgo/webrtc/view/rtmp.html b/0xetc/0xgo/webrtc/view/rtmp.html
new file mode 100644 (file)
index 0000000..5549b35
--- /dev/null
@@ -0,0 +1,32 @@
+{{ define "rtmp.html" }}
+<!doctype html>
+<html class="tui-bg-blue-black">
+  <head>
+    <title> rtmp </title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+  </head>
+
+  <body>
+
+    <div class="container">
+      <div class="row">
+        <div class="col s6 m6 l6"></div>
+          <div class="tui-window tui-scroll-white">
+            <fieldset class="tui-fieldset tui-border-double">
+              <legend>rtmp</legend>
+              <fieldset class="tui-fieldset tui-border-dotted">
+                <div id="cctv-reader"></div>
+              </fieldset>
+              <input class="tui-button" type="button" onclick="initRTMP()" value="start rtmp">
+
+            </fieldset>
+          </div>
+        </div>
+  </body>
+
+  <script src="/public/js/rtmp.js"></script>
+
+
+</html>
+{{ end }}
\ No newline at end of file
diff --git a/0xetc/0xgo/webrtc/webrtc/com.go b/0xetc/0xgo/webrtc/webrtc/com.go
new file mode 100644 (file)
index 0000000..5b7353a
--- /dev/null
@@ -0,0 +1,154 @@
+package webrtc
+
+import (
+       "encoding/json"
+       "fmt"
+       "log"
+       "net/http"
+       "sync"
+
+       "github.com/gin-gonic/gin"
+       "github.com/gorilla/websocket"
+)
+
+type CLIENT_REQ struct {
+       Data string `json:"data"`
+}
+
+type SERVER_RE struct {
+       Status string `json:"status"`
+       Reply  string `json:"reply"`
+}
+
+type RT_REQ_DATA struct {
+       Command string `json:"command"`
+       Data    string `json:"data"`
+}
+
+type RT_RESP_DATA struct {
+       Status string `json:"status"`
+       Data   string `json:"data"`
+}
+
+var CHANNEL_ADDR string = "0.0.0.0"
+
+var CHANNEL_PORT string
+
+var USER_CHANNEL = make(map[string]*websocket.Conn)
+
+var CH_CALLBACKS []func()
+
+var ListLock sync.RWMutex
+
+type ThreadSafeWriter struct {
+       *websocket.Conn
+       sync.Mutex
+}
+
+func GetRtmp(c *gin.Context) {
+
+       c.HTML(200, "rtmp.html", gin.H{})
+}
+
+func GetRoom(c *gin.Context) {
+
+       roomId := c.Param("roomId")
+
+       userId := c.Param("userId")
+
+       p_users, okay := ROOMREG[roomId]
+
+       if !okay {
+               fmt.Printf("view room: no such room\n")
+
+               c.JSON(http.StatusForbidden, SERVER_RE{Status: "error", Reply: "not allowed"})
+
+               return
+       }
+
+       pu_len := len(p_users)
+
+       allowed := 0
+
+       user_index := -1
+
+       for i := 0; i < pu_len; i++ {
+
+               if p_users[i].User == userId {
+
+                       allowed = 1
+
+                       user_index = i
+
+                       break
+               }
+
+       }
+
+       if allowed != 1 {
+
+               fmt.Printf("view room: user not allowed\n")
+
+               c.JSON(http.StatusForbidden, SERVER_RE{Status: "error", Reply: "not allowed"})
+
+               return
+
+       }
+
+       var pj PeersJoin
+
+       pj.RoomName = roomId
+       pj.User = p_users[user_index].User
+       pj.UserKey = p_users[user_index].UserKey
+
+       jb, err := json.Marshal(pj)
+
+       if err != nil {
+
+               fmt.Printf("view room: marshal\n")
+
+               c.JSON(http.StatusInternalServerError, SERVER_RE{Status: "error", Reply: "failed to get room"})
+
+               return
+
+       }
+
+       c.HTML(200, "room.html", gin.H{
+               "room_code": string(jb),
+       })
+
+}
+
+func (t *ThreadSafeWriter) WriteJSON(v interface{}) error {
+       t.Lock()
+       defer t.Unlock()
+
+       return t.Conn.WriteJSON(v)
+}
+
+func AddChannelHandler(channelPath string, channelHandler func(w http.ResponseWriter, r *http.Request)) {
+
+       http.HandleFunc(channelPath, channelHandler)
+
+}
+
+func AddChannelCallback(channelFunction func()) {
+
+       CH_CALLBACKS = append(CH_CALLBACKS, channelFunction)
+}
+
+func StartAllChannelHandlers() {
+
+       callback_count := len(CH_CALLBACKS)
+
+       for i := 0; i < callback_count; i++ {
+
+               go CH_CALLBACKS[i]()
+
+       }
+
+       channel_addr := CHANNEL_ADDR + ":" + CHANNEL_PORT
+
+       log.Fatal(http.ListenAndServe(channel_addr, nil))
+
+}
diff --git a/0xetc/0xgo/webrtc/webrtc/peers.go b/0xetc/0xgo/webrtc/webrtc/peers.go
new file mode 100644 (file)
index 0000000..62db91a
--- /dev/null
@@ -0,0 +1,521 @@
+package webrtc
+
+import (
+       "encoding/json"
+       "fmt"
+       "html"
+       "log"
+       "net/http"
+       "strings"
+       "sync"
+       "time"
+
+       "github.com/gin-gonic/gin"
+       "github.com/pion/rtcp"
+       "github.com/pion/webrtc/v4"
+)
+
+var URL string = "localhost"
+
+var PEERS_SIGNAL_PATH string
+
+var PEER_SIGNAL_ATTEMPT_SYNC int
+
+type PeersEntryStruct struct {
+       RoomName []string `json:"room_name"`
+}
+
+type PeersUserStruct struct {
+       UserKey string `json:"user_key"`
+       User    string `json:"user"`
+}
+
+type PeersCreate struct {
+       RoomName string   `json:"room_name"`
+       Users    []string `json:"users"`
+}
+
+type PeersJoin struct {
+       RoomName string `json:"room_name"`
+       User     string `json:"user"`
+       UserKey  string `json:"user_key"`
+}
+
+type ChatMessage struct {
+       User    string `json:"user"`
+       Message string `json:"message"`
+}
+
+var ROOMREG = make(map[string][]PeersUserStruct)
+
+func GetPeersSignalAddress(c *gin.Context) {
+
+       var s_addr string
+
+       s_addr = URL + ":" + CHANNEL_PORT + PEERS_SIGNAL_PATH
+
+       c.JSON(http.StatusOK, SERVER_RE{Status: "success", Reply: s_addr})
+
+}
+
+func CreatePeers(pc *PeersCreate) {
+
+       fmt.Println("create peers")
+
+       var p_create PeersCreate = *pc
+
+       ROOMREG[p_create.RoomName] = make([]PeersUserStruct, 0)
+
+       u_len := len(p_create.Users)
+
+       for i := 0; i < u_len; i++ {
+
+               ROOMREG[p_create.RoomName] = append(ROOMREG[p_create.RoomName], PeersUserStruct{
+                       UserKey: p_create.Users[i],
+                       User:    p_create.Users[i],
+               })
+
+       }
+
+       roomPeerConnections[p_create.RoomName] = []peerConnectionState{}
+
+       roomTrackLocals[p_create.RoomName] = nil
+
+       return
+
+}
+
+func roomJoinAuth(c *ThreadSafeWriter) (string, error) {
+
+       timeout_iter_count := 0
+
+       timeout_iter := TIMEOUT_SEC * 10
+
+       ticker := time.NewTicker(100 * time.Millisecond)
+
+       received_auth := make(chan RT_REQ_DATA)
+
+       got_auth := 0
+
+       var req RT_REQ_DATA
+
+       go func() {
+
+               auth_req := RT_REQ_DATA{}
+
+               err := c.ReadJSON(&auth_req)
+
+               if err != nil {
+
+                       log.Fatal("read auth:", err)
+                       return
+               }
+
+               received_auth <- auth_req
+
+       }()
+
+       for got_auth == 0 {
+
+               select {
+
+               case <-ticker.C:
+
+                       if timeout_iter_count <= timeout_iter {
+
+                               timeout_iter_count += 1
+
+                       } else {
+
+                               return "", fmt.Errorf("read auth: timed out")
+                       }
+
+               case a := <-received_auth:
+
+                       req = a
+
+                       got_auth = 1
+
+                       break
+               }
+
+       }
+
+       var pj PeersJoin
+
+       err := json.Unmarshal([]byte(req.Data), &pj)
+
+       if err != nil {
+
+               return "", fmt.Errorf("read auth: marshal: %s", err.Error())
+       }
+
+       p_users, okay := ROOMREG[pj.RoomName]
+
+       if !okay {
+
+               return "", fmt.Errorf("failed to get okay: %s", "no such room")
+       }
+
+       pu_len := len(p_users)
+
+       found := 0
+
+       for i := 0; i < pu_len; i++ {
+
+               if p_users[i].User == pj.User && p_users[i].UserKey == pj.UserKey {
+
+                       found = 1
+
+                       break
+
+               }
+
+       }
+
+       if found != 1 {
+
+               return "", fmt.Errorf("no matching user found")
+
+       }
+
+       return pj.User, nil
+}
+
+func RoomSignalHandler(w http.ResponseWriter, r *http.Request) {
+       // Upgrade HTTP request to Websocket
+
+       UPGRADER.CheckOrigin = func(r *http.Request) bool { return true }
+
+       unsafeConn, err := UPGRADER.Upgrade(w, r, nil)
+       if err != nil {
+               log.Printf("upgrade: %s\n", err.Error())
+               return
+       }
+
+       roomParam := strings.TrimPrefix(r.URL.Path, PEERS_SIGNAL_PATH)
+
+       log.Printf("room: %s\n", roomParam)
+
+       _, okay := roomPeerConnections[roomParam]
+
+       if !okay {
+
+               log.Printf("no such room: %s\n", roomParam)
+
+               return
+       }
+
+       c := &ThreadSafeWriter{unsafeConn, sync.Mutex{}}
+
+       // When this frame returns close the Websocket
+       defer c.Close() //nolint
+
+       thisUser, err := roomJoinAuth(c)
+
+       if err != nil {
+
+               log.Print("auth:", err)
+
+               return
+       }
+       log.Printf("auth success: user: %s, room: %s\n", thisUser, roomParam)
+
+       // Create new PeerConnection
+       peerConnection, err := api.NewPeerConnection(webrtc.Configuration{
+               ICEServers: []webrtc.ICEServer{
+                       {
+                               URLs:       []string{TURN_SERVER_ADDR[0].Addr},
+                               Username:   TURN_SERVER_ADDR[0].Id,
+                               Credential: TURN_SERVER_ADDR[0].Pw,
+                       },
+               },
+       })
+
+       if err != nil {
+               log.Print(err)
+               return
+       }
+
+       log.Print("new peerconnection added")
+
+       // When this frame returns close the PeerConnection
+       defer peerConnection.Close() //nolint
+
+       // Accept one audio and one video track incoming
+       for _, typ := range []webrtc.RTPCodecType{webrtc.RTPCodecTypeVideo, webrtc.RTPCodecTypeAudio} {
+               if _, err := peerConnection.AddTransceiverFromKind(typ, webrtc.RTPTransceiverInit{
+                       Direction: webrtc.RTPTransceiverDirectionRecvonly,
+               }); err != nil {
+                       log.Print(err)
+                       return
+               }
+       }
+
+       // Add our new PeerConnection to global list
+       ListLock.Lock()
+       roomPeerConnections[roomParam] = append(roomPeerConnections[roomParam], peerConnectionState{peerConnection, c})
+       ListLock.Unlock()
+
+       // Trickle ICE. Emit server candidate to client
+       peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) {
+
+               log.Printf("got ice candidate\n")
+
+               if i == nil {
+                       return
+               }
+
+               candidateStringEnc := Encode(i.ToJSON())
+
+               if writeErr := c.WriteJSON(&SIGNAL_INFO{
+                       Command: "candidate",
+                       Data:    candidateStringEnc,
+               }); writeErr != nil {
+                       log.Println(writeErr)
+               }
+
+               log.Printf("sent ice candidate\n")
+       })
+
+       // If PeerConnection is closed remove it from global list
+       peerConnection.OnConnectionStateChange(func(p webrtc.PeerConnectionState) {
+               switch p {
+               case webrtc.PeerConnectionStateFailed:
+                       log.Printf("on connection state change: %s \n", p.String())
+                       if err := peerConnection.Close(); err != nil {
+                               log.Print(err)
+                       }
+               case webrtc.PeerConnectionStateClosed:
+                       log.Printf("on connection state change: %s \n", p.String())
+                       signalPeerConnections(roomParam)
+               default:
+                       log.Printf("on connection state change: %s \n", p.String())
+               }
+       })
+
+       peerConnection.OnTrack(func(t *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
+               // Create a track to fan out our incoming video to all peers
+               trackLocal := addTrack(roomParam, t)
+               defer removeTrack(roomParam, trackLocal)
+
+               buf := make([]byte, 1500)
+               for {
+                       i, _, err := t.Read(buf)
+                       if err != nil {
+                               return
+                       }
+
+                       if _, err = trackLocal.Write(buf[:i]); err != nil {
+                               return
+                       }
+               }
+       })
+
+       // Signal for the new PeerConnection
+
+       signalPeerConnections(roomParam)
+
+       message := &SIGNAL_INFO{}
+       for {
+
+               _, raw, err := c.ReadMessage()
+               if err != nil {
+                       log.Println(err)
+                       return
+               } else if err := json.Unmarshal(raw, &message); err != nil {
+                       log.Println(err)
+                       return
+               }
+
+               log.Printf("got message: %s\n", message.Command)
+
+               switch message.Command {
+               case "candidate":
+
+                       log.Printf("got client ice candidate")
+
+                       candidate := webrtc.ICECandidateInit{}
+
+                       Decode(message.Data, &candidate)
+
+                       /*
+                               if err := json.Unmarshal([]byte(message.Data), &candidate); err != nil {
+                                       log.Println(err)
+                                       return
+                               }
+
+                       */
+                       if err := peerConnection.AddICECandidate(candidate); err != nil {
+                               log.Println(err)
+                               return
+                       }
+
+                       log.Printf("added client ice candidiate")
+
+               case "answer":
+                       answer := webrtc.SessionDescription{}
+
+                       Decode(message.Data, &answer)
+
+                       /*
+                               if err := json.Unmarshal([]byte(message.Data), &answer); err != nil {
+                                       log.Println(err)
+                                       return
+                               }
+                       */
+
+                       if err := peerConnection.SetRemoteDescription(answer); err != nil {
+                               log.Println(err)
+                               return
+                       }
+
+               case "chat":
+
+                       cm := ChatMessage{
+                               Message: html.EscapeString(message.Data),
+                               User:    thisUser,
+                       }
+
+                       jb, err := json.Marshal(cm)
+
+                       if err != nil {
+
+                               log.Println(err)
+
+                               return
+                       }
+
+                       message.Data = string(jb)
+
+                       broadcastPeerConnections(roomParam, message)
+
+               }
+       }
+}
+
+func dispatchKeyFrame(k string) {
+       ListLock.Lock()
+       defer ListLock.Unlock()
+
+       for i := range roomPeerConnections[k] {
+               for _, receiver := range roomPeerConnections[k][i].peerConnection.GetReceivers() {
+                       if receiver.Track() == nil {
+                               continue
+                       }
+
+                       _ = roomPeerConnections[k][i].peerConnection.WriteRTCP([]rtcp.Packet{
+                               &rtcp.PictureLossIndication{
+                                       MediaSSRC: uint32(receiver.Track().SSRC()),
+                               },
+                       })
+               }
+       }
+
+}
+
+func broadcastPeerConnections(roomName string, message *SIGNAL_INFO) {
+
+       for i := range roomPeerConnections[roomName] {
+
+               roomPeerConnections[roomName][i].websocket.WriteJSON(*message)
+
+       }
+
+}
+
+func signalPeerConnections(k string) {
+       ListLock.Lock()
+
+       defer func() {
+               ListLock.Unlock()
+               dispatchKeyFrame(k)
+       }()
+
+       for syncAttempt := 0; ; syncAttempt++ {
+               if syncAttempt == PEER_SIGNAL_ATTEMPT_SYNC {
+                       // We might be blocking a RemoveTrack or AddTrack
+                       go func() {
+                               time.Sleep(time.Second * 3)
+                               signalPeerConnections(k)
+                       }()
+                       return
+               }
+
+               if !attemptSync(k) {
+
+                       break
+               }
+       }
+}
+
+func attemptSync(k string) bool {
+
+       for i := range roomPeerConnections[k] {
+               if roomPeerConnections[k][i].peerConnection.ConnectionState() == webrtc.PeerConnectionStateClosed {
+                       roomPeerConnections[k] = append(roomPeerConnections[k][:i], roomPeerConnections[k][i+1:]...)
+                       return true // We modified the slice, start from the beginning
+               }
+
+               // map of sender we already are sending, so we don't double send
+               existingSenders := map[string]bool{}
+
+               for _, sender := range roomPeerConnections[k][i].peerConnection.GetSenders() {
+                       if sender.Track() == nil {
+                               continue
+                       }
+
+                       existingSenders[sender.Track().ID()] = true
+
+                       // If we have a RTPSender that doesn't map to a existing track remove and signal
+                       if _, ok := roomTrackLocals[k][sender.Track().ID()]; !ok {
+
+                               if err := roomPeerConnections[k][i].peerConnection.RemoveTrack(sender); err != nil {
+                                       return true
+                               }
+                       }
+               }
+
+               // Don't receive videos we are sending, make sure we don't have loopback
+
+               for _, receiver := range roomPeerConnections[k][i].peerConnection.GetReceivers() {
+                       if receiver.Track() == nil {
+                               continue
+                       }
+
+                       existingSenders[receiver.Track().ID()] = true
+
+               }
+
+               // Add all track we aren't sending yet to the PeerConnection
+               for trackID, t := range roomTrackLocals[k] {
+
+                       if _, ok := existingSenders[trackID]; !ok {
+
+                               if _, err := roomPeerConnections[k][i].peerConnection.AddTrack(t); err != nil {
+                                       return true
+                               }
+                       }
+               }
+
+               offer, err := roomPeerConnections[k][i].peerConnection.CreateOffer(nil)
+               if err != nil {
+                       return true
+               }
+
+               if err = roomPeerConnections[k][i].peerConnection.SetLocalDescription(offer); err != nil {
+                       return true
+               }
+
+               offerStringEnc := Encode(offer)
+
+               if err = roomPeerConnections[k][i].websocket.WriteJSON(&SIGNAL_INFO{
+                       Command: "offer",
+                       Data:    offerStringEnc,
+               }); err != nil {
+                       return true
+               }
+       }
+
+       return false
+}
diff --git a/0xetc/0xgo/webrtc/webrtc/rtmp.go b/0xetc/0xgo/webrtc/webrtc/rtmp.go
new file mode 100644 (file)
index 0000000..0261fa7
--- /dev/null
@@ -0,0 +1,313 @@
+package webrtc
+
+import (
+       "bytes"
+       "encoding/binary"
+       "encoding/json"
+       "fmt"
+       "io"
+       "log"
+       "net"
+       "time"
+
+       "github.com/gin-gonic/gin"
+       "github.com/pion/webrtc/v4"
+       "github.com/pion/webrtc/v4/pkg/media"
+       "github.com/pkg/errors"
+
+       flvtag "github.com/yutopp/go-flv/tag"
+       "github.com/yutopp/go-rtmp"
+       rtmpmsg "github.com/yutopp/go-rtmp/message"
+)
+
+var RTP_RECEIVE_ADDR string = "0.0.0.0"
+
+var RTP_RECEIVE_PORT string
+
+var RTP_CONSUMERS = make(map[string]RTMPWebRTCPeer)
+
+const RTP_HEADER_LENGTH_FIELD = 4
+
+var TEST_KEY string = "foobar"
+
+var UDP_BUFFER_BYTE_SIZE int = 65536
+
+var RECV_STARTED int = 0
+
+type RTMPHandler struct {
+       rtmp.DefaultHandler
+       PublisherKey string
+}
+
+type RTMPWebRTCPeer struct {
+       peerConnection *webrtc.PeerConnection
+       videoTrack     *webrtc.TrackLocalStaticSample
+       audioTrack     *webrtc.TrackLocalStaticSample
+}
+
+type CCTVStruct struct {
+       Location     string `json:"location"`
+       StreamingKey string `json:"streaming_key"`
+       Description  string `json:"description"`
+}
+
+func RtmpOpen(c *gin.Context) {
+
+       log.Println("incoming rtmp open request")
+
+       peerConnection, err := api.NewPeerConnection(webrtc.Configuration{
+               ICEServers: []webrtc.ICEServer{
+                       {
+                               URLs:       []string{TURN_SERVER_ADDR[0].Addr},
+                               Username:   TURN_SERVER_ADDR[0].Id,
+                               Credential: TURN_SERVER_ADDR[0].Pw,
+                       },
+               },
+       })
+       if err != nil {
+               panic(err)
+       }
+       /*
+               peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
+                       fmt.Printf("Connection State has changed %s \n", connectionState.String())
+
+                       if connectionState == webrtc.ICEConnectionStateFailed {
+                               if closeErr := peerConnection.Close(); closeErr != nil {
+                                       panic(closeErr)
+                               }
+                       }
+               })
+       */
+       videoTrack, err := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH264}, "video", "pion")
+       if err != nil {
+               panic(err)
+       }
+       if _, err = peerConnection.AddTrack(videoTrack); err != nil {
+               panic(err)
+       }
+
+       audioTrack, err := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypePCMA}, "audio", "pion")
+       if err != nil {
+               panic(err)
+       }
+       if _, err = peerConnection.AddTrack(audioTrack); err != nil {
+               panic(err)
+       }
+
+       var req CLIENT_REQ
+
+       var offer webrtc.SessionDescription
+
+       if err := c.BindJSON(&req); err != nil {
+
+               panic(err)
+
+       }
+
+       err = json.Unmarshal([]byte(req.Data), &offer)
+
+       if err != nil {
+
+               panic(err)
+       }
+
+       if err := peerConnection.SetRemoteDescription(offer); err != nil {
+               panic(err)
+       }
+
+       gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
+       answer, err := peerConnection.CreateAnswer(nil)
+       if err != nil {
+               panic(err)
+       } else if err = peerConnection.SetLocalDescription(answer); err != nil {
+               panic(err)
+       }
+       <-gatherComplete
+
+       streamingKey, err := GetRandomHex(32)
+
+       if err != nil {
+
+               panic(err)
+       }
+
+       log.Printf("rtmp key: %s\n", streamingKey)
+
+       RTP_CONSUMERS[streamingKey] = RTMPWebRTCPeer{
+               peerConnection: peerConnection,
+               videoTrack:     videoTrack,
+               audioTrack:     audioTrack,
+       }
+
+       desc_b, err := json.Marshal(peerConnection.LocalDescription())
+
+       if err != nil {
+               panic(err)
+       }
+
+       var resp SERVER_RE
+
+       var cs CCTVStruct
+
+       cs.Location = "rtmp://" + URL + ":" + string(RTP_RECEIVE_PORT) + "/publish/" + streamingKey
+
+       cs.StreamingKey = streamingKey
+
+       cs.Description = string(desc_b)
+
+       cs_b, err := json.Marshal(cs)
+
+       if err != nil {
+
+               panic(err)
+
+       }
+
+       resp.Status = "success"
+       resp.Reply = string(cs_b)
+
+       c.JSON(200, resp)
+
+}
+
+func InitRTMPServer() {
+       log.Println("starting RTMP Server")
+
+       tcpAddr, err := net.ResolveTCPAddr("tcp", RTP_RECEIVE_ADDR+":"+RTP_RECEIVE_PORT)
+       if err != nil {
+               log.Panicf("Failed: %+v", err)
+       }
+
+       listener, err := net.ListenTCP("tcp", tcpAddr)
+       if err != nil {
+               log.Panicf("Failed: %+v", err)
+       }
+
+       srv := rtmp.NewServer(&rtmp.ServerConfig{
+               OnConnect: func(conn net.Conn) (io.ReadWriteCloser, *rtmp.ConnConfig) {
+                       return conn, &rtmp.ConnConfig{
+                               Handler: &RTMPHandler{},
+
+                               ControlState: rtmp.StreamControlStateConfig{
+                                       DefaultBandwidthWindowSize: 6 * 1024 * 1024 / 8,
+                               },
+                       }
+               },
+       })
+       if err := srv.Serve(listener); err != nil {
+               log.Panicf("Failed: %+v", err)
+       }
+}
+
+func (h *RTMPHandler) OnServe(conn *rtmp.Conn) {
+}
+
+func (h *RTMPHandler) OnConnect(timestamp uint32, cmd *rtmpmsg.NetConnectionConnect) error {
+       log.Printf("OnConnect: %#v", cmd)
+       return nil
+}
+
+func (h *RTMPHandler) OnCreateStream(timestamp uint32, cmd *rtmpmsg.NetConnectionCreateStream) error {
+       log.Printf("OnCreateStream: %#v", cmd)
+       return nil
+}
+
+func (h *RTMPHandler) OnPublish(ctx *rtmp.StreamContext, timestamp uint32, cmd *rtmpmsg.NetStreamPublish) error {
+       log.Printf("OnPublish: %#v", cmd)
+
+       if cmd.PublishingName == "" {
+
+               log.Printf("publishing name is empty")
+
+               return errors.New("publishing name is empty")
+       }
+
+       _, okay := RTP_CONSUMERS[cmd.PublishingName]
+
+       if !okay {
+
+               log.Printf("publishing name doesn't exist")
+
+               return errors.New("publishing name doesn't exist")
+
+       }
+
+       h.PublisherKey = cmd.PublishingName
+
+       return nil
+}
+
+func (h *RTMPHandler) OnAudio(timestamp uint32, payload io.Reader) error {
+       var audio flvtag.AudioData
+
+       consumer, okay := RTP_CONSUMERS[h.PublisherKey]
+
+       if !okay {
+
+               return fmt.Errorf("invalid publisher")
+
+       }
+
+       consumerAudioTrack := consumer.audioTrack
+
+       if err := flvtag.DecodeAudioData(payload, &audio); err != nil {
+               return err
+       }
+
+       data := new(bytes.Buffer)
+       if _, err := io.Copy(data, audio.Data); err != nil {
+               return err
+       }
+
+       return consumerAudioTrack.WriteSample(media.Sample{
+               Data:     data.Bytes(),
+               Duration: 128 * time.Millisecond,
+       })
+}
+
+func (h *RTMPHandler) OnVideo(timestamp uint32, payload io.Reader) error {
+       var video flvtag.VideoData
+
+       consumer, okay := RTP_CONSUMERS[h.PublisherKey]
+
+       if !okay {
+
+               return fmt.Errorf("invalid publisher")
+
+       }
+
+       consumerVideoTrack := consumer.videoTrack
+
+       if err := flvtag.DecodeVideoData(payload, &video); err != nil {
+               return err
+       }
+
+       data := new(bytes.Buffer)
+       if _, err := io.Copy(data, video.Data); err != nil {
+               return err
+       }
+
+       outBuf := []byte{}
+       videoBuffer := data.Bytes()
+       for offset := 0; offset < len(videoBuffer); {
+               bufferLength := int(binary.BigEndian.Uint32(videoBuffer[offset : offset+RTP_HEADER_LENGTH_FIELD]))
+               if offset+bufferLength >= len(videoBuffer) {
+                       break
+               }
+
+               offset += RTP_HEADER_LENGTH_FIELD
+               outBuf = append(outBuf, []byte{0x00, 0x00, 0x00, 0x01}...)
+               outBuf = append(outBuf, videoBuffer[offset:offset+bufferLength]...)
+
+               offset += int(bufferLength)
+       }
+
+       return consumerVideoTrack.WriteSample(media.Sample{
+               Data:     outBuf,
+               Duration: time.Second / 30,
+       })
+}
+
+func (h *RTMPHandler) OnClose() {
+       log.Printf("OnClose")
+}
diff --git a/0xetc/0xgo/webrtc/webrtc/stream.go b/0xetc/0xgo/webrtc/webrtc/stream.go
new file mode 100644 (file)
index 0000000..acf5c33
--- /dev/null
@@ -0,0 +1,129 @@
+package webrtc
+
+import (
+       "log"
+       "strings"
+       "time"
+
+       "github.com/gorilla/websocket"
+       "github.com/pion/ice/v3"
+       "github.com/pion/webrtc/v4"
+)
+
+var DEBUG bool = false
+
+var RTCP_PLI_INTERVAL time.Duration
+
+var UDP_MUX_PORT int
+
+var UDP_EPHEMERAL_PORT_MIN int
+
+var UDP_EPHEMERAL_PORT_MAX int
+
+var TIMEOUT_SEC int = 30
+
+var TURN_SERVER_ADDR []struct {
+       Addr string `json:"addr"`
+       Id   string `json:"id"`
+       Pw   string `json:"pw"`
+}
+
+var api *webrtc.API
+
+type SIGNAL_INFO struct {
+       Command string `json:"command"`
+       Status  string `json:"status"`
+       Data    string `json:"data"`
+}
+
+var UPGRADER = websocket.Upgrader{}
+
+var roomPeerConnections = make(map[string][]peerConnectionState)
+
+var roomTrackLocals = make(map[string]map[string]*webrtc.TrackLocalStaticRTP)
+
+type peerConnectionState struct {
+       peerConnection *webrtc.PeerConnection
+       websocket      *ThreadSafeWriter
+}
+
+func InitWebRTCApi() {
+
+       settingEngine := webrtc.SettingEngine{}
+
+       var filterFunc func(string) bool = func(ifname string) bool {
+
+               if strings.HasPrefix(ifname, "br-") {
+
+                       return false
+               } else if strings.HasPrefix(ifname, "vir") {
+
+                       return false
+               } else if strings.HasPrefix(ifname, "docker") {
+
+                       return false
+               }
+
+               return true
+
+       }
+
+       ifaceFilter := ice.UDPMuxFromPortWithInterfaceFilter(filterFunc)
+       mux, err := ice.NewMultiUDPMuxFromPort(UDP_MUX_PORT, ifaceFilter)
+
+       log.Println("creating webrtc api")
+
+       settingEngine.SetICEUDPMux(mux)
+       if err != nil {
+               panic(err)
+       }
+
+       log.Println("created webrtc api")
+
+       settingEngine.SetEphemeralUDPPortRange(uint16(UDP_EPHEMERAL_PORT_MIN), uint16(UDP_EPHEMERAL_PORT_MAX))
+
+       api = webrtc.NewAPI(webrtc.WithSettingEngine(settingEngine))
+
+}
+
+func SignalDispatcher() {
+
+       for range time.NewTicker(time.Second * RTCP_PLI_INTERVAL).C {
+
+               for k, _ := range roomPeerConnections {
+
+                       dispatchKeyFrame(k)
+               }
+
+       }
+}
+
+func addTrack(k string, t *webrtc.TrackRemote) *webrtc.TrackLocalStaticRTP {
+       ListLock.Lock()
+       defer func() {
+               ListLock.Unlock()
+               signalPeerConnections(k)
+       }()
+
+       trackLocal, err := webrtc.NewTrackLocalStaticRTP(t.Codec().RTPCodecCapability, t.ID(), t.StreamID())
+       if err != nil {
+               panic(err)
+       }
+
+       if roomTrackLocals[k] == nil {
+               roomTrackLocals[k] = make(map[string]*webrtc.TrackLocalStaticRTP)
+       }
+
+       roomTrackLocals[k][t.ID()] = trackLocal
+       return trackLocal
+}
+
+func removeTrack(k string, t *webrtc.TrackLocalStaticRTP) {
+       ListLock.Lock()
+       defer func() {
+               ListLock.Unlock()
+               signalPeerConnections(k)
+       }()
+
+       delete(roomTrackLocals, k)
+}
diff --git a/0xetc/0xgo/webrtc/webrtc/utils.go b/0xetc/0xgo/webrtc/webrtc/utils.go
new file mode 100644 (file)
index 0000000..8f469a5
--- /dev/null
@@ -0,0 +1,87 @@
+package webrtc
+
+import (
+       "bytes"
+       "compress/gzip"
+       "crypto/rand"
+       "encoding/base64"
+       "encoding/hex"
+       "encoding/json"
+       "io"
+)
+
+var USE_COMPRESS bool = false
+
+func GetRandomHex(n int) (string, error) {
+       bytes := make([]byte, n)
+       if _, err := rand.Read(bytes); err != nil {
+               return "", err
+       }
+       return hex.EncodeToString(bytes), nil
+}
+
+func Encode(obj interface{}) string {
+       b, err := json.Marshal(obj)
+       if err != nil {
+               panic(err)
+       }
+
+       if USE_COMPRESS {
+               b = Zip(b)
+       }
+
+       return base64.StdEncoding.EncodeToString(b)
+}
+
+// Decode decodes the input from base64
+// It can optionally unzip the input after decoding
+func Decode(in string, obj interface{}) {
+       b, err := base64.StdEncoding.DecodeString(in)
+       if err != nil {
+               panic(err)
+       }
+
+       if USE_COMPRESS {
+               b = Unzip(b)
+       }
+
+       err = json.Unmarshal(b, obj)
+       if err != nil {
+               panic(err)
+       }
+}
+
+func Zip(in []byte) []byte {
+       var b bytes.Buffer
+       gz := gzip.NewWriter(&b)
+       _, err := gz.Write(in)
+       if err != nil {
+               panic(err)
+       }
+       err = gz.Flush()
+       if err != nil {
+               panic(err)
+       }
+       err = gz.Close()
+       if err != nil {
+               panic(err)
+       }
+       return b.Bytes()
+}
+
+func Unzip(in []byte) []byte {
+       var b bytes.Buffer
+       _, err := b.Write(in)
+       if err != nil {
+               panic(err)
+       }
+       r, err := gzip.NewReader(&b)
+       if err != nil {
+               panic(err)
+       }
+       res, err := io.ReadAll(r)
+       if err != nil {
+               panic(err)
+       }
+       return res
+}
diff --git a/0xetc/0xgo/websocket/Makefile b/0xetc/0xgo/websocket/Makefile
new file mode 100644 (file)
index 0000000..804008c
--- /dev/null
@@ -0,0 +1,9 @@
+all:
+
+       go build -o client/client.out ./client
+
+       go build -o server/server.out ./server
+
+
+
+
diff --git a/0xetc/0xgo/websocket/certgen.sh b/0xetc/0xgo/websocket/certgen.sh
new file mode 100755 (executable)
index 0000000..bdb69b5
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+rm -r ./client/certs/*
+
+rm -r ./server/certs/*
+
+
+mkdir -p ./client/certs
+
+mkdir -p ./server/certs
+
+echo "root generating...."
+
+openssl genrsa -out ./client/certs/ca_priv.pem 4096
+
+openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
+
+openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
+
+echo "server key pair, csr generating...."
+
+openssl genrsa -out ./server/certs/server.key 4096
+
+openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
+
+openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
+
+echo "signing requests for server...."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
+
+
+echo "done!"
\ No newline at end of file
diff --git a/0xetc/0xgo/websocket/client/certs/ca.pem b/0xetc/0xgo/websocket/client/certs/ca.pem
new file mode 100644 (file)
index 0000000..0f067d6
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/zCCAuegAwIBAgIUFAZ/NqdKQOVulUfJJk7XN13AzzYwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODE3MDRaFw0zNDEwMzEwODE3
+MDRaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCVq7U00wHqr7bic/De8n6w/QWKZ8wPSVK0QXokpWGr3FVgWU4D6cDQGEZR
+A2qABWKG492a4yBM90NYKvVU6Ilfm0TxoBPqYzfdH0Txt15N/SnnV0DhGkJvDeqU
+pfvnZ2+5/iMpLn1ptU03h5Fz4iDTRzKV+xTkWF3vEMOasMfevseSaIJJNaMf97rv
+GsqBpRKF6eNqhewtz+gPf4J+2Y0019XCkEoWgIyFs2W3OZOmzNJI1XXXYZU3dsCS
+YDK0V0KpNYdlHtPCHQ1gtrbYiIhP8kIYhgbhyGXUSpQoDghUotE0SHK15MBI+oBu
+OkQB3+uGbtXw+HW6ReyI6Ks7ICrsQW+eiK/V9pOP6TaNnajRSg7sOBfdJCWOoBNv
+6OdfYKgMORjfu8FpPaEca9L+38e0texXCNZt9lWyfHmuRFHF0MnbqDS409AMzhUl
+upXbaFpdz6g7F4twAyFdB3pjSsO28toTqKIamXhl1+8D7byC9/sATEEm9/tO44GC
++01Z63R3mazn+9fAjReMEQMw5HtXYHho24zR433VpbTXJ14YMWeJa1VZAw5CRVKi
+g5vxjUILIMu5DAi8KZdBjqKNgzT6v/KfjPMPenrHZYMqfXrttkmsU3kAUurOtVE8
+ppEN8fLY3LDONqwrG5hHZWTzeggFHtXSbK0dlhYZsBsPuCltSwIDAQABo1MwUTAd
+BgNVHQ4EFgQUWryFapRsKtm4PFy0xy7IciUzQGMwHwYDVR0jBBgwFoAUWryFapRs
+Ktm4PFy0xy7IciUzQGMwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
+AgEAU+dGb3c4G9XDPui89cvrGqJDSytoy6VENvEiF4Vl1KLwbq/nhaDXD5Gh1irr
+YmhZJwmV/6wx8hOA9A2ZipETucIGrJ/Zw82WBvJ76T7sXfDd16Pg1XUQVzl28W4/
+8T+BcVNVjSYIh6idQyoxCZ+AC+/ivVaOVwI4vJJh8J1Nlz2EbEw+A5qhkUlfwKOl
+beC9WTY2N3Csu/COn8qacPTjrsnCYpN7YkZ+iav0jZit7Mb73XD8FTI86aUt99VU
+/jLQ7oHQasX/WcBTTm7e8dsBM/C6PUVj4CbXSkGlXrJeqr09cBrR0Pq3vOVOBXII
+9xlczTrbjZlG4/8KULMS4jGE0Ruqer8ULjr/g+b2RRTM3FR0ixuwyiwGN1SjAjNX
+2p3FfP3IIo4VzYavfTvxKrOS4FDX+AFEruXLlt6Ufygg8woXyRPGsmRNtTNGElGl
+0qSP73zwZX6Uix88ohCMrYPYMb/tk1Buiw8cGiNPZeSP/3Q4sg3yC7yQm8aPIS+U
+J0Wwgm+bFMpsAO5B9DDeFRx2P2ygULSl1gMZnfHblhJSu563odrTVeOqeyF1kjSp
+evXyeTXX+SMKV2UUl2z15bk+T+8f6TMt2bYyvMhF1uK8kxWIfWMlg+2c4vAJRJhM
+gQ4YdEf2xD90PoEkoI6JNZFzEbViprDo68qYFnXHwK4haNE=
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/websocket/client/certs/ca_priv.pem b/0xetc/0xgo/websocket/client/certs/ca_priv.pem
new file mode 100644 (file)
index 0000000..bf7e8e4
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+g9mNZa3rFeivom6DV1fJp7UHkKlA4g==
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/websocket/client/certs/ca_pub.pem b/0xetc/0xgo/websocket/client/certs/ca_pub.pem
new file mode 100644 (file)
index 0000000..70f3dcd
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlau1NNMB6q+24nPw3vJ+
+sP0FimfMD0lStEF6JKVhq9xVYFlOA+nA0BhGUQNqgAVihuPdmuMgTPdDWCr1VOiJ
+X5tE8aAT6mM33R9E8bdeTf0p51dA4RpCbw3qlKX752dvuf4jKS59abVNN4eRc+Ig
+00cylfsU5Fhd7xDDmrDH3r7HkmiCSTWjH/e67xrKgaUShenjaoXsLc/oD3+CftmN
+NNfVwpBKFoCMhbNltzmTpszSSNV112GVN3bAkmAytFdCqTWHZR7Twh0NYLa22IiI
+T/JCGIYG4chl1EqUKA4IVKLRNEhyteTASPqAbjpEAd/rhm7V8Ph1ukXsiOirOyAq
+7EFvnoiv1faTj+k2jZ2o0UoO7DgX3SQljqATb+jnX2CoDDkY37vBaT2hHGvS/t/H
+tLXsVwjWbfZVsnx5rkRRxdDJ26g0uNPQDM4VJbqV22haXc+oOxeLcAMhXQd6Y0rD
+tvLaE6iiGpl4ZdfvA+28gvf7AExBJvf7TuOBgvtNWet0d5ms5/vXwI0XjBEDMOR7
+V2B4aNuM0eN91aW01ydeGDFniWtVWQMOQkVSooOb8Y1CCyDLuQwIvCmXQY6ijYM0
++r/yn4zzD3p6x2WDKn167bZJrFN5AFLqzrVRPKaRDfHy2NywzjasKxuYR2Vk83oI
+BR7V0mytHZYWGbAbD7gpbUsCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/websocket/client/main.go b/0xetc/0xgo/websocket/client/main.go
new file mode 100644 (file)
index 0000000..6d4496f
--- /dev/null
@@ -0,0 +1,79 @@
+package main
+
+import (
+       "crypto/tls"
+       "crypto/x509"
+       "fmt"
+       "log"
+       "os"
+
+       "github.com/gorilla/websocket"
+)
+
+type CommJSON struct {
+       Data string `json:"data"`
+}
+
+func run() error {
+
+       certpool := x509.NewCertPool()
+
+       file_ca, err := os.ReadFile("certs/ca.pem")
+
+       if err != nil {
+
+               return fmt.Errorf("failed to connect: read ca: %s", err.Error())
+       }
+
+       okay := certpool.AppendCertsFromPEM(file_ca)
+
+       if !okay {
+
+               return fmt.Errorf("failed to connect: add ca")
+       }
+
+       websocket.DefaultDialer.TLSClientConfig = &tls.Config{
+               RootCAs: certpool,
+       }
+
+       c, _, err := websocket.DefaultDialer.Dial("wss://localhost:8888/hello", nil)
+
+       if err != nil {
+
+               return fmt.Errorf("failed to connect: dial: %s", err.Error())
+       }
+
+       req := CommJSON{
+               Data: "hi",
+       }
+
+       resp := CommJSON{}
+
+       err = c.WriteJSON(req)
+
+       if err != nil {
+
+               return fmt.Errorf("failed to write: %s", err.Error())
+
+       }
+
+       err = c.ReadJSON(&resp)
+
+       if err != nil {
+
+               return fmt.Errorf("failed to read: %s", err.Error())
+       }
+
+       log.Printf("server data: %s\n", resp.Data)
+
+       return nil
+}
+
+func main() {
+
+       if err := run(); err != nil {
+
+               log.Fatal(err.Error())
+       }
+
+}
diff --git a/0xetc/0xgo/websocket/server/certs/server.csr b/0xetc/0xgo/websocket/server/certs/server.csr
new file mode 100644 (file)
index 0000000..1c45ad2
--- /dev/null
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAt6ebQc1m2xodW+7YsSxrL5Wu2nk7bqI+mIfEL+D0
+6RUdEObrhBTZuatweBCM+NN2I6GpNuc9oIJcjksbAmDQfZm41DHQjLVEfvR/zd+i
+0ox5aZhK6wRqE5LKKprKoh69py9M0sWsBIUiSQvgD6rkznVQhiA4m4mz3s4e+Qbd
+LJThY8xGbF4NLmlcpUK9AVh9thMPuGYVGun/ihVN3wfQgiVWMsx+ZAaPARMBdu+I
+bLQLQbriZqMZz6EDS3BBJRbXedjyWtzc8nus4VXfe+X82hrxW11Qme3B/4I9o7re
+RF3i+DLvnZZkoK6IFgcV0SHg+7lCSQrNCVRac8N/qoR/lih5wULOh/g4cVrKVOrG
+JJa9r5u6YtpyGOY5m49J48xCpbq1Wmbc0VW9Y0PcZkJOrUd4c1wUDaiu9ZXpGUdl
+Den7HDl1h7SUKw5GJbyAk8ANR9kxwS3GrrZkpL6iGAKeA3dmH1AeG+jfT/BIBAOn
+14bKwZIVrHKQkKP8hcZeKPflJ7qFh75ZyfSMnuaItQG/vKhBIKkuiUl4RcHD5MEt
+BTH2OyzbWSbvxzLgvDdfdwZ4VVVSaW9iXnAb0SLCjXPURujtYsN5N5EUvrnQCAV9
+Yz2wFboBQimXLhebBjsZS+5dQChncN+kaGRcIuPKuIGUS7jRieTuBT+7HPqt1H6V
+Gh8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQANCCvGhAnI6lmBjKV0iE7G+rKV
+KHB7nG4p4TRQcmy6o1/wVyGMBRHvowtvvcmX0wsfPX92g7exJr7sD+OvesDcG6Zi
+/Ve/W3B3HKCiCXAQdfjHlunleqs8UtXlDg595OsnRdXM/lIG846oRvDtNEXSbga4
+vNyEcvsz96mzpekO+PYM9/txvMm4EA8XEdOw/Vfrfinw2Z2JHlbt/iyylbK9tDbj
+SGV5iK/8alSdUhGe5HFJKy2mv1VpOiTtpAF9jNp0ZZ2Dlz6PKdhVndZOiYHexMRT
+PTplq1khuokySRUxlXwhWva2rRFMWHtG/K9PLansvN1vT0i+fkp46kpyHEkzhljS
+zF7Epb+5iffjwqyLLfU3w6yVnuan4KLUmllS4WNoHirBPNSMgvgJ+1YN4zsyI0UR
+DENWQCMkxrQs8YiraavY5ATP2gQM/GbODa4ExX0ZT83IoffeqlXdS0Yjh84AeZ9m
+yv32VMLTm+gOa2CjOSDTvUSdcFvTMU2bmoxSnJnj+8r/dnL+uB6mciAO54jc3B9I
+0LBO0YYFYvIfmOU+aYYHriG9pf3B4GAwF6sbOQxhYGK2iaaBhf2y2RbOlENxcOza
+y+NHUc/H0gLJd8RJ+0WxedqxuCvz2cZ2myEl3+wSGyrR4XEDkJohIwH9j5ogf8a2
+NYzZl+hZcN1MeEe1mQ==
+-----END CERTIFICATE REQUEST-----
diff --git a/0xetc/0xgo/websocket/server/certs/server.key b/0xetc/0xgo/websocket/server/certs/server.key
new file mode 100644 (file)
index 0000000..22f4510
--- /dev/null
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQC3p5tBzWbbGh1b
+7tixLGsvla7aeTtuoj6Yh8Qv4PTpFR0Q5uuEFNm5q3B4EIz403Yjoak25z2gglyO
+SxsCYNB9mbjUMdCMtUR+9H/N36LSjHlpmErrBGoTksoqmsqiHr2nL0zSxawEhSJJ
+C+APquTOdVCGIDibibPezh75Bt0slOFjzEZsXg0uaVylQr0BWH22Ew+4ZhUa6f+K
+FU3fB9CCJVYyzH5kBo8BEwF274hstAtBuuJmoxnPoQNLcEElFtd52PJa3Nzye6zh
+Vd975fzaGvFbXVCZ7cH/gj2jut5EXeL4Mu+dlmSgrogWBxXRIeD7uUJJCs0JVFpz
+w3+qhH+WKHnBQs6H+DhxWspU6sYklr2vm7pi2nIY5jmbj0njzEKlurVaZtzRVb1j
+Q9xmQk6tR3hzXBQNqK71lekZR2UN6fscOXWHtJQrDkYlvICTwA1H2THBLcautmSk
+vqIYAp4Dd2YfUB4b6N9P8EgEA6fXhsrBkhWscpCQo/yFxl4o9+UnuoWHvlnJ9Iye
+5oi1Ab+8qEEgqS6JSXhFwcPkwS0FMfY7LNtZJu/HMuC8N193BnhVVVJpb2JecBvR
+IsKNc9RG6O1iw3k3kRS+udAIBX1jPbAVugFCKZcuF5sGOxlL7l1AKGdw36RoZFwi
+48q4gZRLuNGJ5O4FP7sc+q3UfpUaHwIDAQABAoICAD5iitTBZy0KI+r0qVsV0Zsq
+Z2kDQXMFXeoGRFhXPBpo96SkLGCDjKoLWHsQdDKZ8kmMQqTJzB9X6QTU8mnOZUQl
+EanS+hqyAIB3oWpXi0GmQh/igaBvsXDQrifmyOplMts1sAzw5MvsRYc2p3fq/yo6
+o43MKC59ikInFlJVSJA6So3R+CIbmLKpS7U/hGCOpLVSqEZlNsobrphDQF6Akw2C
+jVNYL57es3kT8a1rFJaIWkKLrxhaUww6j5nymc51geB8F2dSGyOra0BoITA/IbMc
+79uvSQ/gucOHhFS3x4TFt7HD661GRwxl/Qgug/S0Y25eseuJ5bhDlS45vIY51/Sg
+EgpcxG5OfssWTBAsVeH4f3ksll/wrEwNURe8RWcH63/K2NANDZEzTrkKk8/kO1WT
+z+flp+9xZayVf+9BAxBAhC03G/bll1yiV4RKMcktYi+t2o2rsNPZBOalGMlfqAD3
+Og5H/SiUgQSMPhAnROJ7Qdxl69COrG8Bcl7VX0G/zNaygfXQNeStHbxfkE/tygsU
+1ZYlLSWd4aSxEAd3U0ymHAeMueAXd9Yg2Yt83h8wgFsvoouyIFuZgx3YGY9YkeDw
+bXHm0JZ9C7JzeE0mJxh+w44XWOA8koFrIpl1b2go3D/2mVKFNRWFT5qJDT7M9Dj/
+3KRYK24vBmqbcrOow6zRAoIBAQDG18UV3I6611mdCEC7eSViphBlV/KNpKF+U0Jj
+TMKzH1AyVH28ec8erq+QJr/KDpnxTeoGvQIVWQbHOju4Mm3u7wFeyh4As3/p3fiy
+HRvlHl42x4kfu6ejAqntAAhjEMwz0MV1Zb1jSlgOEylR+Hk9RUdxHbqYVGbzmVoz
+F7zQO/sGw35kSKCaXDkHSNy2JkwDYU1g7WMLpMew4QeyA6o+EbB7t214E5FyHACK
+v7WrsaysCTGiKSJCQbjIuF2DCCAIsA6NYg2Q3SgIBWINSB02hKV0Y6zF5NmoMY1y
+0W0AouwZ1FGqDphQGF+SKtbaTaNxTMpv+OhMZ8hdi/d1aKabAoIBAQDscjBCNcMF
+V2o/nopNXA6/Dr+GbPdQaSMenMNRmg7v2VmlQgiAvYGSkhccadc6DB+U75gC+65k
+VhIwZi40lCX/6wkhWruhLTS/ZPLnIWZW80UrWOgEH/Y+CXYL8Q59wCDNkIzF9Wyx
+Zjj6lATV61RCENqchAxRiqN4Hc1xrDm00ice+JAlYU1hPrWGa4aIhgq/xngm7/RS
+fNOFgUX8wPDdqwaOEt59QKaICLycziqRLGjFR1b697bs5R50llk41rbGrvZfgXkB
+jId0srMM+SWrlncdfpX+ZrWzjq1Vk1uOZJorrSqt/ReZ2husPhGyGMCQrpST5Lvd
+/6o9cSx0+hDNAoIBACrnkdoWviFoqChvCHCrQjrX9D+5y1dux33Xf0Kn5Hb78bT6
+cCsD6YIIVU94XPe/UM41bqLHk7SBgino0cv77aaZoaUPXYvvL1GKGMht6X/1noSZ
+Z2gWeKR+xaWi1SxzCmy/xmt/aW8MMpXO4qKSR67FzRWGQaXuyEwVsdXGcHJKDu81
+rYb7+NN1xMRin2UaPFqaWzTn4/A2PPRYie2KRuifroHzYUaAimihzCgkF5IVg1mX
+nkMMNx0uyy1cQqksTqUxP+KX3q98WM/qQW72OX9y/bRwcW495A0brBazQ57YiLNG
+Edzsy0a1C6IhZjyyderTk/a3MYCTADPXKK0HyLMCggEAAJAVBVNTb4PRwO0Dr0N0
+1YeXdR51SD+30a7V2C/hsTh3Oil6E7RfxpWKcIrf9EdrG9OmLPukYqDB0lOr8HwZ
+yw4oK2gn4i5VXc9DtMEjmTljBMNlaf0ZfPRQz553Rl1atqKNczsuUw3HPPF1QX0Z
+6j5YBt9ZmCgYU4TepFKgoImPhkdZMH2WzZB0pilDXLfU9rfmOVGA52Fcr4irPfrH
+l/98OIJa/TlWLCS5LjZfa5ELfsy4rEhCqzWwaN6iv7vjG333ICsSuqo2+FQkkPdW
+2520EuHmQYDFFfRU/UsogKJEq63x2BAuKjOWtUZAjIf6jV2dBO0adWDSausGDBE8
+UQKCAQBx6q47H1/b2RBv4Tjw5nlA48BRf+FFptfOzfONIGNHI1CfCB6lUKzNz7ZB
+jJ8hhvRA3GntbL2gM83Kj+vwAxh17yMvD4lOOifku8VGkwD4V4rphDPRyhGOOqWp
+/p3lM7kUMM+Wv2OulTVPjsfGnJCyIuTgqrydHkgvTJo60+ujH9Yq1eSH5lrQKOex
+MRUBxyl+sR+rihESt04od66XcdB2Uh/WAnfE1g2O/Ma/Mx/Dv9/rjV5NJdkgeONr
+zyv65FPmQLqXUUSiC4N6/Z6Y92hWAy+IE31gWkFhML7npcMoaHw8ONiqA7Fti1nC
+SU4uK7xkjfLHk93yJH5gTzmq8Ol2
+-----END PRIVATE KEY-----
diff --git a/0xetc/0xgo/websocket/server/certs/server.pem b/0xetc/0xgo/websocket/server/certs/server.pem
new file mode 100644 (file)
index 0000000..af41410
--- /dev/null
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIFCTCCAvGgAwIBAgIUPv8CXUm2Dfb1zIxZic8wGRFtg9AwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODE3MDVaFw0yNTExMDIwODE3
+MDVaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBALenm0HNZtsaHVvu2LEsay+Vrtp5O26iPpiHxC/g9OkVHRDm64QU
+2bmrcHgQjPjTdiOhqTbnPaCCXI5LGwJg0H2ZuNQx0Iy1RH70f83fotKMeWmYSusE
+ahOSyiqayqIevacvTNLFrASFIkkL4A+q5M51UIYgOJuJs97OHvkG3SyU4WPMRmxe
+DS5pXKVCvQFYfbYTD7hmFRrp/4oVTd8H0IIlVjLMfmQGjwETAXbviGy0C0G64maj
+Gc+hA0twQSUW13nY8lrc3PJ7rOFV33vl/Noa8VtdUJntwf+CPaO63kRd4vgy752W
+ZKCuiBYHFdEh4Pu5QkkKzQlUWnPDf6qEf5YoecFCzof4OHFaylTqxiSWva+bumLa
+chjmOZuPSePMQqW6tVpm3NFVvWND3GZCTq1HeHNcFA2orvWV6RlHZQ3p+xw5dYe0
+lCsORiW8gJPADUfZMcEtxq62ZKS+ohgCngN3Zh9QHhvo30/wSAQDp9eGysGSFaxy
+kJCj/IXGXij35Se6hYe+Wcn0jJ7miLUBv7yoQSCpLolJeEXBw+TBLQUx9jss21km
+78cy4Lw3X3cGeFVVUmlvYl5wG9Eiwo1z1Ebo7WLDeTeRFL650AgFfWM9sBW6AUIp
+ly4XmwY7GUvuXUAoZ3DfpGhkXCLjyriBlEu40Ynk7gU/uxz6rdR+lRofAgMBAAGj
+WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU1PBtM/5U3mtg85f5
+tgBP1JQ0y+0wHwYDVR0jBBgwFoAUWryFapRsKtm4PFy0xy7IciUzQGMwDQYJKoZI
+hvcNAQELBQADggIBAF1jwJ/Om0GcOnKGSJYaqxJydYyqcDhEgxODMGgNoDd2yNN8
+74E29G41cwZe3eATw2PstXXicFLZTz1Nhu457BqvGgxwz8lsKXreDNLczuTr6KTh
++S/9CCONQ0bkLu3pJLdkfEEWxYNYyI9Nz35WJt24ESSyKBTxka7y3NBgVwGrN4Ys
+Tk8PtvgCVBRS1SD08WKoVhaD03M2wWJu2zvwcVqfYZxqgWxO+c5ElE/IF92WI3Gn
+jP8dL2qbsN7dGHi0JV9uzukc4PTVNnwdEodCDgufhcrtvTpR4KsGktHqzXXiQsGy
+hVMpx7yO+BCsjLCfCkbZXaXazp2PXLhIrAwhg3HFDbyESKJiAXQUGSlaNXD06UeT
+zZfHDl/8hswnFdJLhS2eAahAh7n0FRLGHHx0BIk/FLktzzAZouQlSw4HXm/710GZ
+8Z2agRv5g9e6bg7afks9grj4IhcZyCUNOQeZD/6+KBd97TqnfaYgFQzd192m+7eb
+WBbuLnx5INHzBjmbmLAUP4OZ+t5krOeWQMxUQOJUHtts0cs7K3EI2PB4pf+KRDy/
+Ij9KkYtOJ7WEmSy1JlR7vQEuAgZ80PLjHsjndJO+hOUdaqdkwgKHkkHdh9NQ8TQx
+AFyG5CSFHgGPPgJV2yaI/mIbzMxvuTnazhFyFjMXqWGyGxluchpmJWRfKxt6
+-----END CERTIFICATE-----
diff --git a/0xetc/0xgo/websocket/server/certs/server.pub b/0xetc/0xgo/websocket/server/certs/server.pub
new file mode 100644 (file)
index 0000000..0eec661
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt6ebQc1m2xodW+7YsSxr
+L5Wu2nk7bqI+mIfEL+D06RUdEObrhBTZuatweBCM+NN2I6GpNuc9oIJcjksbAmDQ
+fZm41DHQjLVEfvR/zd+i0ox5aZhK6wRqE5LKKprKoh69py9M0sWsBIUiSQvgD6rk
+znVQhiA4m4mz3s4e+QbdLJThY8xGbF4NLmlcpUK9AVh9thMPuGYVGun/ihVN3wfQ
+giVWMsx+ZAaPARMBdu+IbLQLQbriZqMZz6EDS3BBJRbXedjyWtzc8nus4VXfe+X8
+2hrxW11Qme3B/4I9o7reRF3i+DLvnZZkoK6IFgcV0SHg+7lCSQrNCVRac8N/qoR/
+lih5wULOh/g4cVrKVOrGJJa9r5u6YtpyGOY5m49J48xCpbq1Wmbc0VW9Y0PcZkJO
+rUd4c1wUDaiu9ZXpGUdlDen7HDl1h7SUKw5GJbyAk8ANR9kxwS3GrrZkpL6iGAKe
+A3dmH1AeG+jfT/BIBAOn14bKwZIVrHKQkKP8hcZeKPflJ7qFh75ZyfSMnuaItQG/
+vKhBIKkuiUl4RcHD5MEtBTH2OyzbWSbvxzLgvDdfdwZ4VVVSaW9iXnAb0SLCjXPU
+RujtYsN5N5EUvrnQCAV9Yz2wFboBQimXLhebBjsZS+5dQChncN+kaGRcIuPKuIGU
+S7jRieTuBT+7HPqt1H6VGh8CAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/0xetc/0xgo/websocket/server/main.go b/0xetc/0xgo/websocket/server/main.go
new file mode 100644 (file)
index 0000000..e3bbe1d
--- /dev/null
@@ -0,0 +1,88 @@
+package main
+
+import (
+       "log"
+       "net/http"
+       "time"
+
+       "github.com/gorilla/websocket"
+)
+
+type CommJSON struct {
+       Data string `json:"data"`
+}
+
+func clientHandler(w http.ResponseWriter, r *http.Request) {
+
+       log.Println("client access")
+
+       u := websocket.Upgrader{}
+
+       u.CheckOrigin = func(r *http.Request) bool { return true }
+
+       c, err := u.Upgrade(w, r, nil)
+       if err != nil {
+               log.Printf("client upgrade: %s\n", err.Error())
+               return
+       }
+
+       c.SetReadDeadline(time.Time{})
+
+       defer c.Close()
+
+       log.Printf("client accepted")
+
+       for {
+
+               req := CommJSON{}
+
+               resp := CommJSON{}
+
+               err := c.ReadJSON(&req)
+
+               if err != nil {
+
+                       log.Printf("client handle: client gone")
+
+                       _ = c.Close()
+
+                       return
+
+               }
+
+               log.Printf("client data: %s\n", req.Data)
+
+               resp.Data = req.Data
+
+               err = c.WriteJSON(resp)
+
+               if err != nil {
+
+                       log.Printf("failed to write: %s", err.Error())
+
+                       _ = c.Close()
+
+                       return
+               }
+
+       }
+
+}
+
+func run() error {
+
+       http.HandleFunc("/hello", clientHandler)
+
+       log.Fatal(http.ListenAndServeTLS("0.0.0.0:8888", "certs/server.pem", "certs/server.key", nil))
+
+       return nil
+}
+
+func main() {
+
+       if err := run(); err != nil {
+
+               log.Fatal(err.Error())
+       }
+
+}
diff --git a/0xgo/automation/main.go b/0xgo/automation/main.go
deleted file mode 100644 (file)
index 77c0f96..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "strconv"
-
-       "github.com/go-vgo/robotgo"
-       "github.com/vcaesar/imgo"
-)
-
-func Wheel() {
-
-       robotgo.MouseSleep = 100
-
-       robotgo.ScrollDir(10, "up")
-       robotgo.ScrollDir(20, "right")
-
-       robotgo.Scroll(0, -10)
-       robotgo.Scroll(100, 0)
-
-       robotgo.MilliSleep(100)
-       robotgo.ScrollSmooth(-10, 6)
-       // robotgo.ScrollRelative(10, -100)
-
-       robotgo.Move(10, 20)
-       robotgo.MoveRelative(0, -10)
-       robotgo.DragSmooth(10, 10)
-
-       robotgo.Click("wheelRight")
-       robotgo.Click("left", true)
-       robotgo.MoveSmooth(100, 200, 1.0, 10.0)
-
-       robotgo.Toggle("left")
-       robotgo.Toggle("left", "up")
-
-}
-
-func Keyboard() {
-
-       robotgo.TypeStr("Hello World")
-       robotgo.TypeStr("だんしゃり", 0, 1)
-       // robotgo.TypeStr("テストする")
-
-       robotgo.TypeStr("Hi, Seattle space needle, Golden gate bridge, One world trade center.")
-       robotgo.TypeStr("Hi galaxy, hi stars, hi MT.Rainier, hi sea. こんにちは世界.")
-       robotgo.Sleep(1)
-
-       // ustr := uint32(robotgo.CharCodeAt("Test", 0))
-       // robotgo.UnicodeType(ustr)
-
-       robotgo.KeySleep = 100
-       robotgo.KeyTap("enter")
-       // robotgo.TypeStr("en")
-       robotgo.KeyTap("i", "alt", "cmd")
-
-       arr := []string{"alt", "cmd"}
-       robotgo.KeyTap("i", arr)
-
-       robotgo.MilliSleep(100)
-       robotgo.KeyToggle("a")
-       robotgo.KeyToggle("a", "up")
-
-       robotgo.WriteAll("Test")
-       text, err := robotgo.ReadAll()
-       if err == nil {
-               fmt.Println(text)
-       }
-
-}
-
-func Screenshot() {
-       x, y := robotgo.Location()
-       fmt.Println("pos: ", x, y)
-
-       color := robotgo.GetPixelColor(100, 200)
-       fmt.Println("color---- ", color)
-
-       sx, sy := robotgo.GetScreenSize()
-       fmt.Println("get screen size: ", sx, sy)
-
-       bit := robotgo.CaptureScreen(10, 10, 30, 30)
-       defer robotgo.FreeBitmap(bit)
-
-       img := robotgo.ToImage(bit)
-       imgo.Save("test.png", img)
-
-       num := robotgo.DisplaysNum()
-       for i := 0; i < num; i++ {
-               robotgo.DisplayID = i
-               img1, _ := robotgo.CaptureImg()
-               path1 := "save_" + strconv.Itoa(i)
-               robotgo.Save(img1, path1+".png")
-               robotgo.SaveJpeg(img1, path1+".jpeg", 50)
-
-               img2, _ := robotgo.CaptureImg(10, 10, 20, 20)
-               robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png")
-       }
-}
-
-func main() {
-
-       //Wheel()
-
-       Keyboard()
-
-       //Screenshot()
-}
diff --git a/0xgo/binary/Makefile b/0xgo/binary/Makefile
deleted file mode 100644 (file)
index 021938f..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-all:
-       go build -o test.out .
\ No newline at end of file
diff --git a/0xgo/binary/main.go b/0xgo/binary/main.go
deleted file mode 100644 (file)
index 1e9566c..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-package main
-
-import (
-       "encoding/binary"
-       "fmt"
-       "net"
-       "unsafe"
-)
-
-/*
-
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-
-void print_raw_uint32(int value){
-
-       uint32_t uval = (uint32_t)value;
-
-       printf("uval: %u\n", uval);
-
-       uint8_t arr[4] = {0};
-
-       memcpy(arr, &uval, 4);
-
-       for(int i = 0; i < 4; i++){
-
-               printf("%x ", arr[i]);
-
-       }
-
-       printf("\n");
-
-}
-
-*/
-import "C"
-
-func main() {
-
-       var i uint32 = 0x0100
-       ptr := unsafe.Pointer(&i)
-       if 0x01 == *(*byte)(ptr) {
-               fmt.Println("Big Endian")
-       } else if 0x00 == *(*byte)(ptr) {
-               fmt.Println("Little Endian")
-       }
-
-       ipstring := "10.1.10.2"
-
-       ipbytes := net.ParseIP(ipstring).To4()
-
-       fmt.Println(ipbytes)
-
-       testle := binary.LittleEndian.Uint32(ipbytes)
-
-       testbe := binary.BigEndian.Uint32(ipbytes)
-
-       testne := binary.NativeEndian.Uint32(ipbytes)
-
-       fmt.Println("le==========")
-
-       C.print_raw_uint32(C.int(testle))
-
-       fmt.Println("be==========")
-
-       C.print_raw_uint32(C.int(testbe))
-
-       fmt.Println("ne==========")
-
-       C.print_raw_uint32(C.int(testne))
-
-       fmt.Printf("le: %d, be: %d, ne: %d\n", testle, testbe, testne)
-
-       lebytes := make([]byte, 4)
-       bebytes := make([]byte, 4)
-       nebytes := make([]byte, 4)
-
-       binary.LittleEndian.PutUint32(lebytes, testle)
-
-       binary.BigEndian.PutUint32(bebytes, testbe)
-
-       binary.NativeEndian.PutUint32(nebytes, testne)
-
-       fmt.Printf("%d %d %d %d\n", lebytes[0], lebytes[1], lebytes[2], lebytes[3])
-
-       fmt.Printf("%d %d %d %d\n", bebytes[0], bebytes[1], bebytes[2], bebytes[3])
-
-       fmt.Printf("%d %d %d %d\n", nebytes[0], nebytes[1], nebytes[2], nebytes[3])
-
-       testle = binary.LittleEndian.Uint32(lebytes)
-
-       testbe = binary.BigEndian.Uint32(bebytes)
-
-       testne = binary.NativeEndian.Uint32(nebytes)
-
-       fmt.Printf("le: %d, be: %d, ne: %d\n", testle, testbe, testne)
-
-       fmt.Println("ntohl")
-
-       in := testbe
-
-       fmt.Printf("in: %d\n", in)
-
-       C.print_raw_uint32(C.int(in))
-
-       tmp := make([]byte, 4)
-
-       binary.BigEndian.PutUint32(tmp, in)
-
-       out := binary.LittleEndian.Uint32(tmp)
-
-       fmt.Printf("out: %d\n", out)
-
-       C.print_raw_uint32(C.int(out))
-
-       fmt.Println("htonl")
-
-       in = out
-
-       fmt.Printf("in: %d\n", in)
-
-       C.print_raw_uint32(C.int(in))
-
-       tmp = make([]byte, 4)
-
-       binary.LittleEndian.PutUint32(tmp, in)
-
-       out = binary.BigEndian.Uint32(tmp)
-
-       fmt.Printf("out: %d\n", out)
-
-       C.print_raw_uint32(C.int(out))
-}
diff --git a/0xgo/c-lib/Makefile b/0xgo/c-lib/Makefile
deleted file mode 100644 (file)
index 691f558..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-all:
-
-       go build -o c2go.out .
-
-
-clean:
-
-       rm -r *.out
\ No newline at end of file
diff --git a/0xgo/c-lib/go2c/Makefile b/0xgo/c-lib/go2c/Makefile
deleted file mode 100644 (file)
index 143088c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-all:
-
-       go build -buildmode=c-shared -o go2c.so .
-
-clean:
-
-       rm -r *.h *.so
\ No newline at end of file
diff --git a/0xgo/c-lib/go2c/go2c.h b/0xgo/c-lib/go2c/go2c.h
deleted file mode 100644 (file)
index 924700f..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Code generated by cmd/cgo; DO NOT EDIT. */
-
-/* package github.com/seantywork/0xgo/c-lib/go2c */
-
-
-#line 1 "cgo-builtin-export-prolog"
-
-#include <stddef.h>
-
-#ifndef GO_CGO_EXPORT_PROLOGUE_H
-#define GO_CGO_EXPORT_PROLOGUE_H
-
-#ifndef GO_CGO_GOSTRING_TYPEDEF
-typedef struct { const char *p; ptrdiff_t n; } _GoString_;
-#endif
-
-#endif
-
-/* Start of preamble from import "C" comments.  */
-
-
-
-
-/* End of preamble from import "C" comments.  */
-
-
-/* Start of boilerplate cgo prologue.  */
-#line 1 "cgo-gcc-export-header-prolog"
-
-#ifndef GO_CGO_PROLOGUE_H
-#define GO_CGO_PROLOGUE_H
-
-typedef signed char GoInt8;
-typedef unsigned char GoUint8;
-typedef short GoInt16;
-typedef unsigned short GoUint16;
-typedef int GoInt32;
-typedef unsigned int GoUint32;
-typedef long long GoInt64;
-typedef unsigned long long GoUint64;
-typedef GoInt64 GoInt;
-typedef GoUint64 GoUint;
-typedef size_t GoUintptr;
-typedef float GoFloat32;
-typedef double GoFloat64;
-#ifdef _MSC_VER
-#include <complex.h>
-typedef _Fcomplex GoComplex64;
-typedef _Dcomplex GoComplex128;
-#else
-typedef float _Complex GoComplex64;
-typedef double _Complex GoComplex128;
-#endif
-
-/*
-  static assertion to make sure the file is being used on architecture
-  at least with matching size of GoInt.
-*/
-typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];
-
-#ifndef GO_CGO_GOSTRING_TYPEDEF
-typedef _GoString_ GoString;
-#endif
-typedef void *GoMap;
-typedef void *GoChan;
-typedef struct { void *t; void *v; } GoInterface;
-typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
-
-#endif
-
-/* End of boilerplate cgo prologue.  */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern GoInt Add(GoInt a, GoInt b);
-extern GoFloat64 Cosine(GoFloat64 x);
-extern void Sort(GoSlice vals);
-extern GoInt Log(GoString msg);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/0xgo/c-lib/go2c/main.go b/0xgo/c-lib/go2c/main.go
deleted file mode 100644 (file)
index 974b1dc..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-package main
-
-import "C"
-
-import (
-       "fmt"
-       "math"
-       "sort"
-       "sync"
-)
-
-var count int
-var mtx sync.Mutex
-
-//export Add
-func Add(a, b int) int {
-       return a + b
-}
-
-//export Cosine
-func Cosine(x float64) float64 {
-       return math.Cos(x)
-}
-
-//export Sort
-func Sort(vals []int) {
-       sort.Ints(vals)
-}
-
-//export Log
-func Log(msg string) int {
-       mtx.Lock()
-       defer mtx.Unlock()
-       fmt.Println(msg)
-       count++
-       return count
-}
-
-func main() {}
diff --git a/0xgo/c-lib/main.go b/0xgo/c-lib/main.go
deleted file mode 100644 (file)
index 0205bc2..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-package main
-
-/*
-#cgo CFLAGS: -g -Wall -I../../go-c-lib/c2go
-#cgo LDFLAGS: -L../../go-c-lib/c2go -Wl,-rpath=../../go-c-lib/c2go -lc2go
-#include "c2go.h"
-*/
-import "C"
-import (
-       "fmt"
-)
-
-type (
-       Person C.struct_APerson
-)
-
-func (p *Person) Name() string {
-       return C.GoString(p.name)
-}
-
-func (p *Person) LongName() string {
-       return C.GoString(p.long_name)
-}
-
-func GetPerson(name string, long_name string) *Person {
-       return (*Person)(C.get_person(C.CString(name), C.CString(long_name)))
-}
-
-func main() {
-       var f *Person
-       f = GetPerson("seanty", "work")
-       fmt.Printf("Hello Go world: My name is %s, %s.\n", C.GoString(f.name), C.GoString(f.long_name))
-
-       fmt.Printf("Hello Go world: My name is %s, %s.\n", f.Name(), f.LongName())
-}
diff --git a/0xgo/crawler/main.go b/0xgo/crawler/main.go
deleted file mode 100644 (file)
index a0bad0e..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-package main
-
-import (
-       "fmt"
-
-       colly "github.com/gocolly/colly/v2"
-)
-
-func main() {
-       c := colly.NewCollector()
-
-       c.OnHTML("a[href]", func(e *colly.HTMLElement) {
-               e.Request.Visit(e.Attr("href"))
-       })
-
-       c.OnRequest(func(r *colly.Request) {
-               fmt.Println("Visiting", r.URL)
-       })
-
-       c.Visit("http://go-colly.org/")
-}
diff --git a/0xgo/crypt/Makefile b/0xgo/crypt/Makefile
deleted file mode 100644 (file)
index b92a1b7..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-all:
-
-       go build -o test.out . 
-
-
-clean:
-
-       rm -rf *.out
\ No newline at end of file
diff --git a/0xgo/crypt/asym/asym.go b/0xgo/crypt/asym/asym.go
deleted file mode 100644 (file)
index f1041d8..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-package pki
-
-import (
-       "crypto/rand"
-       "crypto/sha512"
-       "crypto/x509/pkix"
-       "errors"
-       "fmt"
-       "log"
-       "math/big"
-       mathrand "math/rand"
-       "time"
-
-       "crypto/rsa"
-       "crypto/x509"
-       "encoding/pem"
-)
-
-type CertSet struct {
-       RootCertPEM   []byte
-       RootKeyPEM    []byte
-       RootPubPEM    []byte
-       ClientCertPEM []byte
-       ClientKeyPEM  []byte
-       ClientPubPEM  []byte
-       ServCertPEM   []byte
-       ServKeyPEM    []byte
-       ServPubPEM    []byte
-}
-
-func GenerateKeyPair(bits int) (*rsa.PrivateKey, *rsa.PublicKey, error) {
-
-       var pubkey *rsa.PublicKey
-
-       privkey, err := rsa.GenerateKey(rand.Reader, bits)
-       if err != nil {
-               return privkey, pubkey, fmt.Errorf("failed to gen key pair: %s", err.Error())
-       }
-
-       pubkey = &privkey.PublicKey
-
-       return privkey, pubkey, nil
-}
-
-func PrivateKeyToBytes(priv *rsa.PrivateKey) ([]byte, error) {
-       var ret_byte []byte
-       privBytes := pem.EncodeToMemory(
-               &pem.Block{
-                       Type:  "RSA PRIVATE KEY",
-                       Bytes: x509.MarshalPKCS1PrivateKey(priv),
-               },
-       )
-
-       if privBytes == nil {
-               return ret_byte, fmt.Errorf("failed to encode priv key to bytes: %s", "invalid")
-       }
-
-       return privBytes, nil
-}
-
-func PublicKeyToBytes(pub *rsa.PublicKey) ([]byte, error) {
-
-       var ret_byte []byte
-
-       pubASN1, err := x509.MarshalPKIXPublicKey(pub)
-       if err != nil {
-               return pubASN1, fmt.Errorf("failed to encode pub key to bytes: %s", err.Error())
-       }
-
-       pubBytes := pem.EncodeToMemory(&pem.Block{
-               Type:  "RSA PUBLIC KEY",
-               Bytes: pubASN1,
-       })
-
-       if pubBytes == nil {
-               return ret_byte, fmt.Errorf("failed to encode priv key to bytes: %s", "invalid")
-       }
-
-       return pubBytes, nil
-}
-
-func CertToBytes(crt *x509.Certificate) ([]byte, error) {
-
-       cert_b := crt.Raw
-
-       certBytes := pem.EncodeToMemory(&pem.Block{
-               Type:  "CERTIFICATE",
-               Bytes: cert_b,
-       })
-
-       if certBytes == nil {
-
-               return nil, fmt.Errorf("failed to encode cert to bytes: %s", "invalid")
-       }
-
-       return certBytes, nil
-
-}
-
-func BytesToPrivateKey(priv []byte) (*rsa.PrivateKey, error) {
-
-       var privkey *rsa.PrivateKey
-
-       block, _ := pem.Decode(priv)
-       enc := x509.IsEncryptedPEMBlock(block)
-       b := block.Bytes
-       var err error
-       if enc {
-               fmt.Println("is encrypted pem block")
-               b, err = x509.DecryptPEMBlock(block, nil)
-               if err != nil {
-                       return privkey, fmt.Errorf("failed to decode bytes to priv key: %s", err.Error())
-               }
-       }
-       key, err := x509.ParsePKCS1PrivateKey(b)
-       if err != nil {
-               return privkey, fmt.Errorf("failed to decode bytes to priv key: %s", err.Error())
-       }
-       return key, nil
-}
-
-func BytesToPublicKey(pub []byte) (*rsa.PublicKey, error) {
-
-       var pubkey *rsa.PublicKey
-
-       block, _ := pem.Decode(pub)
-       enc := x509.IsEncryptedPEMBlock(block)
-       b := block.Bytes
-       var err error
-       if enc {
-               fmt.Println("is encrypted pem block")
-               b, err = x509.DecryptPEMBlock(block, nil)
-               if err != nil {
-                       return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error())
-               }
-       }
-       ifc, err := x509.ParsePKIXPublicKey(b)
-       if err != nil {
-               return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error())
-       }
-       key, ok := ifc.(*rsa.PublicKey)
-       if !ok {
-               return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error())
-       }
-       return key, nil
-}
-
-func BytesToCert(cert []byte) (*x509.Certificate, error) {
-
-       var ret_crt *x509.Certificate
-
-       block, _ := pem.Decode(cert)
-
-       ifc, err := x509.ParseCertificate(block.Bytes)
-
-       if err != nil {
-
-               return ret_crt, fmt.Errorf("failed to decode bytes to certificate: %s", err.Error())
-       }
-
-       ret_crt = ifc
-
-       return ret_crt, nil
-}
-
-func EncryptWithPublicKey(msg []byte, pub *rsa.PublicKey) ([]byte, error) {
-       hash := sha512.New()
-       ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, pub, msg, nil)
-       if err != nil {
-               return ciphertext, fmt.Errorf("failed to encrypt with public key: %s", err.Error())
-       }
-       return ciphertext, nil
-}
-
-func DecryptWithPrivateKey(ciphertext []byte, priv *rsa.PrivateKey) ([]byte, error) {
-       hash := sha512.New()
-       plaintext, err := rsa.DecryptOAEP(hash, rand.Reader, priv, ciphertext, nil)
-       if err != nil {
-               return plaintext, fmt.Errorf("failed to decrypt with private key: %s", err.Error())
-       }
-       return plaintext, nil
-}
-
-func GetRandIntInRange(min int, max int) int {
-
-       mathrand.Seed(time.Now().UnixNano())
-
-       return mathrand.Intn(max-min+1) + min
-}
-
-func GenKeyPair(keylen int) (*rsa.PrivateKey, *rsa.PublicKey) {
-
-       bitSize := keylen
-
-       key, err := rsa.GenerateKey(rand.Reader, bitSize)
-       if err != nil {
-               panic(err)
-       }
-
-       pub := key.Public()
-
-       return key, pub.(*rsa.PublicKey)
-}
-
-func CertTemplate(cn string, validYear int) (*x509.Certificate, error) {
-       // generate a random serial number (a real cert authority would have some logic behind this)
-       serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
-       serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
-       if err != nil {
-               return nil, errors.New("failed to generate serial number: " + err.Error())
-       }
-
-       if err != nil {
-
-               return nil, fmt.Errorf("failed to gen cert tmpl: %s", err.Error())
-       }
-
-       tmpl := x509.Certificate{
-               SerialNumber:          serialNumber,
-               Subject:               pkix.Name{CommonName: cn},
-               SignatureAlgorithm:    x509.SHA256WithRSA,
-               NotBefore:             time.Now(),
-               NotAfter:              time.Now().Add(time.Hour * 24 * 30 * 12 * time.Duration(validYear)),
-               BasicConstraintsValid: true,
-               DNSNames: []string{
-                       cn,
-               },
-       }
-       return &tmpl, nil
-}
-
-func CreateCert(template, parent *x509.Certificate, pub interface{}, parentPriv interface{}) (cert *x509.Certificate, certPEM []byte, err error) {
-
-       certDER, err := x509.CreateCertificate(rand.Reader, template, parent, pub, parentPriv)
-       if err != nil {
-               return
-       }
-       // parse the resulting certificate so we can use it again
-       cert, err = x509.ParseCertificate(certDER)
-       if err != nil {
-               return
-       }
-       // PEM encode the certificate (this is a standard TLS encoding)
-       b := pem.Block{Type: "CERTIFICATE", Bytes: certDER}
-       certPEM = pem.EncodeToMemory(&b)
-
-       return
-}
-
-func NewCertsPipeline(server_name string, client_name string) *CertSet {
-       // generate a new key-pair
-       rootKey, rootPub := GenKeyPair(4096)
-
-       rootCertTmpl, err := CertTemplate("ca", 10)
-       if err != nil {
-               log.Fatalf("creating cert template: %v", err)
-       }
-
-       // this cert will be the CA that we will use to sign the server cert
-       rootCertTmpl.IsCA = true
-       // describe what the certificate will be used for
-       rootCertTmpl.KeyUsage = x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature
-       rootCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}
-
-       log.Println("----------ca cert")
-
-       rootCert, rootCertPEM, err := CreateCert(rootCertTmpl, rootCertTmpl, rootPub, rootKey)
-       if err != nil {
-               log.Fatalf("error creating cert: %v", err)
-       }
-
-       // provide the private key and the cert
-       rootKeyPEM := pem.EncodeToMemory(&pem.Block{
-               Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(rootKey),
-       })
-
-       rootPubPEM := pem.EncodeToMemory(&pem.Block{
-               Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(rootPub),
-       })
-
-       /*******************************************************************
-       Server Cert
-       *******************************************************************/
-
-       // create a key-pair for the server
-       servKey, servPub := GenKeyPair(4096)
-
-       log.Println("----------server cert")
-       // create a template for the server
-       servCertTmpl, err := CertTemplate(server_name, 1)
-       if err != nil {
-               log.Fatalf("creating cert template: %v", err)
-       }
-       servCertTmpl.KeyUsage = x509.KeyUsageDigitalSignature
-       servCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}
-
-       // create a certificate which wraps the server's public key, sign it with the root private key
-       _, servCertPEM, err := CreateCert(servCertTmpl, rootCert, servPub, rootKey)
-       if err != nil {
-               log.Fatalf("error creating cert: %v", err)
-       }
-
-       // provide the private key and the cert
-       servKeyPEM := pem.EncodeToMemory(&pem.Block{
-               Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(servKey),
-       })
-
-       servPubPEM := pem.EncodeToMemory(&pem.Block{
-               Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(servPub),
-       })
-
-       /*******************************************************************
-       Client Cert
-       *******************************************************************/
-
-       // create a key-pair for the client
-       clientKey, clientPub := GenKeyPair(4096)
-
-       log.Println("----------client cert")
-
-       // create a template for the client
-       clientCertTmpl, err := CertTemplate(client_name, 1)
-       if err != nil {
-               log.Fatalf("creating cert template: %v", err)
-       }
-       clientCertTmpl.KeyUsage = x509.KeyUsageDigitalSignature
-       clientCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}
-
-       // the root cert signs the cert by again providing its private key
-       _, clientCertPEM, err := CreateCert(clientCertTmpl, rootCert, clientPub, rootKey)
-       if err != nil {
-               log.Fatalf("error creating cert: %v", err)
-       }
-
-       // encode and load the cert and private key for the client
-       clientKeyPEM := pem.EncodeToMemory(&pem.Block{
-               Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(clientKey),
-       })
-
-       clientPubPEM := pem.EncodeToMemory(&pem.Block{
-               Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(clientPub),
-       })
-
-       cs := CertSet{
-               RootCertPEM:   rootCertPEM,
-               RootKeyPEM:    rootKeyPEM,
-               RootPubPEM:    rootPubPEM,
-               ClientCertPEM: clientCertPEM,
-               ClientKeyPEM:  clientKeyPEM,
-               ClientPubPEM:  clientPubPEM,
-               ServCertPEM:   servCertPEM,
-               ServKeyPEM:    servKeyPEM,
-               ServPubPEM:    servPubPEM,
-       }
-
-       return &cs
-}
diff --git a/0xgo/crypt/main.go b/0xgo/crypt/main.go
deleted file mode 100644 (file)
index 74889ff..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-package main
-
-import (
-       "log"
-
-       pkgsym "github.com/seantywork/0xgo/crypt/sym"
-)
-
-func main() {
-
-       /*
-               key := "12345678123456781234567812345678"
-
-               ciphertext := "7c1c5afe5fc1d2cda983019029a65490c3f2fc7fb752fff310406549ea52350edbe40cb8448b9a9a15e0bb02ed0a97244387c396125a6636ed3e9ee74517ab29"
-
-               dap, err := pkgsym.DecryptAES256CBC(ciphertext, []byte(key))
-
-               if err != nil {
-
-                       log.Fatalf("err: %v\n", err)
-               } else {
-                       log.Printf("success: %v\n", dap)
-               }
-       */
-
-       key := []byte("12345678123456781234567812345678")
-
-       data := "Scroll through the sentence list to see the sentence that best meets the context you’re looking for."
-
-       cipher := pkgsym.EncryptAES256CBC(data, key)
-
-       decipher, err := pkgsym.DecryptAES256CBC(cipher, key)
-
-       if err != nil {
-
-               log.Fatalf("error: %v\n", err)
-       } else {
-
-               log.Printf("success: %s\n", decipher)
-       }
-
-       cipherb, err := pkgsym.EncryptAESGCM(key, []byte(data))
-
-       if err != nil {
-               log.Fatalf("error: %v\n", err)
-       }
-
-       decipherb, err := pkgsym.DecryptAESGCM(key, cipherb)
-       if err != nil {
-
-               log.Fatalf("error: %v\n", err)
-       } else {
-
-               log.Printf("success: %s\n", string(decipherb))
-       }
-}
diff --git a/0xgo/crypt/sym/sym.go b/0xgo/crypt/sym/sym.go
deleted file mode 100644 (file)
index 0039f7c..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-package aes
-
-import (
-       "bytes"
-       "crypto/aes"
-       "crypto/cipher"
-       "crypto/rand"
-       "encoding/hex"
-       "fmt"
-       "io"
-)
-
-func RandomHex(n int) (string, error) {
-       bytes := make([]byte, n)
-       if _, err := rand.Read(bytes); err != nil {
-               return "", err
-       }
-       return hex.EncodeToString(bytes), nil
-}
-
-func RandomBytes(n int) ([]byte, error) {
-       bytes := make([]byte, n)
-       if _, err := rand.Read(bytes); err != nil {
-               return nil, err
-       }
-
-       return bytes, nil
-
-}
-
-func EncryptAES256CBC(plaintext string, key []byte) string {
-       bKey := key
-       bIV, _ := RandomBytes(aes.BlockSize)
-
-       blockSize := aes.BlockSize
-
-       bPlaintext := PKCS5Padding([]byte(plaintext), blockSize, len(plaintext))
-       block, err := aes.NewCipher(bKey)
-       if err != nil {
-               panic(err)
-       }
-       ciphertext := make([]byte, len(bPlaintext)+aes.BlockSize)
-       mode := cipher.NewCBCEncrypter(block, bIV)
-       mode.CryptBlocks(ciphertext[aes.BlockSize:], bPlaintext)
-
-       copy(ciphertext, bIV)
-
-       return hex.EncodeToString(ciphertext)
-}
-
-func DecryptAES256CBC(ciphertext string, key []byte) (string, error) {
-
-       if len(key) != 32 {
-               return "", fmt.Errorf("key must be 32 bytes for AES-256")
-       }
-
-       cipherData, err := hex.DecodeString(ciphertext)
-       if err != nil {
-
-               return "", err
-       }
-
-       if len(cipherData) < aes.BlockSize {
-               fmt.Printf("cipherText too short\r\n")
-               return "", fmt.Errorf("cipherText too short")
-       }
-
-       iv := cipherData[:aes.BlockSize]
-       cipherText := cipherData[aes.BlockSize:]
-
-       block, err := aes.NewCipher(key)
-       if err != nil {
-
-               return "", err
-       }
-
-       if len(cipherText)%aes.BlockSize != 0 {
-
-               return "", fmt.Errorf("cipherText is not a multiple of the block size")
-       }
-
-       mode := cipher.NewCBCDecrypter(block, iv)
-
-       plainText := make([]byte, len(cipherText)*2)
-       mode.CryptBlocks(plainText, cipherText)
-
-       return string(plainText), nil
-}
-
-func EncryptAESGCM(key []byte, file_byte []byte) ([]byte, error) {
-
-       var ret_byte []byte = make([]byte, 0)
-
-       c, err := aes.NewCipher(key)
-
-       if err != nil {
-               return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error())
-
-       }
-
-       gcm, err := cipher.NewGCM(c)
-
-       if err != nil {
-               return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error())
-
-       }
-
-       nonce := make([]byte, gcm.NonceSize())
-
-       if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
-               return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error())
-       }
-
-       nonceSize := gcm.NonceSize()
-       if len(file_byte) < nonceSize {
-               return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error())
-       }
-       ciphertext := gcm.Seal(nil, nonce, file_byte, nil)
-
-       ret_byte = append(ret_byte, nonce...)
-
-       ret_byte = append(ret_byte, ciphertext...)
-
-       return ret_byte, nil
-
-}
-
-func DecryptAESGCM(key []byte, file_byte []byte) ([]byte, error) {
-
-       var ret_byte []byte
-
-       c, err := aes.NewCipher(key)
-       if err != nil {
-               return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error())
-       }
-
-       gcm, err := cipher.NewGCM(c)
-       if err != nil {
-               return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error())
-       }
-
-       nonceSize := gcm.NonceSize()
-
-       if len(file_byte) < nonceSize {
-               return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error())
-       }
-
-       nonce, ciphertext := file_byte[:nonceSize], file_byte[nonceSize:]
-
-       plainfile, err := gcm.Open(nil, nonce, ciphertext, nil)
-       if err != nil {
-               return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error())
-       }
-
-       ret_byte = plainfile
-
-       return ret_byte, nil
-}
-
-func PKCS5Padding(ciphertext []byte, blockSize int, after int) []byte {
-       padding := (blockSize - len(ciphertext)%blockSize)
-       padtext := bytes.Repeat([]byte{byte(padding)}, padding)
-       return append(ciphertext, padtext...)
-}
diff --git a/0xgo/etcd-query/.gitignore b/0xgo/etcd-query/.gitignore
deleted file mode 100644 (file)
index 546b462..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-etcd1_data
-etcd2_data
-etcd3_data
\ No newline at end of file
diff --git a/0xgo/etcd-query/core/modules.go b/0xgo/etcd-query/core/modules.go
deleted file mode 100644 (file)
index bf67c63..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-package core
-
-import (
-       "context"
-       "log"
-       "strconv"
-       "time"
-
-       clientv3 "go.etcd.io/etcd/client/v3"
-)
-
-func ConnectEtcd() (*clientv3.Client, error) {
-
-       _, err := clientv3.New(clientv3.Config{
-               Endpoints:   []string{"localhost:2379"},
-               DialTimeout: 2 * time.Second,
-       })
-
-       if err == context.DeadlineExceeded {
-               log.Println("deadline execeeded")
-               return nil, err
-       }
-
-       cli, err := clientv3.New(clientv3.Config{
-               Endpoints:   []string{"localhost:2379"},
-               DialTimeout: 5 * time.Second,
-       })
-       if err != nil {
-               log.Println("failed to get new clien")
-               return nil, err
-       }
-
-       log.Println("connection success!")
-
-       return cli, nil
-
-}
-
-func PutKey(cli *clientv3.Client, key string, val string) error {
-
-       ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*1000*10)
-
-       _, err := cli.Put(ctx, key, val)
-
-       cancel()
-
-       if err != nil {
-
-               return err
-
-       }
-
-       log.Println("put successful")
-
-       return nil
-}
-
-func GetKey(cli *clientv3.Client, key string) error {
-
-       resp, err := cli.Get(context.TODO(), key)
-
-       if err != nil {
-               log.Println("failed to get")
-               return err
-       }
-
-       match_len := len(resp.Kvs)
-
-       match_len_str := strconv.Itoa(match_len)
-
-       log.Println("matched count: " + match_len_str)
-
-       log.Println("match: key: " + string(resp.Kvs[0].Key) + " val: " + string(resp.Kvs[0].Value))
-
-       return nil
-
-}
diff --git a/0xgo/etcd-query/docker-compose.yaml b/0xgo/etcd-query/docker-compose.yaml
deleted file mode 100644 (file)
index 8b3b95a..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-version: "3"
-services:
-    etcd-1:
-        image: quay.io/coreos/etcd:v3.5.9
-        entrypoint: /usr/local/bin/etcd
-        ports:
-            - "2379:2379"
-        command:
-            - '--name=etcd-1'
-            - '--initial-advertise-peer-urls=http://etcd-1:2380'
-            - '--listen-peer-urls=http://0.0.0.0:2380'
-            - '--listen-client-urls=http://0.0.0.0:2379'
-            - '--advertise-client-urls=http://etcd-1:2379'
-            - '--heartbeat-interval=250'
-            - '--election-timeout=1250'
-            - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380'
-            - '--initial-cluster-state=new'
-            - '--initial-cluster-token=etcdbogustoken1234'
-        volumes:
-            - ./etcd1_data:/etcd_data
-
-    etcd-2:
-        image: quay.io/coreos/etcd:v3.5.9
-        entrypoint: /usr/local/bin/etcd
-        command:
-            - '--name=etcd-2'
-            - '--initial-advertise-peer-urls=http://etcd-2:2380'
-            - '--listen-peer-urls=http://0.0.0.0:2380'
-            - '--listen-client-urls=http://0.0.0.0:2379'
-            - '--advertise-client-urls=http://etcd-2:2379'
-            - '--heartbeat-interval=250'
-            - '--election-timeout=1250'
-            - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380'
-            - '--initial-cluster-state=new'
-            - '--initial-cluster-token=etcdbogustoken1234'
-        volumes:
-            - ./etcd2_data:/etcd_data
-
-    etcd-3:
-        image: quay.io/coreos/etcd:v3.5.9
-        entrypoint: /usr/local/bin/etcd
-        command:
-            - '--name=etcd-3'
-            - '--initial-advertise-peer-urls=http://etcd-3:2380'
-            - '--listen-peer-urls=http://0.0.0.0:2380'
-            - '--listen-client-urls=http://0.0.0.0:2379'
-            - '--advertise-client-urls=http://etcd-3:2379'
-            - '--heartbeat-interval=250'
-            - '--election-timeout=1250'
-            - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380'
-            - '--initial-cluster-state=new'
-            - '--initial-cluster-token=etcdbogustoken1234'
-        volumes:
-            - ./etcd3_data:/etcd_data
diff --git a/0xgo/etcd-query/main.go b/0xgo/etcd-query/main.go
deleted file mode 100644 (file)
index 3ebcad1..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-package main
-
-import (
-       "log"
-
-       etcqcore "github.com/seantywork/0xgo/etcd-query/core"
-)
-
-func main() {
-
-       cli, err := etcqcore.ConnectEtcd()
-
-       defer cli.Close()
-
-       if err != nil {
-
-               log.Fatalln(err.Error())
-       }
-
-       test_key := "my_little_key"
-
-       test_val := "myLittleValue"
-
-       err = etcqcore.PutKey(cli, test_key, test_val)
-
-       if err != nil {
-               log.Fatalln(err.Error())
-       }
-
-       err = etcqcore.GetKey(cli, test_key)
-
-       if err != nil {
-               log.Fatalln(err.Error())
-       }
-
-}
diff --git a/0xgo/fault/.gitignore b/0xgo/fault/.gitignore
deleted file mode 100644 (file)
index 1c0ec3f..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-*.prof
-*.png
\ No newline at end of file
diff --git a/0xgo/fault/2504-03.xyz.md b/0xgo/fault/2504-03.xyz.md
deleted file mode 100644 (file)
index 3ed8c93..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-# 21
-
-
-```shell
- 62         runtime.GC()
- 63 
- 64         cpuProfileBuff := &bytes.Buffer{}
- 65 
- 66         err := pprof.StartCPUProfile(cpuProfileBuff)
- 67 
- 68         if err != nil {
- 69 
- 70                 panic(err)
- 71         }
- 72 
- 73         time.Sleep(time.Second * time.Duration(waits))
- 74 
- 75         pprof.StopCPUProfile()
- 76 
- 77         runtime.GC()
- 78 
- 79         profileBytes := cpuProfileBuff.Bytes()
- 80 
- 81         f, err := os.OpenFile("go.prof", os.O_CREATE|os.O_RDWR, 0644)
- 82 
-
-
-```
-
-# 22
-
-```shell
-
-    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                   
-  13784 seantyw+  20   0 1226856   4568   1536 S 107.3   0.1   0:22.65 test.out                  
-   2903 seantyw+  20   0   11.1g  75580  45056 S   9.3   0.9   0:04.94 node                      
-   2797 seantyw+  20   0   11.3g 102748  47872 R   6.0   1.3   0:05.74 node                      
-   3718 seantyw+  20   0   31.3g 142516  55296 S   3.3   1.8   0:10.09 node          
-```
-
-# 23
-
-```shell
-$ ls
-2504-03.xyz.md  go.prof  main.go  Makefile  test.out
-
-
-$ sudo apt update && sudo apt install graphviz
-
-
-$ go tool pprof -png go.prof
-Generating report in profile001.png
-```
-
-# 24
-
-```shell
-94 type NullStruct struct {
-95         Value int
-96         Field *NullStruct
-97 }
-
-
-121 
-122                 null := NullStruct{}
-123 
-124                 fmt.Printf("val: %d\n", null.Field.Value)
-125 
-
-```
-
-# 25 
-```shell
-$ ./test.out 2
-panic: runtime error: invalid memory address or nil pointer dereference
-[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b7593]
-
-goroutine 1 [running]:
-main.main()
-        /home/seantywork/hack/linux/linuxyz/0xgo/fault/main.go:124 +0xb3
-
-```
\ No newline at end of file
diff --git a/0xgo/fault/Makefile b/0xgo/fault/Makefile
deleted file mode 100644 (file)
index 731062c..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-all:
-       go build -o test.out .
-       
diff --git a/0xgo/fault/main.go b/0xgo/fault/main.go
deleted file mode 100644 (file)
index 092bcd0..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-package main
-
-import (
-       "bytes"
-       "fmt"
-       "os"
-       "runtime"
-       "runtime/pprof"
-       "time"
-)
-
-var TLEN = 10
-
-func busy() {
-
-       val := 1
-       str := ""
-       for {
-
-               str = fmt.Sprintf("%d", val)
-
-               _ = str
-       }
-
-}
-
-func notbusy(idx int) {
-
-       val := 1
-       str := ""
-       for {
-
-               time.Sleep(time.Millisecond * 1)
-
-               str = fmt.Sprintf("%d", val)
-
-               fmt.Printf("i'm not busy: %d: %s\n", idx, str)
-
-       }
-}
-
-func threadFunc() {
-
-       for i := 0; i < TLEN; i++ {
-
-               if i == 5 {
-
-                       go busy()
-
-               } else {
-
-                       go notbusy(i)
-
-               }
-
-       }
-
-}
-
-func profiler(waits int) {
-
-       runtime.GC()
-
-       cpuProfileBuff := &bytes.Buffer{}
-
-       err := pprof.StartCPUProfile(cpuProfileBuff)
-
-       if err != nil {
-
-               panic(err)
-       }
-
-       time.Sleep(time.Second * time.Duration(waits))
-
-       pprof.StopCPUProfile()
-
-       runtime.GC()
-
-       profileBytes := cpuProfileBuff.Bytes()
-
-       f, err := os.OpenFile("go.prof", os.O_CREATE|os.O_RDWR, 0644)
-
-       if err != nil {
-
-               panic(err)
-       }
-
-       f.Write(profileBytes)
-
-       f.Close()
-
-}
-
-type NullStruct struct {
-       Value int
-       Field *NullStruct
-}
-
-func main() {
-
-       argc := len(os.Args)
-
-       if argc != 2 {
-               fmt.Printf("feed case\n")
-               os.Exit(-1)
-       }
-
-       if os.Args[1] == "1" {
-
-               go threadFunc()
-
-               go profiler(10)
-
-               for {
-
-                       time.Sleep(time.Millisecond * 1000)
-
-               }
-
-       } else if os.Args[1] == "2" {
-
-               null := NullStruct{}
-
-               fmt.Printf("val: %d\n", null.Field.Value)
-
-       }
-
-}
diff --git a/0xgo/file-updownload/.gitignore b/0xgo/file-updownload/.gitignore
deleted file mode 100644 (file)
index 6320cd2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-data
\ No newline at end of file
diff --git a/0xgo/file-updownload/Makefile b/0xgo/file-updownload/Makefile
deleted file mode 100644 (file)
index a1070ec..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-all:
-       go build -o client/c.out ./client 
-
-       go build -o server/s.out ./server
-
diff --git a/0xgo/file-updownload/client/main.go b/0xgo/file-updownload/client/main.go
deleted file mode 100644 (file)
index 0f0bdd2..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-package main
-
-import (
-       "bytes"
-       "fmt"
-       "io"
-       "log"
-       "mime/multipart"
-       "net/http"
-       "os"
-       "strings"
-)
-
-func Upload(client *http.Client, url string, values map[string]io.Reader) (err error) {
-
-       var b bytes.Buffer
-       w := multipart.NewWriter(&b)
-       for key, r := range values {
-               var fw io.Writer
-               if x, ok := r.(io.Closer); ok {
-                       defer x.Close()
-               }
-
-               if x, ok := r.(*os.File); ok {
-                       if fw, err = w.CreateFormFile(key, x.Name()); err != nil {
-                               return
-                       }
-               } else {
-                       // Add other fields
-                       if fw, err = w.CreateFormField(key); err != nil {
-                               return
-                       }
-               }
-               if _, err = io.Copy(fw, r); err != nil {
-                       return err
-               }
-
-       }
-
-       w.Close()
-
-       req, err := http.NewRequest("POST", url, &b)
-       if err != nil {
-               return
-       }
-
-       req.Header.Set("Content-Type", w.FormDataContentType())
-
-       res, err := client.Do(req)
-       if err != nil {
-               return
-       }
-
-       if res.StatusCode != http.StatusOK {
-               err = fmt.Errorf("bad status: %s", res.Status)
-       }
-       return
-}
-
-func Download(filepath string, url string) (err error) {
-
-       out, err := os.Create(filepath)
-       if err != nil {
-               return err
-       }
-       defer out.Close()
-
-       resp, err := http.Get(url)
-       if err != nil {
-               return err
-       }
-       defer resp.Body.Close()
-
-       if resp.StatusCode != http.StatusOK {
-               return fmt.Errorf("bad status: %s", resp.Status)
-       }
-
-       _, err = io.Copy(out, resp.Body)
-       if err != nil {
-               return err
-       }
-
-       return nil
-}
-
-func main() {
-
-       v, err := os.Open("./data/test.mp4")
-
-       if err != nil {
-               log.Printf("failed to read data: %v\n", err)
-               os.Exit(-1)
-       }
-
-       values := map[string]io.Reader{
-               "file":  v,
-               "other": strings.NewReader("hello world!"),
-       }
-
-       client := &http.Client{}
-
-       err = Upload(client, "http://localhost:8080/upload", values)
-
-       if err != nil {
-
-               log.Printf("failed to upload file: %v\n", err)
-
-               os.Exit(-1)
-       }
-
-       err = Download("./data/return.mp4", "http://localhost:8080/download/test.mp4")
-
-       if err != nil {
-               log.Printf("failed to download file: %v\n", err)
-
-               os.Exit(-1)
-       }
-
-       os.Exit(0)
-
-}
diff --git a/0xgo/file-updownload/server/main.go b/0xgo/file-updownload/server/main.go
deleted file mode 100644 (file)
index e8cfcca..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-package main
-
-import (
-       "log"
-       "net/http"
-
-       "github.com/gin-gonic/contrib/sessions"
-       "github.com/gin-gonic/gin"
-)
-
-func BinaryUpload(c *gin.Context) {
-
-       file, _ := c.FormFile("file")
-
-       rawMediaType := file.Header.Get("Content-Type")
-
-       log.Printf("content type: %s\n", rawMediaType)
-
-       f_name := file.Filename
-
-       this_video_path := "./data/" + f_name
-
-       err := c.SaveUploadedFile(file, this_video_path)
-
-       if err != nil {
-
-               c.String(http.StatusBadRequest, "failed")
-
-               return
-       }
-
-       c.String(http.StatusOK, "success")
-
-}
-
-func BinaryDownload(c *gin.Context) {
-
-       binName := c.Param("binName")
-
-       this_video_path := "./data/" + binName
-
-       //c.Header("Content-Type", "video/mp4")
-
-       c.File(this_video_path)
-
-}
-
-func setRoutes(e *gin.Engine) {
-
-       e.POST("/upload", BinaryUpload)
-
-       e.GET("/download/:binName", BinaryDownload)
-
-}
-
-func main() {
-
-       server := gin.Default()
-
-       store := sessions.NewCookieStore([]byte("FILEUPDOWN"))
-
-       server.Use(sessions.Sessions("FILEUPDOWN", store))
-
-       setRoutes(server)
-
-       server.Run("0.0.0.0:8080")
-
-}
diff --git a/0xgo/go.mod b/0xgo/go.mod
deleted file mode 100644 (file)
index 8dc0c90..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-module github.com/seantywork/0xgo
-
-go 1.25.0
-
-require (
-       fyne.io/fyne/v2 v2.5.2
-       github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0
-       github.com/gin-gonic/gin v1.10.0
-       github.com/go-sql-driver/mysql v1.8.1
-       github.com/go-vgo/robotgo v0.110.5
-       github.com/gocolly/colly/v2 v2.1.0
-       github.com/gorilla/websocket v1.5.3
-       github.com/graphql-go/graphql v0.8.1
-       github.com/graphql-go/handler v0.2.4
-       github.com/pion/ice/v3 v3.0.16
-       github.com/pion/rtcp v1.2.15
-       github.com/pion/webrtc/v4 v4.0.7
-       github.com/pkg/errors v0.9.1
-       github.com/quic-go/quic-go v0.48.1
-       github.com/vcaesar/imgo v0.40.2
-       github.com/yutopp/go-flv v0.3.1
-       github.com/yutopp/go-rtmp v0.0.7
-       go.etcd.io/etcd/client/v3 v3.5.16
-       golang.org/x/crypto v0.29.0
-       golang.org/x/net v0.31.0
-       golang.org/x/oauth2 v0.23.0
-       google.golang.org/api v0.204.0
-       google.golang.org/grpc v1.67.1
-       google.golang.org/protobuf v1.35.1
-       gopkg.in/yaml.v3 v3.0.1
-)
-
-require (
-       cloud.google.com/go/auth v0.10.0 // indirect
-       cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect
-       cloud.google.com/go/compute/metadata v0.5.2 // indirect
-       filippo.io/edwards25519 v1.1.0 // indirect
-       fyne.io/systray v1.11.0 // indirect
-       github.com/BurntSushi/toml v1.4.0 // indirect
-       github.com/PuerkitoBio/goquery v1.10.0 // indirect
-       github.com/andybalholm/cascadia v1.3.2 // indirect
-       github.com/antchfx/htmlquery v1.3.3 // indirect
-       github.com/antchfx/xmlquery v1.4.2 // indirect
-       github.com/antchfx/xpath v1.3.2 // indirect
-       github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff // indirect
-       github.com/bytedance/sonic v1.11.6 // indirect
-       github.com/bytedance/sonic/loader v0.1.1 // indirect
-       github.com/cloudwego/base64x v0.1.4 // indirect
-       github.com/cloudwego/iasm v0.2.0 // indirect
-       github.com/coreos/go-semver v0.3.1 // indirect
-       github.com/coreos/go-systemd/v22 v22.5.0 // indirect
-       github.com/davecgh/go-spew v1.1.1 // indirect
-       github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect
-       github.com/ebitengine/purego v0.8.1 // indirect
-       github.com/felixge/httpsnoop v1.0.4 // indirect
-       github.com/fredbi/uri v1.1.0 // indirect
-       github.com/fsnotify/fsnotify v1.8.0 // indirect
-       github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934 // indirect
-       github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a // indirect
-       github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964 // indirect
-       github.com/gabriel-vasile/mimetype v1.4.3 // indirect
-       github.com/gen2brain/shm v0.1.1 // indirect
-       github.com/gin-contrib/sse v0.1.0 // indirect
-       github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect
-       github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect
-       github.com/go-logr/logr v1.4.2 // indirect
-       github.com/go-logr/stdr v1.2.2 // indirect
-       github.com/go-ole/go-ole v1.3.0 // indirect
-       github.com/go-playground/locales v0.14.1 // indirect
-       github.com/go-playground/universal-translator v0.18.1 // indirect
-       github.com/go-playground/validator/v10 v10.20.0 // indirect
-       github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
-       github.com/go-text/render v0.2.0 // indirect
-       github.com/go-text/typesetting v0.2.0 // indirect
-       github.com/gobwas/glob v0.2.3 // indirect
-       github.com/goccy/go-json v0.10.2 // indirect
-       github.com/godbus/dbus/v5 v5.1.0 // indirect
-       github.com/gogo/protobuf v1.3.2 // indirect
-       github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
-       github.com/golang/protobuf v1.5.4 // indirect
-       github.com/gomodule/redigo v2.0.0+incompatible // indirect
-       github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect
-       github.com/google/s2a-go v0.1.8 // indirect
-       github.com/google/uuid v1.6.0 // indirect
-       github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
-       github.com/googleapis/gax-go/v2 v2.13.0 // indirect
-       github.com/gopherjs/gopherjs v1.17.2 // indirect
-       github.com/gorilla/context v1.1.2 // indirect
-       github.com/gorilla/securecookie v1.1.2 // indirect
-       github.com/gorilla/sessions v1.4.0 // indirect
-       github.com/hashicorp/errwrap v1.1.0 // indirect
-       github.com/hashicorp/go-multierror v1.1.0 // indirect
-       github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 // indirect
-       github.com/jezek/xgb v1.1.1 // indirect
-       github.com/json-iterator/go v1.1.12 // indirect
-       github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
-       github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191 // indirect
-       github.com/kennygrant/sanitize v1.2.4 // indirect
-       github.com/klauspost/cpuid/v2 v2.2.7 // indirect
-       github.com/leodido/go-urn v1.4.0 // indirect
-       github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
-       github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect
-       github.com/mattn/go-isatty v0.0.20 // indirect
-       github.com/mitchellh/mapstructure v1.4.1 // indirect
-       github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
-       github.com/modern-go/reflect2 v1.0.2 // indirect
-       github.com/nicksnyder/go-i18n/v2 v2.4.1 // indirect
-       github.com/onsi/ginkgo/v2 v2.21.0 // indirect
-       github.com/otiai10/gosseract v2.2.1+incompatible // indirect
-       github.com/otiai10/mint v1.6.3 // indirect
-       github.com/pelletier/go-toml/v2 v2.2.2 // indirect
-       github.com/pion/datachannel v1.5.10 // indirect
-       github.com/pion/dtls/v2 v2.2.12 // indirect
-       github.com/pion/dtls/v3 v3.0.4 // indirect
-       github.com/pion/ice/v4 v4.0.3 // indirect
-       github.com/pion/interceptor v0.1.37 // indirect
-       github.com/pion/logging v0.2.2 // indirect
-       github.com/pion/mdns/v2 v2.0.7 // indirect
-       github.com/pion/randutil v0.1.0 // indirect
-       github.com/pion/rtp v1.8.10 // indirect
-       github.com/pion/sctp v1.8.35 // indirect
-       github.com/pion/sdp/v3 v3.0.9 // indirect
-       github.com/pion/srtp/v3 v3.0.4 // indirect
-       github.com/pion/stun/v2 v2.0.0 // indirect
-       github.com/pion/stun/v3 v3.0.0 // indirect
-       github.com/pion/transport/v2 v2.2.4 // indirect
-       github.com/pion/transport/v3 v3.0.7 // indirect
-       github.com/pion/turn/v3 v3.0.3 // indirect
-       github.com/pion/turn/v4 v4.0.0 // indirect
-       github.com/pmezard/go-difflib v1.0.0 // indirect
-       github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
-       github.com/quic-go/qpack v0.5.1 // indirect
-       github.com/robotn/xgb v0.10.0 // indirect
-       github.com/robotn/xgbutil v0.10.0 // indirect
-       github.com/rymdport/portal v0.2.6 // indirect
-       github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect
-       github.com/shirou/gopsutil/v4 v4.24.10 // indirect
-       github.com/sirupsen/logrus v1.8.1 // indirect
-       github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
-       github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
-       github.com/stretchr/testify v1.10.0 // indirect
-       github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f // indirect
-       github.com/temoto/robotstxt v1.1.2 // indirect
-       github.com/tklauser/go-sysconf v0.3.14 // indirect
-       github.com/tklauser/numcpus v0.9.0 // indirect
-       github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
-       github.com/ugorji/go/codec v1.2.12 // indirect
-       github.com/vcaesar/gops v0.40.0 // indirect
-       github.com/vcaesar/keycode v0.10.1 // indirect
-       github.com/vcaesar/tt v0.20.1 // indirect
-       github.com/wlynxg/anet v0.0.5 // indirect
-       github.com/yuin/goldmark v1.7.8 // indirect
-       github.com/yusufpapurcu/wmi v1.2.4 // indirect
-       github.com/yutopp/go-amf0 v0.1.0 // indirect
-       go.etcd.io/etcd/api/v3 v3.5.16 // indirect
-       go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect
-       go.opencensus.io v0.24.0 // indirect
-       go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect
-       go.opentelemetry.io/otel v1.31.0 // indirect
-       go.opentelemetry.io/otel/metric v1.31.0 // indirect
-       go.opentelemetry.io/otel/trace v1.31.0 // indirect
-       go.uber.org/mock v0.5.0 // indirect
-       go.uber.org/multierr v1.11.0 // indirect
-       go.uber.org/zap v1.27.0 // indirect
-       golang.org/x/arch v0.8.0 // indirect
-       golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
-       golang.org/x/image v0.21.0 // indirect
-       golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c // indirect
-       golang.org/x/mod v0.21.0 // indirect
-       golang.org/x/sync v0.9.0 // indirect
-       golang.org/x/sys v0.27.0 // indirect
-       golang.org/x/text v0.20.0 // indirect
-       golang.org/x/tools v0.26.0 // indirect
-       google.golang.org/appengine v1.6.8 // indirect
-       google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 // indirect
-       google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
-)
diff --git a/0xgo/go.sum b/0xgo/go.sum
deleted file mode 100644 (file)
index 9cbd7ff..0000000
+++ /dev/null
@@ -1,1033 +0,0 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
-cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
-cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
-cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
-cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
-cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo=
-cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
-cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk=
-cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
-cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
-filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
-fyne.io/fyne/v2 v2.5.2 h1:eSyGTmSkv10yAdAeHpDet6u2KkKxOGFc14kQu81We7Q=
-fyne.io/fyne/v2 v2.5.2/go.mod h1:26gqPDvtaxHeyct+C0BBjuGd2zwAJlPkUGSBrb+d7Ug=
-fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg=
-fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
-github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ=
-github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
-github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
-github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4=
-github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4=
-github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
-github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
-github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
-github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
-github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0=
-github.com/antchfx/htmlquery v1.3.3 h1:x6tVzrRhVNfECDaVxnZi1mEGrQg3mjE/rxbH2Pe6dNE=
-github.com/antchfx/htmlquery v1.3.3/go.mod h1:WeU3N7/rL6mb6dCwtE30dURBnBieKDC/fR8t6X+cKjU=
-github.com/antchfx/xmlquery v1.2.4/go.mod h1:KQQuESaxSlqugE2ZBcM/qn+ebIpt+d+4Xx7YcSGAIrM=
-github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA=
-github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA=
-github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
-github.com/antchfx/xpath v1.1.8/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
-github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U=
-github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
-github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
-github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff h1:RmdPFa+slIr4SCBg4st/l/vZWVe9QJKMXGO60Bxbe04=
-github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw=
-github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
-github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
-github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
-github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
-github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
-github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
-github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
-github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
-github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
-github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U=
-github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU=
-github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
-github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
-github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
-github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
-github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/fortytw2/leaktest v1.2.0 h1:cj6GCiwJDH7l3tMHLjZDo0QqPtrXJiWSI9JgpeQKw+Q=
-github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
-github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8=
-github.com/fredbi/uri v1.1.0/go.mod h1:aYTUoAXBOq7BLfVJ8GnKmfcuURosB1xyHDIfWeC/iW4=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
-github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
-github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934 h1:dZC5aKobSN07hf71oMivxUmAofFja5GrfPK2rBlttX4=
-github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934/go.mod h1:d4clgH0/GrRwWjRzJJQXxT/h1TyuNSfF/X64zb/3Ggg=
-github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a h1:ybgRdYvAHTn93HW79bLiBiJwVL4jVeyGQRZMgImoeWs=
-github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a/go.mod h1:gsGA2dotD4v0SR6PmPCYvS9JuOeMwAtmfvDE7mbYXMY=
-github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964 h1:0pTELtjlVAVGSazfwRNcqTVzqmkWb1GsNozCmmZfdZA=
-github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964/go.mod h1:J9Uunu842kOcTjzQj4Eq8XIDmF55szvT1PTS1cUb1UE=
-github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
-github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
-github.com/gen2brain/shm v0.1.1 h1:1cTVA5qcsUFixnDHl14TmRoxgfWEEZlTezpUj1vm5uQ=
-github.com/gen2brain/shm v0.1.1/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
-github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
-github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0 h1:EUFmvQ8ffefnSAmaUZd9HZYZSw9w/bFjp3FiNaJ5WmE=
-github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0/go.mod h1:iqneQ2Df3omzIVTkIfn7c1acsVnMGiSLn4XF5Blh3Yg=
-github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
-github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
-github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
-github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA=
-github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
-github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
-github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
-github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
-github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
-github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
-github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
-github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
-github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
-github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
-github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
-github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
-github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
-github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
-github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
-github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc=
-github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU=
-github.com/go-text/typesetting v0.2.0 h1:fbzsgbmk04KiWtE+c3ZD4W2nmCRzBqrqQOvYlwAOdho=
-github.com/go-text/typesetting v0.2.0/go.mod h1:2+owI/sxa73XA581LAzVuEBZ3WEEV2pXeDswCH/3i1I=
-github.com/go-text/typesetting-utils v0.0.0-20240317173224-1986cbe96c66 h1:GUrm65PQPlhFSKjLPGOZNPNxLCybjzjYBzjfoBGaDUY=
-github.com/go-text/typesetting-utils v0.0.0-20240317173224-1986cbe96c66/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o=
-github.com/go-vgo/robotgo v0.110.5 h1:F3meroJVBPvxncoHX9ZoD1Gal+pYywu1MLPcJkN5oEw=
-github.com/go-vgo/robotgo v0.110.5/go.mod h1:MzgZR4XAnlhBAe4ExLcJebisDUfbYoh3ekaP/s/XRqQ=
-github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
-github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
-github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
-github.com/gocolly/colly/v2 v2.1.0 h1:k0DuZkDoCsx51bKpRJNEmcxcp+W5N8ziuwGaSDuFoGs=
-github.com/gocolly/colly/v2 v2.1.0/go.mod h1:I2MuhsLjQ+Ex+IzK3afNS8/1qP3AedHOusRPcRdC5o0=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
-github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
-github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
-github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
-github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
-github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs=
-github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
-github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
-github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
-github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
-github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gopherjs/gopherjs v0.0.0-20211219123610-ec9572f70e60/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI=
-github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
-github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=
-github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=
-github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
-github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
-github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
-github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
-github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=
-github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=
-github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
-github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/goxjs/gl v0.0.0-20210104184919-e3fafc6f8f2a/go.mod h1:dy/f2gjY09hwVfIyATps4G2ai7/hLwLkc5TrPqONuXY=
-github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc=
-github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ=
-github.com/graphql-go/handler v0.2.4 h1:gz9q11TUHPNUpqzV8LMa+rkqM5NUuH/nkE3oF2LS3rI=
-github.com/graphql-go/handler v0.2.4/go.mod h1:gsQlb4gDvURR0bgN8vWQEh+s5vJALM2lYL3n3cf6OxQ=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
-github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
-github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
-github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
-github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=
-github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
-github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
-github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
-github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
-github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
-github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg=
-github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 h1:Po+wkNdMmN+Zj1tDsJQy7mJlPlwGNQd9JZoPjObagf8=
-github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49/go.mod h1:YiutDnxPRLk5DLUFj6Rw4pRBBURZY07GFr54NdV9mQg=
-github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4=
-github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
-github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
-github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
-github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191 h1:5UHVWNX1qrIbNw7OpKbxe5bHkhHRk3xRKztMjERuCsU=
-github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191/go.mod h1:Pmpz2BLf55auQZ67u3rvyI2vAQvNetkK/4zYUmpauZQ=
-github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
-github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
-github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
-github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
-github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
-github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
-github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
-github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
-github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
-github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
-github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
-github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
-github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
-github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
-github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
-github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
-github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
-github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
-github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
-github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
-github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
-github.com/nicksnyder/go-i18n/v2 v2.4.1 h1:zwzjtX4uYyiaU02K5Ia3zSkpJZrByARkRB4V3YPrr0g=
-github.com/nicksnyder/go-i18n/v2 v2.4.1/go.mod h1:++Pl70FR6Cki7hdzZRnEEqdc2dJt+SAGotyFg/SvZMk=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
-github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
-github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
-github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc=
-github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I=
-github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE=
-github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=
-github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
-github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
-github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
-github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M=
-github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
-github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
-github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
-github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v3 v3.0.16 h1:YoPlNg3jU1UT/DDTa9v/g1vH6A2/pAzehevI1o66H8E=
-github.com/pion/ice/v3 v3.0.16/go.mod h1:SdmubtIsCcvdb1ZInrTUz7Iaqi90/rYd1pzbzlMxsZg=
-github.com/pion/ice/v4 v4.0.3 h1:9s5rI1WKzF5DRqhJ+Id8bls/8PzM7mau0mj1WZb4IXE=
-github.com/pion/ice/v4 v4.0.3/go.mod h1:VfHy0beAZ5loDT7BmJ2LtMtC4dbawIkkkejHPRZNB3Y=
-github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
-github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
-github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
-github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
-github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM=
-github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA=
-github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
-github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
-github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
-github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU=
-github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA=
-github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg=
-github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY=
-github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M=
-github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
-github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
-github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0=
-github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ=
-github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
-github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU=
-github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
-github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo=
-github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
-github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
-github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
-github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
-github.com/pion/turn/v3 v3.0.3 h1:1e3GVk8gHZLPBA5LqadWYV60lmaKUaHCkm9DX9CkGcE=
-github.com/pion/turn/v3 v3.0.3/go.mod h1:vw0Dz420q7VYAF3J4wJKzReLHIo2LGp4ev8nXQexYsc=
-github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
-github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.7 h1:aeq78uVnFZd2umXW0O9A2VFQYuS7+BZxWetQvSp2jPo=
-github.com/pion/webrtc/v4 v4.0.7/go.mod h1:oFVBBVSHU3vAEwSgnk3BuKCwAUwpDwQhko1EDwyZWbU=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
-github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo=
-github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
-github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
-github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.48.1 h1:y/8xmfWI9qmGTc+lBr4jKRUWLGSlSigv847ULJ4hYXA=
-github.com/quic-go/quic-go v0.48.1/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs=
-github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
-github.com/robotn/xgb v0.10.0 h1:O3kFbIwtwZ3pgLbp1h5slCQ4OpY8BdwugJLrUe6GPIM=
-github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
-github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw=
-github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU=
-github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-github.com/rymdport/portal v0.2.6 h1:HWmU3gORu7vWcpr7VSwUS2Xx1HtJXVcUuTqEZcMEsIg=
-github.com/rymdport/portal v0.2.6/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4=
-github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
-github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA=
-github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM=
-github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8=
-github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
-github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
-github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
-github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
-github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE=
-github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q=
-github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ=
-github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
-github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f h1:13CyO8FO3blZH04ewuT9DDgm9V7G0CfjDzw8kLKx+s8=
-github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8=
-github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA=
-github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk=
-github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
-github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg=
-github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
-github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
-github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
-github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
-github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI=
-github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
-github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
-github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
-github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
-github.com/vcaesar/gops v0.40.0 h1:I+1RCGiV+LkZJUYNzAd373xs0uM2UyeFdZBmow8HfCM=
-github.com/vcaesar/gops v0.40.0/go.mod h1:3u/USW7JovqUK6i13VOD3qWfvXXd2TIIKE4PYIv4TOM=
-github.com/vcaesar/imgo v0.40.2 h1:5GWScRLdBCMtO1v2I1bs+ZmDLZFINxYSMZ+mtUw5qPM=
-github.com/vcaesar/imgo v0.40.2/go.mod h1:MVCl+FxHI2gTgmiHoi0n5xNCbYcfv9SVtdEOUC92+eo=
-github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw=
-github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ=
-github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4=
-github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU=
-github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
-github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic=
-github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
-github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
-github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
-github.com/yutopp/go-amf0 v0.1.0 h1:a3UeBZG7nRF0zfvmPn2iAfNo1RGzUpHz1VyJD2oGrik=
-github.com/yutopp/go-amf0 v0.1.0/go.mod h1:QzDOBr9RV6sQh6E5GFEJROZbU0iQKijORBmprkb3FIk=
-github.com/yutopp/go-flv v0.3.1 h1:4ILK6OgCJgUNm2WOjaucWM5lUHE0+sLNPdjq3L0Xtjk=
-github.com/yutopp/go-flv v0.3.1/go.mod h1:pAlHPSVRMv5aCUKmGOS/dZn/ooTgnc09qOPmiUNMubs=
-github.com/yutopp/go-rtmp v0.0.7 h1:sKKm1MVV3ANbJHZlf3Kq8ecq99y5U7XnDUDxSjuK7KU=
-github.com/yutopp/go-rtmp v0.0.7/go.mod h1:KSwrC9Xj5Kf18EUlk1g7CScecjXfIqc0J5q+S0u6Irc=
-go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0=
-go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28=
-go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q=
-go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E=
-go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
-go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE=
-go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
-go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
-go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM=
-go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
-go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
-go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
-go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
-go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
-go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
-go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
-go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
-go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
-go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
-go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
-golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
-golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
-golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
-golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
-golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s=
-golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ=
-golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c h1:zuNS/LWsEpPTLfrmBkis6Xofw3nieAqB4hYLn8+uswk=
-golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c/go.mod h1:snk1Mn2ZpdKCt90JPEsDh4sL3ReK520U2t0d7RHBnSU=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
-golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
-golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
-golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
-golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
-golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
-golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
-golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
-golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
-golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
-golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
-golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
-golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
-golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
-golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
-golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
-golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
-google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
-google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
-google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
-google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
-google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
-google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4=
-google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
-google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw=
-google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
-google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
-google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/0xgo/graphql/Makefile b/0xgo/graphql/Makefile
deleted file mode 100644 (file)
index 5f9b263..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-all:
-
-       go build -o gql.out .
\ No newline at end of file
diff --git a/0xgo/graphql/data.json b/0xgo/graphql/data.json
deleted file mode 100644 (file)
index 142e599..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-[
-    {
-        "id": 1,
-        "name" : "one",
-        "description": "number one guy",
-        "otherNames": [
-            "uno",
-            "ei",
-            "il"
-        ],
-        "imageUrl" :"none"
-    }
-]
\ No newline at end of file
diff --git a/0xgo/graphql/main.go b/0xgo/graphql/main.go
deleted file mode 100644 (file)
index b835535..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-package main
-
-import (
-       "encoding/json"
-       "fmt"
-       "os"
-
-       "net/http"
-
-       "github.com/graphql-go/graphql"
-       "github.com/graphql-go/handler"
-)
-
-func importJSONDataFromFile(fileName string, result interface{}) (isOK bool) {
-       isOK = true
-       content, err := os.ReadFile(fileName)
-       if err != nil {
-               fmt.Print("Error:", err)
-               isOK = false
-       }
-       err = json.Unmarshal(content, result)
-       if err != nil {
-               isOK = false
-               fmt.Print("Error:", err)
-       }
-       return
-}
-
-var BeastList []Beast
-var _ = importJSONDataFromFile("./data.json", &BeastList)
-
-var beastType = graphql.NewObject(graphql.ObjectConfig{
-       Name: "Beast",
-       Fields: graphql.Fields{
-               "name": &graphql.Field{
-                       Type: graphql.String,
-               },
-               "description": &graphql.Field{
-                       Type: graphql.String,
-               },
-               "id": &graphql.Field{
-                       Type: graphql.Int,
-               },
-               "otherNames": &graphql.Field{
-                       Type: graphql.NewList(graphql.String),
-               },
-               "imageUrl": &graphql.Field{
-                       Type: graphql.String,
-               },
-       },
-})
-
-var rootQuery = graphql.NewObject(graphql.ObjectConfig{
-       Name: "RootQuery",
-       Fields: graphql.Fields{
-               "beast": &graphql.Field{
-                       Type:        beastType,
-                       Description: "Get single beast",
-                       Args: graphql.FieldConfigArgument{
-                               "name": &graphql.ArgumentConfig{
-                                       Type: graphql.String,
-                               },
-                       },
-                       Resolve: func(params graphql.ResolveParams) (interface{}, error) {
-                               nameQuery, isOK := params.Args["name"].(string)
-                               if isOK {
-                                       // Search for el with name
-                                       for _, beast := range BeastList {
-                                               if beast.Name == nameQuery {
-                                                       return beast, nil
-                                               }
-                                       }
-                               }
-
-                               return Beast{}, nil
-                       },
-               },
-
-               "beastList": &graphql.Field{
-                       Type:        graphql.NewList(beastType),
-                       Description: "List of beasts",
-                       Resolve: func(p graphql.ResolveParams) (interface{}, error) {
-                               return BeastList, nil
-                       },
-               },
-       },
-})
-
-var BeastSchema, _ = graphql.NewSchema(graphql.SchemaConfig{
-       Query: rootQuery,
-})
-
-var sandboxHTML = []byte(`
-<!DOCTYPE html>
-<html lang="en">
-<body style="margin: 0; overflow-x: hidden; overflow-y: hidden">
-<div id="sandbox" style="height:100vh; width:100vw;"></div>
-<script src="https://embeddable-sandbox.cdn.apollographql.com/_latest/embeddable-sandbox.umd.production.min.js"></script>
-<script>
-new window.EmbeddedSandbox({
-  target: "#sandbox",
-  // Pass through your server href if you are embedding on an endpoint.
-  // Otherwise, you can pass whatever endpoint you want Sandbox to start up with here.
-  initialEndpoint: "http://localhost:8080/graphql",
-});
-// advanced options: https://www.apollographql.com/docs/studio/explorer/sandbox#embedding-sandbox
-</script>
-</body>
-</html>`)
-
-func main() {
-
-       h := handler.New(&handler.Config{
-               Schema:   &BeastSchema,
-               Pretty:   true,
-               GraphiQL: false,
-       })
-
-       http.Handle("/graphql", h)
-
-       http.Handle("/sandbox", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-               w.Write(sandboxHTML)
-       }))
-
-       http.ListenAndServe(":8080", nil)
-}
diff --git a/0xgo/graphql/types.go b/0xgo/graphql/types.go
deleted file mode 100644 (file)
index 9b7c3ee..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package main
-
-type Beast struct {
-       ID          int      `json:"id"`
-       Name        string   `json:"name"`
-       Description string   `json:"description"`
-       OtherNames  []string `json:"otherNames"`
-       ImageURL    string   `json:"imageUrl"`
-}
diff --git a/0xgo/grpc/Makefile b/0xgo/grpc/Makefile
deleted file mode 100644 (file)
index 9e56181..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-all:
-
-       @echo "go grpc"
-
-
-dep:
-
-       apt install -y protobuf-compiler
-
-dep-go: 
-
-       go install google.golang.org/protobuf/cmd/protoc-gen-go
-
-       go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
-
-proto:
-
-       cd chatpb && ./protoc.sh
-
-build:
-
-       go build -o server/server.out ./server 
-
-       go build -o client/client.out ./client 
-
-
-
-
-
diff --git a/0xgo/grpc/certgen.sh b/0xgo/grpc/certgen.sh
deleted file mode 100755 (executable)
index 493976f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-rm -r ./client/certs/*
-
-rm -r ./server/certs/*
-
-echo "root generating...."
-
-openssl genrsa -out ./client/certs/ca_priv.pem 4096
-
-openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
-
-openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
-
-echo "server key pair, csr generating...."
-
-openssl genrsa -out ./server/certs/server.key 4096
-
-openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
-
-openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
-
-echo "signing requests for server...."
-
-openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
-
-
-echo "done!"
\ No newline at end of file
diff --git a/0xgo/grpc/chatpb/chat.pb.go b/0xgo/grpc/chatpb/chat.pb.go
deleted file mode 100644 (file)
index 630514c..0000000
+++ /dev/null
@@ -1,551 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-//     protoc-gen-go v1.34.0
-//     protoc        v4.25.0
-// source: chat.proto
-
-package chatpb
-
-import (
-       protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-       protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-       reflect "reflect"
-       sync "sync"
-)
-
-const (
-       // Verify that this generated code is sufficiently up-to-date.
-       _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-       // Verify that runtime/protoimpl is sufficiently up-to-date.
-       _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-type HelloRequest struct {
-       state         protoimpl.MessageState
-       sizeCache     protoimpl.SizeCache
-       unknownFields protoimpl.UnknownFields
-
-       Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *HelloRequest) Reset() {
-       *x = HelloRequest{}
-       if protoimpl.UnsafeEnabled {
-               mi := &file_chat_proto_msgTypes[0]
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               ms.StoreMessageInfo(mi)
-       }
-}
-
-func (x *HelloRequest) String() string {
-       return protoimpl.X.MessageStringOf(x)
-}
-
-func (*HelloRequest) ProtoMessage() {}
-
-func (x *HelloRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_chat_proto_msgTypes[0]
-       if protoimpl.UnsafeEnabled && x != nil {
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               if ms.LoadMessageInfo() == nil {
-                       ms.StoreMessageInfo(mi)
-               }
-               return ms
-       }
-       return mi.MessageOf(x)
-}
-
-// Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead.
-func (*HelloRequest) Descriptor() ([]byte, []int) {
-       return file_chat_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *HelloRequest) GetName() string {
-       if x != nil {
-               return x.Name
-       }
-       return ""
-}
-
-type HelloReply struct {
-       state         protoimpl.MessageState
-       sizeCache     protoimpl.SizeCache
-       unknownFields protoimpl.UnknownFields
-
-       Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
-}
-
-func (x *HelloReply) Reset() {
-       *x = HelloReply{}
-       if protoimpl.UnsafeEnabled {
-               mi := &file_chat_proto_msgTypes[1]
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               ms.StoreMessageInfo(mi)
-       }
-}
-
-func (x *HelloReply) String() string {
-       return protoimpl.X.MessageStringOf(x)
-}
-
-func (*HelloReply) ProtoMessage() {}
-
-func (x *HelloReply) ProtoReflect() protoreflect.Message {
-       mi := &file_chat_proto_msgTypes[1]
-       if protoimpl.UnsafeEnabled && x != nil {
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               if ms.LoadMessageInfo() == nil {
-                       ms.StoreMessageInfo(mi)
-               }
-               return ms
-       }
-       return mi.MessageOf(x)
-}
-
-// Deprecated: Use HelloReply.ProtoReflect.Descriptor instead.
-func (*HelloReply) Descriptor() ([]byte, []int) {
-       return file_chat_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *HelloReply) GetMessage() string {
-       if x != nil {
-               return x.Message
-       }
-       return ""
-}
-
-type TalkRequest struct {
-       state         protoimpl.MessageState
-       sizeCache     protoimpl.SizeCache
-       unknownFields protoimpl.UnknownFields
-
-       Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
-}
-
-func (x *TalkRequest) Reset() {
-       *x = TalkRequest{}
-       if protoimpl.UnsafeEnabled {
-               mi := &file_chat_proto_msgTypes[2]
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               ms.StoreMessageInfo(mi)
-       }
-}
-
-func (x *TalkRequest) String() string {
-       return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TalkRequest) ProtoMessage() {}
-
-func (x *TalkRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_chat_proto_msgTypes[2]
-       if protoimpl.UnsafeEnabled && x != nil {
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               if ms.LoadMessageInfo() == nil {
-                       ms.StoreMessageInfo(mi)
-               }
-               return ms
-       }
-       return mi.MessageOf(x)
-}
-
-// Deprecated: Use TalkRequest.ProtoReflect.Descriptor instead.
-func (*TalkRequest) Descriptor() ([]byte, []int) {
-       return file_chat_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *TalkRequest) GetMessage() string {
-       if x != nil {
-               return x.Message
-       }
-       return ""
-}
-
-type TalkResponse struct {
-       state         protoimpl.MessageState
-       sizeCache     protoimpl.SizeCache
-       unknownFields protoimpl.UnknownFields
-
-       TalkContent *TalkContent `protobuf:"bytes,1,opt,name=talk_content,json=talkContent,proto3" json:"talk_content,omitempty"`
-}
-
-func (x *TalkResponse) Reset() {
-       *x = TalkResponse{}
-       if protoimpl.UnsafeEnabled {
-               mi := &file_chat_proto_msgTypes[3]
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               ms.StoreMessageInfo(mi)
-       }
-}
-
-func (x *TalkResponse) String() string {
-       return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TalkResponse) ProtoMessage() {}
-
-func (x *TalkResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_chat_proto_msgTypes[3]
-       if protoimpl.UnsafeEnabled && x != nil {
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               if ms.LoadMessageInfo() == nil {
-                       ms.StoreMessageInfo(mi)
-               }
-               return ms
-       }
-       return mi.MessageOf(x)
-}
-
-// Deprecated: Use TalkResponse.ProtoReflect.Descriptor instead.
-func (*TalkResponse) Descriptor() ([]byte, []int) {
-       return file_chat_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *TalkResponse) GetTalkContent() *TalkContent {
-       if x != nil {
-               return x.TalkContent
-       }
-       return nil
-}
-
-type TalkContent struct {
-       state         protoimpl.MessageState
-       sizeCache     protoimpl.SizeCache
-       unknownFields protoimpl.UnknownFields
-
-       Index   int64  `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
-       Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"`
-}
-
-func (x *TalkContent) Reset() {
-       *x = TalkContent{}
-       if protoimpl.UnsafeEnabled {
-               mi := &file_chat_proto_msgTypes[4]
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               ms.StoreMessageInfo(mi)
-       }
-}
-
-func (x *TalkContent) String() string {
-       return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TalkContent) ProtoMessage() {}
-
-func (x *TalkContent) ProtoReflect() protoreflect.Message {
-       mi := &file_chat_proto_msgTypes[4]
-       if protoimpl.UnsafeEnabled && x != nil {
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               if ms.LoadMessageInfo() == nil {
-                       ms.StoreMessageInfo(mi)
-               }
-               return ms
-       }
-       return mi.MessageOf(x)
-}
-
-// Deprecated: Use TalkContent.ProtoReflect.Descriptor instead.
-func (*TalkContent) Descriptor() ([]byte, []int) {
-       return file_chat_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *TalkContent) GetIndex() int64 {
-       if x != nil {
-               return x.Index
-       }
-       return 0
-}
-
-func (x *TalkContent) GetContent() string {
-       if x != nil {
-               return x.Content
-       }
-       return ""
-}
-
-type HistoryRequest struct {
-       state         protoimpl.MessageState
-       sizeCache     protoimpl.SizeCache
-       unknownFields protoimpl.UnknownFields
-
-       Index int64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
-}
-
-func (x *HistoryRequest) Reset() {
-       *x = HistoryRequest{}
-       if protoimpl.UnsafeEnabled {
-               mi := &file_chat_proto_msgTypes[5]
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               ms.StoreMessageInfo(mi)
-       }
-}
-
-func (x *HistoryRequest) String() string {
-       return protoimpl.X.MessageStringOf(x)
-}
-
-func (*HistoryRequest) ProtoMessage() {}
-
-func (x *HistoryRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_chat_proto_msgTypes[5]
-       if protoimpl.UnsafeEnabled && x != nil {
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               if ms.LoadMessageInfo() == nil {
-                       ms.StoreMessageInfo(mi)
-               }
-               return ms
-       }
-       return mi.MessageOf(x)
-}
-
-// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead.
-func (*HistoryRequest) Descriptor() ([]byte, []int) {
-       return file_chat_proto_rawDescGZIP(), []int{5}
-}
-
-func (x *HistoryRequest) GetIndex() int64 {
-       if x != nil {
-               return x.Index
-       }
-       return 0
-}
-
-type HistoryResponse struct {
-       state         protoimpl.MessageState
-       sizeCache     protoimpl.SizeCache
-       unknownFields protoimpl.UnknownFields
-
-       History []*TalkContent `protobuf:"bytes,1,rep,name=history,proto3" json:"history,omitempty"`
-}
-
-func (x *HistoryResponse) Reset() {
-       *x = HistoryResponse{}
-       if protoimpl.UnsafeEnabled {
-               mi := &file_chat_proto_msgTypes[6]
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               ms.StoreMessageInfo(mi)
-       }
-}
-
-func (x *HistoryResponse) String() string {
-       return protoimpl.X.MessageStringOf(x)
-}
-
-func (*HistoryResponse) ProtoMessage() {}
-
-func (x *HistoryResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_chat_proto_msgTypes[6]
-       if protoimpl.UnsafeEnabled && x != nil {
-               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-               if ms.LoadMessageInfo() == nil {
-                       ms.StoreMessageInfo(mi)
-               }
-               return ms
-       }
-       return mi.MessageOf(x)
-}
-
-// Deprecated: Use HistoryResponse.ProtoReflect.Descriptor instead.
-func (*HistoryResponse) Descriptor() ([]byte, []int) {
-       return file_chat_proto_rawDescGZIP(), []int{6}
-}
-
-func (x *HistoryResponse) GetHistory() []*TalkContent {
-       if x != nil {
-               return x.History
-       }
-       return nil
-}
-
-var File_chat_proto protoreflect.FileDescriptor
-
-var file_chat_proto_rawDesc = []byte{
-       0x0a, 0x0a, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x68,
-       0x61, 0x74, 0x70, 0x62, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71,
-       0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
-       0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c,
-       0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
-       0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
-       0x22, 0x27, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-       0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-       0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x46, 0x0a, 0x0c, 0x54, 0x61, 0x6c,
-       0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x74, 0x61, 0x6c,
-       0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-       0x13, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e,
-       0x74, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x74, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-       0x74, 0x22, 0x3d, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-       0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
-       0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-       0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-       0x22, 0x26, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,
-       0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28,
-       0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x40, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74,
-       0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x68,
-       0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63,
-       0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-       0x74, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x32, 0xba, 0x01, 0x0a, 0x07, 0x43,
-       0x68, 0x61, 0x74, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c,
-       0x6c, 0x6f, 0x12, 0x14, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x6c, 0x6c,
-       0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70,
-       0x62, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x37, 0x0a, 0x08,
-       0x54, 0x61, 0x6c, 0x6b, 0x54, 0x6f, 0x4d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70,
-       0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e,
-       0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
-       0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0d, 0x57, 0x68, 0x61, 0x74, 0x44, 0x69, 0x64,
-       0x59, 0x6f, 0x75, 0x53, 0x61, 0x79, 0x12, 0x16, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e,
-       0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17,
-       0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52,
-       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75,
-       0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x61, 0x6e, 0x74, 0x79, 0x77, 0x6f, 0x72, 0x6b,
-       0x2f, 0x30, 0x78, 0x67, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x70,
-       0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-       file_chat_proto_rawDescOnce sync.Once
-       file_chat_proto_rawDescData = file_chat_proto_rawDesc
-)
-
-func file_chat_proto_rawDescGZIP() []byte {
-       file_chat_proto_rawDescOnce.Do(func() {
-               file_chat_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_proto_rawDescData)
-       })
-       return file_chat_proto_rawDescData
-}
-
-var file_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
-var file_chat_proto_goTypes = []interface{}{
-       (*HelloRequest)(nil),    // 0: chatpb.HelloRequest
-       (*HelloReply)(nil),      // 1: chatpb.HelloReply
-       (*TalkRequest)(nil),     // 2: chatpb.TalkRequest
-       (*TalkResponse)(nil),    // 3: chatpb.TalkResponse
-       (*TalkContent)(nil),     // 4: chatpb.TalkContent
-       (*HistoryRequest)(nil),  // 5: chatpb.HistoryRequest
-       (*HistoryResponse)(nil), // 6: chatpb.HistoryResponse
-}
-var file_chat_proto_depIdxs = []int32{
-       4, // 0: chatpb.TalkResponse.talk_content:type_name -> chatpb.TalkContent
-       4, // 1: chatpb.HistoryResponse.history:type_name -> chatpb.TalkContent
-       0, // 2: chatpb.Chatter.SayHello:input_type -> chatpb.HelloRequest
-       2, // 3: chatpb.Chatter.TalkToMe:input_type -> chatpb.TalkRequest
-       5, // 4: chatpb.Chatter.WhatDidYouSay:input_type -> chatpb.HistoryRequest
-       1, // 5: chatpb.Chatter.SayHello:output_type -> chatpb.HelloReply
-       3, // 6: chatpb.Chatter.TalkToMe:output_type -> chatpb.TalkResponse
-       6, // 7: chatpb.Chatter.WhatDidYouSay:output_type -> chatpb.HistoryResponse
-       5, // [5:8] is the sub-list for method output_type
-       2, // [2:5] is the sub-list for method input_type
-       2, // [2:2] is the sub-list for extension type_name
-       2, // [2:2] is the sub-list for extension extendee
-       0, // [0:2] is the sub-list for field type_name
-}
-
-func init() { file_chat_proto_init() }
-func file_chat_proto_init() {
-       if File_chat_proto != nil {
-               return
-       }
-       if !protoimpl.UnsafeEnabled {
-               file_chat_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*HelloRequest); i {
-                       case 0:
-                               return &v.state
-                       case 1:
-                               return &v.sizeCache
-                       case 2:
-                               return &v.unknownFields
-                       default:
-                               return nil
-                       }
-               }
-               file_chat_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*HelloReply); i {
-                       case 0:
-                               return &v.state
-                       case 1:
-                               return &v.sizeCache
-                       case 2:
-                               return &v.unknownFields
-                       default:
-                               return nil
-                       }
-               }
-               file_chat_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*TalkRequest); i {
-                       case 0:
-                               return &v.state
-                       case 1:
-                               return &v.sizeCache
-                       case 2:
-                               return &v.unknownFields
-                       default:
-                               return nil
-                       }
-               }
-               file_chat_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*TalkResponse); i {
-                       case 0:
-                               return &v.state
-                       case 1:
-                               return &v.sizeCache
-                       case 2:
-                               return &v.unknownFields
-                       default:
-                               return nil
-                       }
-               }
-               file_chat_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*TalkContent); i {
-                       case 0:
-                               return &v.state
-                       case 1:
-                               return &v.sizeCache
-                       case 2:
-                               return &v.unknownFields
-                       default:
-                               return nil
-                       }
-               }
-               file_chat_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*HistoryRequest); i {
-                       case 0:
-                               return &v.state
-                       case 1:
-                               return &v.sizeCache
-                       case 2:
-                               return &v.unknownFields
-                       default:
-                               return nil
-                       }
-               }
-               file_chat_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*HistoryResponse); i {
-                       case 0:
-                               return &v.state
-                       case 1:
-                               return &v.sizeCache
-                       case 2:
-                               return &v.unknownFields
-                       default:
-                               return nil
-                       }
-               }
-       }
-       type x struct{}
-       out := protoimpl.TypeBuilder{
-               File: protoimpl.DescBuilder{
-                       GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-                       RawDescriptor: file_chat_proto_rawDesc,
-                       NumEnums:      0,
-                       NumMessages:   7,
-                       NumExtensions: 0,
-                       NumServices:   1,
-               },
-               GoTypes:           file_chat_proto_goTypes,
-               DependencyIndexes: file_chat_proto_depIdxs,
-               MessageInfos:      file_chat_proto_msgTypes,
-       }.Build()
-       File_chat_proto = out.File
-       file_chat_proto_rawDesc = nil
-       file_chat_proto_goTypes = nil
-       file_chat_proto_depIdxs = nil
-}
diff --git a/0xgo/grpc/chatpb/chat.proto b/0xgo/grpc/chatpb/chat.proto
deleted file mode 100644 (file)
index 67a2279..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-syntax = "proto3";
-
-option go_package = "github.com/seantywork/0xgo/grpc/chatpb";
-
-
-package chatpb;
-
-
-service Chatter {
-
-  rpc SayHello (HelloRequest) returns (HelloReply);
-
-  rpc TalkToMe (TalkRequest) returns (stream TalkResponse);
-
-  rpc WhatDidYouSay (HistoryRequest) returns (HistoryResponse);
-
-}
-
-message HelloRequest {
-  string name = 1;
-}
-
-message HelloReply {
-  string message = 1;
-}
-
-message TalkRequest {
-
-  string message = 1;
-
-}
-
-message TalkResponse {
-
-  TalkContent talk_content = 1;
-
-}
-
-
-message TalkContent{
-
-  int64 index = 1;
-  string content = 2;
-
-}
-
-message HistoryRequest {
-
-  int64 index = 1;
-
-}
-
-message HistoryResponse{
-
-  repeated TalkContent history = 1;
-
-}
-
-
diff --git a/0xgo/grpc/chatpb/chat_grpc.pb.go b/0xgo/grpc/chatpb/chat_grpc.pb.go
deleted file mode 100644 (file)
index 1335b34..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
-
-package chatpb
-
-import (
-       context "context"
-       grpc "google.golang.org/grpc"
-       codes "google.golang.org/grpc/codes"
-       status "google.golang.org/grpc/status"
-)
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-// Requires gRPC-Go v1.32.0 or later.
-const _ = grpc.SupportPackageIsVersion7
-
-// ChatterClient is the client API for Chatter service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type ChatterClient interface {
-       SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
-       TalkToMe(ctx context.Context, in *TalkRequest, opts ...grpc.CallOption) (Chatter_TalkToMeClient, error)
-       WhatDidYouSay(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error)
-}
-
-type chatterClient struct {
-       cc grpc.ClientConnInterface
-}
-
-func NewChatterClient(cc grpc.ClientConnInterface) ChatterClient {
-       return &chatterClient{cc}
-}
-
-func (c *chatterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) {
-       out := new(HelloReply)
-       err := c.cc.Invoke(ctx, "/chatpb.Chatter/SayHello", in, out, opts...)
-       if err != nil {
-               return nil, err
-       }
-       return out, nil
-}
-
-func (c *chatterClient) TalkToMe(ctx context.Context, in *TalkRequest, opts ...grpc.CallOption) (Chatter_TalkToMeClient, error) {
-       stream, err := c.cc.NewStream(ctx, &Chatter_ServiceDesc.Streams[0], "/chatpb.Chatter/TalkToMe", opts...)
-       if err != nil {
-               return nil, err
-       }
-       x := &chatterTalkToMeClient{stream}
-       if err := x.ClientStream.SendMsg(in); err != nil {
-               return nil, err
-       }
-       if err := x.ClientStream.CloseSend(); err != nil {
-               return nil, err
-       }
-       return x, nil
-}
-
-type Chatter_TalkToMeClient interface {
-       Recv() (*TalkResponse, error)
-       grpc.ClientStream
-}
-
-type chatterTalkToMeClient struct {
-       grpc.ClientStream
-}
-
-func (x *chatterTalkToMeClient) Recv() (*TalkResponse, error) {
-       m := new(TalkResponse)
-       if err := x.ClientStream.RecvMsg(m); err != nil {
-               return nil, err
-       }
-       return m, nil
-}
-
-func (c *chatterClient) WhatDidYouSay(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) {
-       out := new(HistoryResponse)
-       err := c.cc.Invoke(ctx, "/chatpb.Chatter/WhatDidYouSay", in, out, opts...)
-       if err != nil {
-               return nil, err
-       }
-       return out, nil
-}
-
-// ChatterServer is the server API for Chatter service.
-// All implementations must embed UnimplementedChatterServer
-// for forward compatibility
-type ChatterServer interface {
-       SayHello(context.Context, *HelloRequest) (*HelloReply, error)
-       TalkToMe(*TalkRequest, Chatter_TalkToMeServer) error
-       WhatDidYouSay(context.Context, *HistoryRequest) (*HistoryResponse, error)
-       mustEmbedUnimplementedChatterServer()
-}
-
-// UnimplementedChatterServer must be embedded to have forward compatible implementations.
-type UnimplementedChatterServer struct {
-}
-
-func (UnimplementedChatterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) {
-       return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
-}
-func (UnimplementedChatterServer) TalkToMe(*TalkRequest, Chatter_TalkToMeServer) error {
-       return status.Errorf(codes.Unimplemented, "method TalkToMe not implemented")
-}
-func (UnimplementedChatterServer) WhatDidYouSay(context.Context, *HistoryRequest) (*HistoryResponse, error) {
-       return nil, status.Errorf(codes.Unimplemented, "method WhatDidYouSay not implemented")
-}
-func (UnimplementedChatterServer) mustEmbedUnimplementedChatterServer() {}
-
-// UnsafeChatterServer may be embedded to opt out of forward compatibility for this service.
-// Use of this interface is not recommended, as added methods to ChatterServer will
-// result in compilation errors.
-type UnsafeChatterServer interface {
-       mustEmbedUnimplementedChatterServer()
-}
-
-func RegisterChatterServer(s grpc.ServiceRegistrar, srv ChatterServer) {
-       s.RegisterService(&Chatter_ServiceDesc, srv)
-}
-
-func _Chatter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-       in := new(HelloRequest)
-       if err := dec(in); err != nil {
-               return nil, err
-       }
-       if interceptor == nil {
-               return srv.(ChatterServer).SayHello(ctx, in)
-       }
-       info := &grpc.UnaryServerInfo{
-               Server:     srv,
-               FullMethod: "/chatpb.Chatter/SayHello",
-       }
-       handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-               return srv.(ChatterServer).SayHello(ctx, req.(*HelloRequest))
-       }
-       return interceptor(ctx, in, info, handler)
-}
-
-func _Chatter_TalkToMe_Handler(srv interface{}, stream grpc.ServerStream) error {
-       m := new(TalkRequest)
-       if err := stream.RecvMsg(m); err != nil {
-               return err
-       }
-       return srv.(ChatterServer).TalkToMe(m, &chatterTalkToMeServer{stream})
-}
-
-type Chatter_TalkToMeServer interface {
-       Send(*TalkResponse) error
-       grpc.ServerStream
-}
-
-type chatterTalkToMeServer struct {
-       grpc.ServerStream
-}
-
-func (x *chatterTalkToMeServer) Send(m *TalkResponse) error {
-       return x.ServerStream.SendMsg(m)
-}
-
-func _Chatter_WhatDidYouSay_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-       in := new(HistoryRequest)
-       if err := dec(in); err != nil {
-               return nil, err
-       }
-       if interceptor == nil {
-               return srv.(ChatterServer).WhatDidYouSay(ctx, in)
-       }
-       info := &grpc.UnaryServerInfo{
-               Server:     srv,
-               FullMethod: "/chatpb.Chatter/WhatDidYouSay",
-       }
-       handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-               return srv.(ChatterServer).WhatDidYouSay(ctx, req.(*HistoryRequest))
-       }
-       return interceptor(ctx, in, info, handler)
-}
-
-// Chatter_ServiceDesc is the grpc.ServiceDesc for Chatter service.
-// It's only intended for direct use with grpc.RegisterService,
-// and not to be introspected or modified (even as a copy)
-var Chatter_ServiceDesc = grpc.ServiceDesc{
-       ServiceName: "chatpb.Chatter",
-       HandlerType: (*ChatterServer)(nil),
-       Methods: []grpc.MethodDesc{
-               {
-                       MethodName: "SayHello",
-                       Handler:    _Chatter_SayHello_Handler,
-               },
-               {
-                       MethodName: "WhatDidYouSay",
-                       Handler:    _Chatter_WhatDidYouSay_Handler,
-               },
-       },
-       Streams: []grpc.StreamDesc{
-               {
-                       StreamName:    "TalkToMe",
-                       Handler:       _Chatter_TalkToMe_Handler,
-                       ServerStreams: true,
-               },
-       },
-       Metadata: "chat.proto",
-}
diff --git a/0xgo/grpc/chatpb/protoc.sh b/0xgo/grpc/chatpb/protoc.sh
deleted file mode 100755 (executable)
index 98dc947..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-export PATH="$PATH:$(go env GOPATH)/bin"
-
-protoc --go_out=. --go_opt=paths=source_relative \
-    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
-    ./chat.proto
\ No newline at end of file
diff --git a/0xgo/grpc/client/certs/ca.pem b/0xgo/grpc/client/certs/ca.pem
deleted file mode 100644 (file)
index bce9d76..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIE/zCCAuegAwIBAgIUfHY1zHmm3s9LbMImhCYdyb5bCwYwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MTEwNzA1NDJaFw0zNDA1MDkwNzA1
-NDJaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCmEElAsjMBtS3yHcp6j3HOU0QGfGL8j5AacRqw8mt6xAtgWqZmwDD/Bkn8
-9tYV+quRY8ZgQM2imtV78NtVQedsrNJlCnAi1krJquTEv6UMf6k91h2pEMghvP05
-Lenr6EpKPlHvpWoO6cfZa3N9cogwn5WaApQYvX9O9cGbN6dSjd/mwSddqo+LBy27
-BQEfDIieeVVc4Kcb61ZY16tYWqB9GybtaNoElZE1lsrBVJOnX2hDSKj+yoR46DgI
-BsDkofCKCUrTI4YcUOSYS1sd/JbEeRkPvwXg/2BtUR9W29vV1pYVFBmzqFiC0sbf
-9XQhy30fnQjJrGrWJA6RDVLYnSykNOoYNuLkGgm1ZlGlipwrbBz1kIP99554dXGN
-4lnXk7js7l5lEsOo/c3lDtmjYRQlmPepyD2KCEbbbkK/u3DcMnS+AKL5m2VQuwvw
-LTTDTvvXF+9yV69c6pRHh/w3JSPVh3HgMSe6dKc5S0CDunXh+cBNk9iIvKT7WKqJ
-m5NuHITVVxOWlbBH2Wl1AOjzFjiYVLMvFNRAT3Cwh6h0ewWRYxm9bdLspZsEHhQK
-Gz10f8KiK+Z9wNCRCKp1TMEsgXw7Q5jdzQNwFjaAu0uxTl4x5syCWI2zW2cPPwCg
-SLSsozxbeson2Zj5/9ZDQngrbwCq0tEZPgHZaujW7igKQfwXdwIDAQABo1MwUTAd
-BgNVHQ4EFgQUIm4H+A+/zncV06Pm4qSUetmIUBswHwYDVR0jBBgwFoAUIm4H+A+/
-zncV06Pm4qSUetmIUBswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
-AgEAJ12ZZyIvb0LQgsZuct0u54/23K0aula1B6vIZ/XxPmdb3wk87hL1D87Es2MU
-MbM/5ZXVIK9SWB4pYqP2hxJq4Pcm/4HPxUrw3Cl3lh2uMnnYikX2IfofypwOaFUY
-e5HMjO9r4AnosbxS85gVHRIcPKfQJdSEYUb/gPX9tpycWKse6FzE69p9dvh4oSBe
-LTDAkNrkn5GC4Y/RqCfbhFytytEaUG/GN9e3P1Ye9Q6mxYXgkDC51+F4/EMzR1sp
-rrR1mvP2y43JLV4WsUAhvNJfkIhd2IcKo7IYol4wYSb8HVt9h47KpTUzEIG/SS3+
-FuO/oc2Am27jKsj36IREA8gN0rQdIP8S3JQYy0Tp5+RYuk+l4p8uKzu+NCabKEh9
-ypINTKyyYRAWaQ5ns+xKuIEcIEroakL0fRvcivYBoea9Tk/P2cSYE8MBkjwfgsFp
-8AQIF5AZhXV/428orAMUYj0OvDD3mx5mBwiD/6iV8PFpp0VWMsyF6e6KRV7PXJWV
-r9GMfdMDaqg9+2Hf5ezBkvh2T50xJpc9BHoN6s5h4s+IE6nXzksc9OSXhfbSDlDZ
-G/FNuIEV4rAZv1lAa3qa+JmZKYi+Ex66IS4FyGLFHAYDfGPyJKOwrLvu6FDDzDLP
-jpkR2jP/4Duhyy0xX9UdMo3s88cuAMJG/GbaA3hjbibmw84=
------END CERTIFICATE-----
diff --git a/0xgo/grpc/client/certs/ca_priv.pem b/0xgo/grpc/client/certs/ca_priv.pem
deleted file mode 100644 (file)
index 2dd7175..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-29CM/6ulbLzZRmRhZ6iH2H+MVH/6WA==
------END PRIVATE KEY-----
diff --git a/0xgo/grpc/client/certs/ca_pub.pem b/0xgo/grpc/client/certs/ca_pub.pem
deleted file mode 100644 (file)
index 64c7019..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAphBJQLIzAbUt8h3Keo9x
-zlNEBnxi/I+QGnEasPJresQLYFqmZsAw/wZJ/PbWFfqrkWPGYEDNoprVe/DbVUHn
-bKzSZQpwItZKyarkxL+lDH+pPdYdqRDIIbz9OS3p6+hKSj5R76VqDunH2WtzfXKI
-MJ+VmgKUGL1/TvXBmzenUo3f5sEnXaqPiwctuwUBHwyInnlVXOCnG+tWWNerWFqg
-fRsm7WjaBJWRNZbKwVSTp19oQ0io/sqEeOg4CAbA5KHwiglK0yOGHFDkmEtbHfyW
-xHkZD78F4P9gbVEfVtvb1daWFRQZs6hYgtLG3/V0Ict9H50Iyaxq1iQOkQ1S2J0s
-pDTqGDbi5BoJtWZRpYqcK2wc9ZCD/feeeHVxjeJZ15O47O5eZRLDqP3N5Q7Zo2EU
-JZj3qcg9ighG225Cv7tw3DJ0vgCi+ZtlULsL8C00w0771xfvclevXOqUR4f8NyUj
-1Ydx4DEnunSnOUtAg7p14fnATZPYiLyk+1iqiZuTbhyE1VcTlpWwR9lpdQDo8xY4
-mFSzLxTUQE9wsIeodHsFkWMZvW3S7KWbBB4UChs9dH/CoivmfcDQkQiqdUzBLIF8
-O0OY3c0DcBY2gLtLsU5eMebMgliNs1tnDz8AoEi0rKM8W3rKJ9mY+f/WQ0J4K28A
-qtLRGT4B2Wro1u4oCkH8F3cCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/grpc/client/main.go b/0xgo/grpc/client/main.go
deleted file mode 100644 (file)
index dbb4648..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-package main
-
-import (
-       "context"
-       "crypto/tls"
-       "crypto/x509"
-       "flag"
-       "io"
-       "log"
-       "os"
-       "time"
-
-       pb "github.com/seantywork/0xgo/grpc/chatpb"
-       "google.golang.org/grpc"
-       "google.golang.org/grpc/credentials"
-)
-
-const (
-       defaultName = "world"
-)
-
-var (
-       addr = flag.String("addr", "localhost:50051", "the address to connect to")
-       name = flag.String("name", defaultName, "Name to greet")
-)
-
-func main() {
-       flag.Parse()
-
-       pemServerCA, err := os.ReadFile("certs/ca.pem")
-       if err != nil {
-               log.Fatalf("failed to load cert")
-       }
-
-       certPool := x509.NewCertPool()
-       if !certPool.AppendCertsFromPEM(pemServerCA) {
-               log.Fatalf("failed to add server CA's certificate")
-       }
-
-       config := &tls.Config{
-               RootCAs: certPool,
-       }
-
-       newTLSconfig := credentials.NewTLS(config)
-
-       conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(newTLSconfig))
-       if err != nil {
-               log.Fatalf("did not connect: %v", err)
-       }
-       defer conn.Close()
-       c := pb.NewChatterClient(conn)
-
-       ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
-       defer cancel()
-       r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})
-       if err != nil {
-               log.Fatalf("could not greet: %v", err)
-       }
-
-       my_id := r.GetMessage()
-
-       log.Printf("Greeting: %s", r.GetMessage())
-
-       r_stream, err := c.TalkToMe(ctx, &pb.TalkRequest{Message: my_id})
-
-       if err != nil {
-               log.Fatalf("could not get to talk to: %v", err)
-       }
-
-       done := make(chan bool)
-
-       recent_id := 0
-
-       go func() {
-               for {
-                       resp, err := r_stream.Recv()
-                       if err == io.EOF {
-                               done <- true
-                               return
-                       }
-                       if err != nil {
-                               log.Fatalf("cannot receive %v", err)
-                       }
-
-                       tc := resp.GetTalkContent()
-
-                       recent_id = int(tc.GetIndex())
-
-                       log.Printf("Resp received: %s", tc.GetContent())
-               }
-       }()
-
-       <-done
-
-       r2, err := c.WhatDidYouSay(ctx, &pb.HistoryRequest{Index: int64(recent_id)})
-
-       if err != nil {
-               log.Fatalf("could not ask: %v", err)
-       }
-
-       it_said := r2.GetHistory()
-
-       for i := 0; i < len(it_said); i++ {
-
-               at := it_said[i].GetIndex()
-
-               word := it_said[i].GetContent()
-
-               log.Printf("it said [%d]: %s", at, word)
-
-       }
-
-}
diff --git a/0xgo/grpc/server/certs/server.csr b/0xgo/grpc/server/certs/server.csr
deleted file mode 100644 (file)
index aecbae8..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAwnG8PiklMSrK05Umy6hCjGUVhpfyWPfOs2siwkYh
-0ysjZZ0sYyupzGhTmsQQDI61TVjn14H/fK6JcNCHmfMIim9JET8rhOhxUMURgNJn
-CT7TM5SYw8a/EM4Kns5GTAqfA9+LUbPCurWT3cNmJlujJFvp6mnfsZv/bjmcPddt
-F+vj/hY9RiPrj2esvmXcTPthkD+slisHmi0myeV89Nfqoekwdumzc0zPaBtPNw7o
-g+AuKL5Msxj018WFVe17MV/uabxXIWK7kA3PUdT2doX9QWji/M+vnX00bnqoG6gE
-HlfK1IgrHTXLsp0qE+RMyIhcgLSSy+L8YxuU6y0tVhI3zY4pPFPJNileetswLMlO
-2jOMndEKjk49zjTiapmGzoK4InwhfbiQlAysWoCukIcRv0AgerWoXVYZ0sECi28v
-P+ZuKallh1Yl+w0g8ZyKEb82KcN+BleexSTqEYoMXxy2Qk+q+qctzwcjosRL3VtV
-vrwdTfczyAX1FCPB2+lDrbHNBt4NYEahGNHN+yrWURMeavrfuP5/osUo55bnMetw
-PvMbQ737IaS7blogvKvKNUEgfuniQDXMmTOI/wKWSLt5kzv/FOKVjCcUqL/WJchS
-AlE/NpATAN+pZIBZkfnqxEX5ERAd6Melngyv549kExnPIiphWxhL28ae6okVabMh
-T9ECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBjyokE3Sg/SWmcHRB95xJAW7rX
-pFEatk+jC7kcChCltyqJjqsHrrv3xhLNO7oZ06uwYVgxSwVpLmEXSaIwvLdjdSQm
-oOdXAOfyJNyqbzzNf8jBOq6g8tpM6mMCOS/qGM2dvH6lUTi4Rb3Zo08ArStMyFbI
-GMh411ldy3lN2qAzascCrthtnMCqckEgs53hy8GEybb8qsqFC26GNUWFddab1lnj
-1OZv+oNXD7iw+KB99wQm57Mj6ag1mp6sCbBgQefNGF0FCTVmquubNEyo0LV0u7PT
-hVNG9dsVEoNQJiulJrLwZ0NxH/Do40Mdmmr677WWG2SL00kD/cADgA6TnXk5UeK9
-WeCec8uigp+rCHDyQV8SgsPiM92OZnFHuXGuqwuyvcSdb6oRSl0AJ0AigSmIA8m0
-1kwytUoh910wP4Bv2HIk+R8XnSxuqQzPeooV3swuiNSA0HHP2OR8mGZU4rLokgOQ
-/rX1Oznqm7Vt6YYvh1EzdnPvYDv0e3XR5LtzUGhVF9VFAx8oIJ+UFnqHeTYEVbPr
-qanZ6YCJj2F5lUYUz7ks/INVSDIOBiYnnmzOtUAbnphB9enNdhEGlcLLPpATFyhS
-sriGg+hPeBEXL8QTmO2s96mcT7A9wDR5VgF9FcdmIKZWy+oXmM0hp+TIOdT3KkkX
-YO6XW8nXYfog/hv98w==
------END CERTIFICATE REQUEST-----
diff --git a/0xgo/grpc/server/certs/server.key b/0xgo/grpc/server/certs/server.key
deleted file mode 100644 (file)
index 8e0c7d1..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-/6TjB2rKRjS0oMT76Qj95oAiG1IR
------END PRIVATE KEY-----
diff --git a/0xgo/grpc/server/certs/server.pem b/0xgo/grpc/server/certs/server.pem
deleted file mode 100644 (file)
index 0329993..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFCTCCAvGgAwIBAgIUK0kjySLAqJHUbhc5Q0upk/b6HhQwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MTEwNzA1NDRaFw0yNTA1MTEwNzA1
-NDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAMJxvD4pJTEqytOVJsuoQoxlFYaX8lj3zrNrIsJGIdMrI2WdLGMr
-qcxoU5rEEAyOtU1Y59eB/3yuiXDQh5nzCIpvSRE/K4TocVDFEYDSZwk+0zOUmMPG
-vxDOCp7ORkwKnwPfi1Gzwrq1k93DZiZboyRb6epp37Gb/245nD3XbRfr4/4WPUYj
-649nrL5l3Ez7YZA/rJYrB5otJsnlfPTX6qHpMHbps3NMz2gbTzcO6IPgLii+TLMY
-9NfFhVXtezFf7mm8VyFiu5ANz1HU9naF/UFo4vzPr519NG56qBuoBB5XytSIKx01
-y7KdKhPkTMiIXIC0ksvi/GMblOstLVYSN82OKTxTyTYpXnrbMCzJTtozjJ3RCo5O
-Pc404mqZhs6CuCJ8IX24kJQMrFqArpCHEb9AIHq1qF1WGdLBAotvLz/mbimpZYdW
-JfsNIPGcihG/NinDfgZXnsUk6hGKDF8ctkJPqvqnLc8HI6LES91bVb68HU33M8gF
-9RQjwdvpQ62xzQbeDWBGoRjRzfsq1lETHmr637j+f6LFKOeW5zHrcD7zG0O9+yGk
-u25aILyryjVBIH7p4kA1zJkziP8Clki7eZM7/xTilYwnFKi/1iXIUgJRPzaQEwDf
-qWSAWZH56sRF+REQHejHpZ4Mr+ePZBMZzyIqYVsYS9vGnuqJFWmzIU/RAgMBAAGj
-WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUKDVEnh6vH1beZ6r4
-aF2jgcXZTLUwHwYDVR0jBBgwFoAUIm4H+A+/zncV06Pm4qSUetmIUBswDQYJKoZI
-hvcNAQELBQADggIBAC6pDuSa+lUxW0cbf7Tzvo5NbB7tix4/XY6fNviSzwdpjAh+
-c9VqHoTT24j35bMx76Tlg7aGJbKKFsjk++njM3u/Digb7A95FQ/0Ly5myMpkjK8D
-TedhTx2vEPbUY+nG2Au4yRvAN0WU7vDypTYPZ0AQVRokq2zeUmP60BE7xnb6+NdL
-fJwTis4QX653S0D68aoV0w4RtiB9VhitODeEhwvsWGGqa+I20XqX3eI0KI3JkMCz
-9fJtLRKn70Gnidh1TCfvlnfmWqoSTZz5/UGEBKa7bbNXIgW1S0EZYD+D583XOA9o
-NKv8Ektw/lhwRzsfN0j1SNzPhBXX7TQt8eZCdGopw9UlXzF1+BZlQuG+MVh9JTzP
-xXW/Uo7CmPMT5jZSQsfQb0mvG5JRQQ4x+4TlmA67OxBMM8+ko9W/4TJf9yxAmRIu
-GLVS5xjgvG5yo9ckcexy/OEY9qXFWgWXn8pfbbNWW8CoL1Mk1hLICdxrUL6pyrFC
-fdHhPJcDJPFaILqSRhT77UKpm4Y29V97ikb6sIjKWj1d2Z49yZN4yjtNQFeWlkVm
-CuOFzHAHpI7SnFz9AzH1vwaM4XI+v6pTulrkXlCVt4+6GLJAXHUKBDiuFnEqqp0J
-Mkx65S017e8WFTxLcmTbcKX/w15+2pi0kiCbm2IDiTEDJFzAjUhL7OJvceGg
------END CERTIFICATE-----
diff --git a/0xgo/grpc/server/certs/server.pub b/0xgo/grpc/server/certs/server.pub
deleted file mode 100644 (file)
index 28a26b8..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwnG8PiklMSrK05Umy6hC
-jGUVhpfyWPfOs2siwkYh0ysjZZ0sYyupzGhTmsQQDI61TVjn14H/fK6JcNCHmfMI
-im9JET8rhOhxUMURgNJnCT7TM5SYw8a/EM4Kns5GTAqfA9+LUbPCurWT3cNmJluj
-JFvp6mnfsZv/bjmcPddtF+vj/hY9RiPrj2esvmXcTPthkD+slisHmi0myeV89Nfq
-oekwdumzc0zPaBtPNw7og+AuKL5Msxj018WFVe17MV/uabxXIWK7kA3PUdT2doX9
-QWji/M+vnX00bnqoG6gEHlfK1IgrHTXLsp0qE+RMyIhcgLSSy+L8YxuU6y0tVhI3
-zY4pPFPJNileetswLMlO2jOMndEKjk49zjTiapmGzoK4InwhfbiQlAysWoCukIcR
-v0AgerWoXVYZ0sECi28vP+ZuKallh1Yl+w0g8ZyKEb82KcN+BleexSTqEYoMXxy2
-Qk+q+qctzwcjosRL3VtVvrwdTfczyAX1FCPB2+lDrbHNBt4NYEahGNHN+yrWURMe
-avrfuP5/osUo55bnMetwPvMbQ737IaS7blogvKvKNUEgfuniQDXMmTOI/wKWSLt5
-kzv/FOKVjCcUqL/WJchSAlE/NpATAN+pZIBZkfnqxEX5ERAd6Melngyv549kExnP
-IiphWxhL28ae6okVabMhT9ECAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/grpc/server/main.go b/0xgo/grpc/server/main.go
deleted file mode 100644 (file)
index ebdad56..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-package main
-
-import (
-       "context"
-       "crypto/tls"
-       "flag"
-       "fmt"
-       "log"
-       "net"
-       "strconv"
-       "time"
-
-       pb "github.com/seantywork/0xgo/grpc/chatpb"
-       "google.golang.org/grpc"
-       "google.golang.org/grpc/credentials"
-)
-
-var allowed_names []string
-
-var user_idx int = 0
-
-var loop_idx int = 0
-
-var word_idx int = 0
-
-var words = []string{
-       "hello",
-       "my",
-       "name",
-       "is",
-       "test",
-       "program",
-}
-
-var history pb.HistoryResponse
-
-var (
-       port = flag.Int("port", 50051, "The server port")
-)
-
-type server struct {
-       pb.UnimplementedChatterServer
-}
-
-func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
-       log.Printf("Received: %v", in.GetName())
-
-       allowing := in.GetName() + "-" + strconv.FormatInt(int64(user_idx), 10)
-
-       user_idx += 1
-
-       allowed_names = append(allowed_names, allowing)
-
-       return &pb.HelloReply{Message: allowing}, nil
-}
-
-func (s *server) TalkToMe(in *pb.TalkRequest, srv pb.Chatter_TalkToMeServer) error {
-
-       log.Printf("Received: %v", "talk")
-
-       if len(allowed_names) == 0 {
-
-               return fmt.Errorf("no allowed user")
-       }
-
-       hit := 0
-       name := ""
-
-       for i := 0; i < len(allowed_names); i++ {
-
-               name = in.GetMessage()
-
-               if name == allowed_names[i] {
-
-                       log.Printf("found: %v", name)
-
-                       hit = 1
-
-                       break
-
-               }
-
-       }
-
-       if hit != 1 {
-
-               return fmt.Errorf("failed to retrieve user")
-
-       }
-
-       max_idx := len(words) - 1
-
-       for {
-
-               if loop_idx > max_idx {
-
-                       loop_idx = 0
-
-                       break
-
-               }
-
-               tc := pb.TalkContent{
-                       Index:   int64(word_idx),
-                       Content: words[word_idx],
-               }
-
-               history.History = append(history.History, &tc)
-
-               resp := pb.TalkResponse{
-                       TalkContent: &tc,
-               }
-
-               if err := srv.Send(&resp); err != nil {
-
-                       log.Printf("send error %v", err)
-
-               }
-
-               loop_idx += 1
-
-               word_idx += 1
-
-               time.Sleep(time.Second * 1)
-
-       }
-
-       return nil
-}
-
-func (s *server) WhatDidYouSay(ctx context.Context, in *pb.HistoryRequest) (*pb.HistoryResponse, error) {
-
-       log.Printf("Received: %v", in.GetIndex())
-
-       if len(history.History) < 3 {
-
-               null_array := []*pb.TalkContent{}
-
-               hr := pb.HistoryResponse{
-                       History: null_array,
-               }
-
-               return &hr, fmt.Errorf("not enough has been said")
-
-       }
-
-       idx_from := in.GetIndex()
-
-       i := 0
-
-       resp_array := []*pb.TalkContent{}
-
-       for {
-
-               if i > 2 {
-                       break
-               }
-
-               target_idx := int(idx_from) - i
-
-               history_el := history.History[target_idx]
-
-               resp_array = append(resp_array, history_el)
-
-               i += 1
-       }
-
-       resp := pb.HistoryResponse{
-               History: resp_array,
-       }
-
-       return &resp, nil
-}
-
-func main() {
-       flag.Parse()
-
-       serverCert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key")
-       if err != nil {
-               log.Fatalf("failed to load cert and key")
-       }
-
-       config := &tls.Config{
-               Certificates: []tls.Certificate{serverCert},
-       }
-
-       newTLSconfig := credentials.NewTLS(config)
-
-       lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
-       if err != nil {
-               log.Fatalf("failed to listen: %v", err)
-       }
-       s := grpc.NewServer(
-               grpc.Creds(newTLSconfig),
-       )
-
-       pb.RegisterChatterServer(s, &server{})
-       log.Printf("server listening at %v", lis.Addr())
-       if err := s.Serve(lis); err != nil {
-               log.Fatalf("failed to serve: %v", err)
-       }
-}
diff --git a/0xgo/gsheet/.gitignore b/0xgo/gsheet/.gitignore
deleted file mode 100644 (file)
index 1eb0597..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-config.yaml
-token.json
\ No newline at end of file
diff --git a/0xgo/gsheet/Makefile b/0xgo/gsheet/Makefile
deleted file mode 100644 (file)
index 8cc72f9..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-all:
-
-       go build -o gsheet.out .
-
-clean:
-
-       rm -r *.out
\ No newline at end of file
diff --git a/0xgo/gsheet/core/modules.go b/0xgo/gsheet/core/modules.go
deleted file mode 100644 (file)
index c3a2b61..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-package core
-
-import (
-       "context"
-       "encoding/json"
-       "fmt"
-       "log"
-       "net/http"
-       "os"
-
-       "golang.org/x/oauth2"
-       "gopkg.in/yaml.v3"
-)
-
-type GsheetConfig struct {
-       CRED_PATH string   `yaml:"CRED_PATH"`
-       SHEET_ID  string   `yaml:"SHEET_ID"`
-       SHEETS    []string `yaml:"SHEETS"`
-}
-
-func GetGsheetConfig() (GsheetConfig, error) {
-
-       var gsh_conf GsheetConfig
-
-       file_b, err := os.ReadFile("./config.yaml")
-
-       if err != nil {
-
-               return gsh_conf, fmt.Errorf("failed to read conf: %s", err.Error())
-
-       }
-
-       err = yaml.Unmarshal(file_b, &gsh_conf)
-
-       if err != nil {
-
-               return gsh_conf, fmt.Errorf("failed to read conf: %s", err.Error())
-
-       }
-
-       return gsh_conf, nil
-}
-
-func GetGsheetClient(config *oauth2.Config) (*http.Client, error) {
-
-       var http_client *http.Client
-
-       tokFile := "token.json"
-       tok, err := GetGsheetTokenFromFile(tokFile)
-       if err != nil {
-               tok, err = GetGsheetTokenFromWeb(config)
-
-               if err != nil {
-
-                       return http_client, fmt.Errorf("failed to get gsheet client: %s", err.Error())
-
-               }
-
-               SaveGsheetToken(tokFile, tok)
-       }
-
-       http_client = config.Client(context.Background(), tok)
-
-       return http_client, nil
-}
-
-func GetGsheetTokenFromWeb(config *oauth2.Config) (*oauth2.Token, error) {
-
-       var tok *oauth2.Token
-
-       authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
-
-       fmt.Printf("Go to the following link in your browser then type the "+
-               "authorization code: \n%v\n", authURL)
-
-       var authCode string
-
-       if _, err := fmt.Scan(&authCode); err != nil {
-
-               return tok, fmt.Errorf("failed to get web token: %s", err.Error())
-       }
-
-       tok, err := config.Exchange(context.TODO(), authCode)
-
-       if err != nil {
-               return tok, fmt.Errorf("unable to retrive token from web: %s", err.Error())
-       }
-
-       return tok, nil
-}
-
-func GetGsheetTokenFromFile(file string) (*oauth2.Token, error) {
-       f, err := os.Open(file)
-       if err != nil {
-               return nil, err
-       }
-       defer f.Close()
-       tok := &oauth2.Token{}
-       err = json.NewDecoder(f).Decode(tok)
-       return tok, err
-}
-
-func SaveGsheetToken(path string, token *oauth2.Token) {
-       fmt.Printf("Saving credential file to: %s\n", path)
-       f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
-       if err != nil {
-               log.Fatalf("Unable to cache oauth token: %v", err)
-       }
-       defer f.Close()
-       json.NewEncoder(f).Encode(token)
-}
diff --git a/0xgo/gsheet/main.go b/0xgo/gsheet/main.go
deleted file mode 100644 (file)
index c0c8aa1..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-package main
-
-import (
-       "context"
-       "fmt"
-       "os"
-
-       "golang.org/x/oauth2/google"
-       "google.golang.org/api/option"
-       "google.golang.org/api/sheets/v4"
-
-       gshcore "github.com/seantywork/0xgo/gsheet/core"
-)
-
-func main() {
-
-       ctx := context.Background()
-
-       gsh_conf, err := gshcore.GetGsheetConfig()
-
-       if err != nil {
-
-               fmt.Println(err.Error())
-
-               return
-
-       }
-
-       cred_path := gsh_conf.CRED_PATH
-
-       cred_b, err := os.ReadFile(cred_path)
-
-       if err != nil {
-
-               fmt.Println(err.Error())
-
-               return
-       }
-
-       client_config, err := google.ConfigFromJSON(cred_b, "https://www.googleapis.com/auth/spreadsheets.readonly")
-
-       if err != nil {
-
-               fmt.Println(err.Error())
-
-               return
-       }
-
-       client, err := gshcore.GetGsheetClient(client_config)
-
-       if err != nil {
-
-               fmt.Println(err.Error())
-
-               return
-
-       }
-
-       srv, err := sheets.NewService(ctx, option.WithHTTPClient(client))
-
-       if err != nil {
-
-               fmt.Println(err.Error())
-
-               return
-
-       }
-
-       sheet_id := gsh_conf.SHEET_ID
-
-       sheets_len := len(gsh_conf.SHEETS)
-
-       for i := 0; i < sheets_len; i++ {
-
-               target_sheet := gsh_conf.SHEETS[i]
-
-               resp, err := srv.Spreadsheets.Values.Get(sheet_id, target_sheet).Do()
-
-               if err != nil {
-
-                       fmt.Printf("failed to get values from: %s: %s\n", target_sheet, err.Error())
-
-                       return
-
-               }
-
-               if len(resp.Values) == 0 {
-
-                       fmt.Printf("no data found for: %s\n", target_sheet)
-
-               } else {
-
-                       for _, row := range resp.Values {
-
-                               col_len := len(row)
-
-                               for j := 0; j < col_len; j++ {
-
-                                       fmt.Printf("%s ", row[j])
-
-                               }
-
-                               fmt.Printf("\n")
-
-                       }
-               }
-
-       }
-
-}
diff --git a/0xgo/gui/main.go b/0xgo/gui/main.go
deleted file mode 100644 (file)
index 7dc372a..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-package main
-
-import (
-       "fyne.io/fyne/v2/app"
-       "fyne.io/fyne/v2/container"
-       "fyne.io/fyne/v2/widget"
-)
-
-func main() {
-       a := app.New()
-       w := a.NewWindow("Hello")
-
-       hello := widget.NewLabel("Hello Fyne!")
-       w.SetContent(container.NewVBox(
-               hello,
-               widget.NewButton("Hi!", func() {
-                       hello.SetText("Welcome :)")
-               }),
-       ))
-
-       w.ShowAndRun()
-}
diff --git a/0xgo/http/Makefile b/0xgo/http/Makefile
deleted file mode 100644 (file)
index 804008c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-all:
-
-       go build -o client/client.out ./client
-
-       go build -o server/server.out ./server
-
-
-
-
diff --git a/0xgo/http/certgen.sh b/0xgo/http/certgen.sh
deleted file mode 100755 (executable)
index bdb69b5..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-
-rm -r ./client/certs/*
-
-rm -r ./server/certs/*
-
-
-mkdir -p ./client/certs
-
-mkdir -p ./server/certs
-
-echo "root generating...."
-
-openssl genrsa -out ./client/certs/ca_priv.pem 4096
-
-openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
-
-openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
-
-echo "server key pair, csr generating...."
-
-openssl genrsa -out ./server/certs/server.key 4096
-
-openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
-
-openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
-
-echo "signing requests for server...."
-
-openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
-
-
-echo "done!"
\ No newline at end of file
diff --git a/0xgo/http/client/certs/ca.pem b/0xgo/http/client/certs/ca.pem
deleted file mode 100644 (file)
index 4468555..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIE/zCCAuegAwIBAgIUTe8SZnDGd5n9bMbehALXP2GGBeEwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODM2NThaFw0zNDEwMzEwODM2
-NThaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQDTv+CZXgDHH7Vh9wqa63EwW7suKDOaKsL94Hcf6wu2LccF5mlouuWbB2U1
-Ji1SoFrsZ1apqR5x/1xk99UN5vagP8zJSvAIRok46xbab+Ci2L7CbKofENm9VhS5
-qAZuGb824pcoKCsywoectrGRrGvL+2dCJvmvSTimqz+/Pb8b5ur22y9zze3l67RB
-ggkQZTFKL8URNP1LJWosnI5h6l8+3tAa78Bm6lLVmb3A6eP/DP1f8A7A5iO7z/EP
-qoCPP5yf3/9+nWhZIJEEO5CKQFiRdo/RSAaGK+eY0tfvT5hFq89PIR6PHvggAwgB
-sTpBFeuSuEgdcTQ7v6yChB3t+0jh1YtiuSmjOQ+4Uix8TYlGMf0vaIVPKzUEFYB9
-BYLXWN9BvQmyMLeqxOXgGvGUmUtXKfesQZIJ1ro8jl0h+Isjv61dQGgs01DDvBV8
-pKzs+vB0tcHP6+V7XSu98SCdM6i4w2aerXZO7KVfj3gRpb+IRcvGXvK0j2al4h23
-HTf2lVNBKHIQYPSZAr+wKo4oLJqWrVKdI34qB0GBprz8bYTxWM7UZJtu6MnJhyFT
-O0fS6hbD266HyrQILpURRmc/8AL+I/U5oVAK1U+6ViGKNcyqpN/d6rwNYFyKLnab
-T5VcsyLFPoutizjGo4wFTab83ddkwLOR14TdLP+Xq0d0DZ6w6QIDAQABo1MwUTAd
-BgNVHQ4EFgQUCI7gGU1vOV0ENPD/eujH47lzH6kwHwYDVR0jBBgwFoAUCI7gGU1v
-OV0ENPD/eujH47lzH6kwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
-AgEAnF2DWc+A6P85ND6T4yqQ6Xr+S5qTYl2d5AUKDaU1IEg6z6eMUxnu5DZRukD5
-HLSUJa13qRR935oth/EG+r78td3BFmbS9eMjlp+FA3Bkh9PIxtfj0IaUoitiSV1c
-kg6FGE7XYfSYh6TkCK5WN8fJ0Qtr40PyI2Uz9UfMIbMEtGtsJZ5enG5H6IGp5cCo
-5+pKRwdMBObeiceh28nloiktJJQrIbOWF/SaiL5U2+zmeEpNO0w041BwObBttBE7
-lB1MtgSsPuDgKjOVrWOjYTWg7eA5arZ1Ush8p8POYtJiWV5mmOK/ancKjvj05Ouv
-HTZvfDNBpMWG7DsMgJINvuqLXSbBfDk5UGw8VCdhtqW/3wuR9Wspt6eIgxst/JPD
-pXP3ddxJ3xeNE3cujZTQWASNIcXRbEU0AF/leqydOdtDWLQCI4jWKpGx+ZtZ3c96
-8uJwmI3V8ILZF75H1z3JyCqdmFHHQw+n3Q6CFMqOFXucKsHK8aEH8h48yMhS90wN
-VXJ9pbI2TYi5bBn+XmImcRv0kd7mASF/1n9s1hK5r/dNHbEhyCNNl8kBnIoQak4g
-EcLIma7XPZJg4g00JnR+w8Zx4YG5oeNIFii+OxCHwNSWYYNE/mHrzeJvGi2NQuHW
-vIVlZgebDgPxkxd+jvcnxMm6Dn9TOqWHiTUiPxkQu05rgXg=
------END CERTIFICATE-----
diff --git a/0xgo/http/client/certs/ca_priv.pem b/0xgo/http/client/certs/ca_priv.pem
deleted file mode 100644 (file)
index ad15298..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-22FUN0cT9cuPJkirjHxJ6UA+whMp
------END PRIVATE KEY-----
diff --git a/0xgo/http/client/certs/ca_pub.pem b/0xgo/http/client/certs/ca_pub.pem
deleted file mode 100644 (file)
index 0027ba9..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA07/gmV4Axx+1YfcKmutx
-MFu7LigzmirC/eB3H+sLti3HBeZpaLrlmwdlNSYtUqBa7GdWqakecf9cZPfVDeb2
-oD/MyUrwCEaJOOsW2m/goti+wmyqHxDZvVYUuagGbhm/NuKXKCgrMsKHnLaxkaxr
-y/tnQib5r0k4pqs/vz2/G+bq9tsvc83t5eu0QYIJEGUxSi/FETT9SyVqLJyOYepf
-Pt7QGu/AZupS1Zm9wOnj/wz9X/AOwOYju8/xD6qAjz+cn9//fp1oWSCRBDuQikBY
-kXaP0UgGhivnmNLX70+YRavPTyEejx74IAMIAbE6QRXrkrhIHXE0O7+sgoQd7ftI
-4dWLYrkpozkPuFIsfE2JRjH9L2iFTys1BBWAfQWC11jfQb0JsjC3qsTl4BrxlJlL
-Vyn3rEGSCda6PI5dIfiLI7+tXUBoLNNQw7wVfKSs7PrwdLXBz+vle10rvfEgnTOo
-uMNmnq12TuylX494EaW/iEXLxl7ytI9mpeIdtx039pVTQShyEGD0mQK/sCqOKCya
-lq1SnSN+KgdBgaa8/G2E8VjO1GSbbujJyYchUztH0uoWw9uuh8q0CC6VEUZnP/AC
-/iP1OaFQCtVPulYhijXMqqTf3eq8DWBcii52m0+VXLMixT6LrYs4xqOMBU2m/N3X
-ZMCzkdeE3Sz/l6tHdA2esOkCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/http/client/main.go b/0xgo/http/client/main.go
deleted file mode 100644 (file)
index 0590ec3..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-package main
-
-import (
-       "bytes"
-       "crypto/tls"
-       "crypto/x509"
-       "encoding/json"
-       "log"
-       "net/http"
-       "os"
-)
-
-type CommJSON struct {
-       Data string `json:"data"`
-}
-
-func main() {
-
-       certpool := x509.NewCertPool()
-
-       file_b, err := os.ReadFile("certs/ca.pem")
-
-       certpool.AppendCertsFromPEM(file_b)
-
-       tlsConfig := &tls.Config{
-               RootCAs: certpool,
-       }
-
-       transport := &http.Transport{TLSClientConfig: tlsConfig}
-       client := &http.Client{Transport: transport}
-
-       req := CommJSON{
-               Data: "hello",
-       }
-
-       respjson := CommJSON{}
-
-       jb, err := json.Marshal(req)
-
-       if err != nil {
-               log.Println(err)
-               return
-       }
-
-       r, err := http.NewRequest("POST", "https://localhost:8888/hello", bytes.NewBuffer(jb))
-
-       if err != nil {
-               log.Println(err)
-               return
-       }
-
-       r.Header.Add("Content-Type", "application/json")
-
-       resp, err := client.Do(r)
-
-       if err != nil {
-               log.Println(err)
-               return
-       }
-       defer resp.Body.Close()
-
-       log.Printf("is HTTP 1: %v (%s)\n\n", resp.ProtoAtLeast(1, 0), resp.Proto)
-
-       derr := json.NewDecoder(resp.Body).Decode(&respjson)
-
-       if derr != nil {
-               log.Println(err)
-               return
-
-       }
-
-       log.Printf("server data: %s\n", respjson.Data)
-
-}
diff --git a/0xgo/http/server/certs/server.csr b/0xgo/http/server/certs/server.csr
deleted file mode 100644 (file)
index 6ddb8f2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAp+OQE6FCz+k0KXJEsVFQA9Y1FbEGElToEt033eTv
-dlQEnllvFTLItpDHWQ23mCv2I7y44znjxdFt0/x1pEu9eRGMDJFu04Xzk7Btb8Q7
-gX4f1/oJx020rfK8eFfNmZe9nx7FEQl9yJq/ujNof03dKvGe2riOmcbQtLl46MDY
-RTlAemUyDXe3BC0Nmf/lbIc/auDVGj0F6Dv/qfPaO3NNgztjvN6o+C3sjl/GLSkM
-5hPyVbkdA7O8fZEdJCbRiNIHLsURnOGwCZTjAkm5BdhwX8tlWlZcAiW29lKAr9MF
-zOGDTxK/uI+W3iRczF2deYJ4BrQeC0QQ6Nj7CGlHgJnLW2SNWC1mDL0qqC/UlOle
-YjYkTIw1/3ZIEEC4yp6wh39l2RjYnPU5ziEq5elcwaJN5ftcECCPHp2pZYSnLyuq
-CsGRzU8hs0dCk36bjtRESVBLa3pQGb9ifU42lwqszDrune+AIhz6TyglXA5YN1az
-WEpg/OHxPSOFWmZY2EFGj0+1ocLy1jabaR0Dcft+/Z8EDIR2qkDu/Y/b/C5u1kM6
-EU5pKXS3dlWOku7XOxnIdKIOTwu83LzoCAnhfgA2p5W7ON77gOPrVIE+Bb5KwDR7
-FK4nEHzlXc5Uv4Wog2ZscMOzKI9KVo/cywB8qGPRlXklbFR0RPzUNMFoOgAJ0/EJ
-w+MCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBN7eYXm1UbAP4poWU3z6GxBZKY
-yhFu2QBky1ONenyDk6mvZHmQItzSycx/bpV0MwRdyH/w4FriVJcuuEm5DiLYyvEm
-nIdxb/4zl728ZLQg/9o+mR9gN/wE8nSHg0B2reB5/aeDcRxGi3x9eBXyblG56nuO
-Gte5jsCn0vqjLbbTNAQakk/YKzekpME1fMbEKxd4xP9r3rlK0ZFd9hs7WRld3zWX
-pG+bw+U5MS/IPfm4Rar/l0eGc7D5H2hpzuJCClukdFWvn1Vco3c1Owv4JYGG6lJs
-JS2hy2yNFBzJlhXyF1v51TDCLVisyEPm8lkRfMx5EUFPesbmd2t5VIw9A88gnUIK
-b8Wn+kmV1TkCdOswwPC5IbUrKejyrCn4a49pXPfdpXyI0uhwkrWoUz91EZgUnqcO
-UMdvxjZuWXx25I+rhMFeR4qHLyMfm5vbnS0+HwTLNuy2qpd5xIUCwtCVOgcUONez
-5Ax/HMmPUdpCCpKaDRjp/xl8B76eY5ex/YSCCeKaKy42vZ0qoUvXKM6fsg7HRQHr
-p551Gv+xIv2ikdbg/p2xLGQPAsVVRLeBhcTvQJokgPNsY/RcaSy5cprSE7ux0Rpd
-VDuPPLSM5fe3pfGBUXxbCNsULdAL6bLQcrwe1OCV9GMZ7sVdmvgFoDtGT1yc34tF
-xa7gfed6079H5p6Bfg==
------END CERTIFICATE REQUEST-----
diff --git a/0xgo/http/server/certs/server.key b/0xgo/http/server/certs/server.key
deleted file mode 100644 (file)
index c2eb360..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-GnWPPl7p4Kc8fCTK1vZnmhI4kAK+Lw==
------END PRIVATE KEY-----
diff --git a/0xgo/http/server/certs/server.pem b/0xgo/http/server/certs/server.pem
deleted file mode 100644 (file)
index d5ba7bc..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFCTCCAvGgAwIBAgIUKXjjSj2aCl9FGUjbp8HZlPjABAswDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODM3MDBaFw0yNTExMDIwODM3
-MDBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAKfjkBOhQs/pNClyRLFRUAPWNRWxBhJU6BLdN93k73ZUBJ5ZbxUy
-yLaQx1kNt5gr9iO8uOM548XRbdP8daRLvXkRjAyRbtOF85OwbW/EO4F+H9f6CcdN
-tK3yvHhXzZmXvZ8exREJfciav7ozaH9N3Srxntq4jpnG0LS5eOjA2EU5QHplMg13
-twQtDZn/5WyHP2rg1Ro9Beg7/6nz2jtzTYM7Y7zeqPgt7I5fxi0pDOYT8lW5HQOz
-vH2RHSQm0YjSBy7FEZzhsAmU4wJJuQXYcF/LZVpWXAIltvZSgK/TBczhg08Sv7iP
-lt4kXMxdnXmCeAa0HgtEEOjY+whpR4CZy1tkjVgtZgy9Kqgv1JTpXmI2JEyMNf92
-SBBAuMqesId/ZdkY2Jz1Oc4hKuXpXMGiTeX7XBAgjx6dqWWEpy8rqgrBkc1PIbNH
-QpN+m47URElQS2t6UBm/Yn1ONpcKrMw67p3vgCIc+k8oJVwOWDdWs1hKYPzh8T0j
-hVpmWNhBRo9PtaHC8tY2m2kdA3H7fv2fBAyEdqpA7v2P2/wubtZDOhFOaSl0t3ZV
-jpLu1zsZyHSiDk8LvNy86AgJ4X4ANqeVuzje+4Dj61SBPgW+SsA0exSuJxB85V3O
-VL+FqINmbHDDsyiPSlaP3MsAfKhj0ZV5JWxUdET81DTBaDoACdPxCcPjAgMBAAGj
-WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUJUhYdx2t7K6kqubV
-e4Ls3gzjbecwHwYDVR0jBBgwFoAUCI7gGU1vOV0ENPD/eujH47lzH6kwDQYJKoZI
-hvcNAQELBQADggIBAIzZatOoI8fvzRiqOEQp+wJ2nErevSbNijJZta0aWOAWNuaj
-cikA4nlRCKbUiIlo1iIBUwf6VE2nSNHn7Z5Cbe4UMcAKBYbGe/eUWj4UOYAsrGfT
-Ueg6Tr9sfVZ2ipllX576RNHXkBM/z2whOmdVbDslIe0Z/4bQ0RKbj+V/qq5N2GQ3
-6mjDWsuuHgv0aGoOUYIe3NU5oB51ZPQySUFr7uk6Qkd+oz/3OID+RYOivuIk8u1Q
-fryGdEwjmhPDHwX1w7ibUlzfiJpV65u7Iv9qg4e3clvPy7CLUqzOb0m+zpefYwb8
-ED+Gm4SKRDJZb8Uu4gNvKIZwyWtuPhVla97xdviOxI/uyY+1rNQqr5/bQHVGjr6M
-iop1D3aEL+DWFqoZ5FM2lPx3ced/b4qHKA6uFk0/U4NusmMEWWhE6djfmTupWx+H
-nntYCyDk2y7qxMLI6Ft3LeQCbrfcM0e7XT9dfbIHM4R/cGrUOfCChoKlnsvt8SaJ
-6ZYO0qH90VLdJ3m4dYD3wZqYRUwgqQaYkJlpeGsrDMaiqJwK/OIARhbckRsBamop
-JOILc0T1TzAuQIUFdjFTdefzVymwcI6uOVcEui1OF7WMzS8A35MKEXKRqhXtNTX0
-8RRFNwRKcufvd1SAvWR/MWCAN6U19vcz/I4JmkMv6oj9uFE5A9cMswRAnJDV
------END CERTIFICATE-----
diff --git a/0xgo/http/server/certs/server.pub b/0xgo/http/server/certs/server.pub
deleted file mode 100644 (file)
index e0c2b96..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp+OQE6FCz+k0KXJEsVFQ
-A9Y1FbEGElToEt033eTvdlQEnllvFTLItpDHWQ23mCv2I7y44znjxdFt0/x1pEu9
-eRGMDJFu04Xzk7Btb8Q7gX4f1/oJx020rfK8eFfNmZe9nx7FEQl9yJq/ujNof03d
-KvGe2riOmcbQtLl46MDYRTlAemUyDXe3BC0Nmf/lbIc/auDVGj0F6Dv/qfPaO3NN
-gztjvN6o+C3sjl/GLSkM5hPyVbkdA7O8fZEdJCbRiNIHLsURnOGwCZTjAkm5Bdhw
-X8tlWlZcAiW29lKAr9MFzOGDTxK/uI+W3iRczF2deYJ4BrQeC0QQ6Nj7CGlHgJnL
-W2SNWC1mDL0qqC/UlOleYjYkTIw1/3ZIEEC4yp6wh39l2RjYnPU5ziEq5elcwaJN
-5ftcECCPHp2pZYSnLyuqCsGRzU8hs0dCk36bjtRESVBLa3pQGb9ifU42lwqszDru
-ne+AIhz6TyglXA5YN1azWEpg/OHxPSOFWmZY2EFGj0+1ocLy1jabaR0Dcft+/Z8E
-DIR2qkDu/Y/b/C5u1kM6EU5pKXS3dlWOku7XOxnIdKIOTwu83LzoCAnhfgA2p5W7
-ON77gOPrVIE+Bb5KwDR7FK4nEHzlXc5Uv4Wog2ZscMOzKI9KVo/cywB8qGPRlXkl
-bFR0RPzUNMFoOgAJ0/EJw+MCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/http/server/main.go b/0xgo/http/server/main.go
deleted file mode 100644 (file)
index 31a047f..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-package main
-
-import (
-       "log"
-       "net/http"
-
-       "github.com/gin-gonic/contrib/sessions"
-       "github.com/gin-gonic/gin"
-)
-
-type CommJSON struct {
-       Data string `json:"data"`
-}
-
-func handlePostHello(c *gin.Context) {
-
-       req := CommJSON{}
-       resp := CommJSON{}
-
-       if err := c.BindJSON(&req); err != nil {
-
-               log.Printf("failed to bind json: %s\n", err.Error())
-
-               c.JSON(http.StatusBadRequest, resp)
-
-               return
-       }
-
-       resp.Data = req.Data
-
-       c.JSON(http.StatusOK, resp)
-
-}
-
-func createServer() *gin.Engine {
-
-       genserver := gin.Default()
-
-       store := sessions.NewCookieStore([]byte("SOLIAGAIN"))
-
-       genserver.Use(sessions.Sessions("SOLIAGAIN", store))
-
-       //      genserver.LoadHTMLGlob("view/**/*")
-
-       //      genserver.Static("/public", "./public")
-
-       genserver.POST("/hello", handlePostHello)
-
-       return genserver
-
-}
-
-func main() {
-
-       e := createServer()
-
-       e.RunTLS("0.0.0.0:8888", "certs/server.pem", "certs/server.key")
-
-}
diff --git a/0xgo/http2/Makefile b/0xgo/http2/Makefile
deleted file mode 100644 (file)
index 804008c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-all:
-
-       go build -o client/client.out ./client
-
-       go build -o server/server.out ./server
-
-
-
-
diff --git a/0xgo/http2/certgen.sh b/0xgo/http2/certgen.sh
deleted file mode 100755 (executable)
index 81dd186..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-
-rm -r ./client/certs/*
-
-rm -r ./server/certs/*
-
-mkdir -p ./client/certs
-
-mkdir -p ./server/certs
-
-echo "root generating...."
-
-openssl genrsa -out ./client/certs/ca_priv.pem 4096
-
-openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
-
-openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
-
-echo "server key pair, csr generating...."
-
-openssl genrsa -out ./server/certs/server.key 4096
-
-openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
-
-openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
-
-echo "signing requests for server...."
-
-openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
-
-
-echo "done!"
\ No newline at end of file
diff --git a/0xgo/http2/client/certs/ca.pem b/0xgo/http2/client/certs/ca.pem
deleted file mode 100644 (file)
index 6d56e87..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIE/zCCAuegAwIBAgIUMm3y7oQMKrW33ouncVunNZJAqGUwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwNzQxNDFaFw0zNDEwMzEwNzQx
-NDFaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCnQRtxoldMAoPUKy1JbSX1r3FGTs9nLKidsl8vpFKplWpCvjLRYCAfFlhY
-hltMAEYihnsPWJBEqp/UKHMATJeLY/d0iiEdJIntc5O3HGnXgbaH0wB6dvJRpwxR
-sW8b4f9cHguQbbNqCk84ZTnX3xPajzAdUlt6eQwGwwI3OIfUJqXPO6X5AuZQlNt/
-stG6ZVCXj8/H0/u5SiEfTT2uW3DKmugoswy9fgNguIFWTOstz1RrW6Oxe0CinAtw
-f40VsBG4bwhWlGFHOdVGLBHe/FVv4LFQo9C5pn05H4gxRa/Oly+G0v2+fHwbK/vb
-6B2Evxn0IODT6wL+owujdvxztd9f0OjBAiA/0+6wc9AyOvdiOfmqXGoM8vADU1RF
-ZFx8ZWCAHs5jbglzvwWzHHyc0y9jijc2y72aEl1jWDJTPXGRQpYD95cgyOlVHnx/
-qSzLpGZmnls40JPUP5fCcyj+mXIV+KF5JO4HV2fTvFme5xZJCjujbXTAn24ELtkN
-LTiyx9iOZkXYEa1I+Pvjiv5sNgI8tNwpZAKSgwQJ1Le4eqPzP0YSLrfDbNJdnGFQ
-PAZGXzCk3JARM8PPo+/s8T+i0kGMwee2p5rI5593joKTLM6lLO3ou+R34CAFe9Ae
-OOkHjWQ93JiONo5EgHCes8RBgzfRn8rmOVRxB0FnxrqvS1tSmwIDAQABo1MwUTAd
-BgNVHQ4EFgQUgoQLRoUoITdNuR2EcO1+gCnNHrwwHwYDVR0jBBgwFoAUgoQLRoUo
-ITdNuR2EcO1+gCnNHrwwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
-AgEAFaZv4LRlap5v8chyeme3MOEZh+SexQPcD/E5ZLuYxTT5fDa6oSDz1Sa8zyYj
-g5bqOqoGOvUjpY2stdZyQKJOGSLQk+Qs2atAPSz1n+MuyAVh/IgEk13/kA9R6dXc
-IBTDDAZT2zwGFfz0K2cL1NlD4KZlC+POhYNWQfaR7vk3hjt3d7kbq2wBPkenVNVu
-HA05vYpVhoZ/bZDwR7V5hwDOR6JvPLoe48gBE7AV3F+ZWEnv/E2qum0pTWpmIy0k
-wIXES0g4ItVIlHj+BZF8rWPFW155S8yHHCvNw7FY9VJFfoG6JnZokxkUQR/M6L4w
-dIrkcmdfL7QPXMecWiX6sFV6MHP/5ulNYi05jwbi+F0yrUIi2m/AmMyFp8LO5jbW
-5uGL+9JDuVLFmrdOO9s5zv5upCKwPeZ1XVMlK5w/uS7uJ5+CfrjFooTv/+4RRrvS
-udKRwvXz2Q25yo5GiwgSBQCKI56DIlmUyHI9WcxjBvG91Kpj6jkRgcHbtJrDMc+f
-LaQEOoSvZQbi0YUP72YDYCspijlJ8QR4g/MM+HNOetOwTNTRlb7wsTURzWDn6VVo
-1ZyJS/a9Snd8f24fUXSlpajTbTa+Ya/A7Qzkgk4Ck+CSwCWzyT2EXMQerljdMyhc
-6sheDhGn9f5X038dyaewL0in36QhNqKxEwon4TO9VWV5ll4=
------END CERTIFICATE-----
diff --git a/0xgo/http2/client/certs/ca_priv.pem b/0xgo/http2/client/certs/ca_priv.pem
deleted file mode 100644 (file)
index d0dc859..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-lIYAoKcwoRG7WlexQm7SRnHWMGGW9Q==
------END PRIVATE KEY-----
diff --git a/0xgo/http2/client/certs/ca_pub.pem b/0xgo/http2/client/certs/ca_pub.pem
deleted file mode 100644 (file)
index 13b36e2..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp0EbcaJXTAKD1CstSW0l
-9a9xRk7PZyyonbJfL6RSqZVqQr4y0WAgHxZYWIZbTABGIoZ7D1iQRKqf1ChzAEyX
-i2P3dIohHSSJ7XOTtxxp14G2h9MAenbyUacMUbFvG+H/XB4LkG2zagpPOGU5198T
-2o8wHVJbenkMBsMCNziH1Calzzul+QLmUJTbf7LRumVQl4/Px9P7uUohH009rltw
-yproKLMMvX4DYLiBVkzrLc9Ua1ujsXtAopwLcH+NFbARuG8IVpRhRznVRiwR3vxV
-b+CxUKPQuaZ9OR+IMUWvzpcvhtL9vnx8Gyv72+gdhL8Z9CDg0+sC/qMLo3b8c7Xf
-X9DowQIgP9PusHPQMjr3Yjn5qlxqDPLwA1NURWRcfGVggB7OY24Jc78Fsxx8nNMv
-Y4o3Nsu9mhJdY1gyUz1xkUKWA/eXIMjpVR58f6ksy6RmZp5bONCT1D+XwnMo/ply
-FfiheSTuB1dn07xZnucWSQo7o210wJ9uBC7ZDS04ssfYjmZF2BGtSPj744r+bDYC
-PLTcKWQCkoMECdS3uHqj8z9GEi63w2zSXZxhUDwGRl8wpNyQETPDz6Pv7PE/otJB
-jMHntqeayOefd46CkyzOpSzt6Lvkd+AgBXvQHjjpB41kPdyYjjaORIBwnrPEQYM3
-0Z/K5jlUcQdBZ8a6r0tbUpsCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/http2/client/main.go b/0xgo/http2/client/main.go
deleted file mode 100644 (file)
index 402a613..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-package main
-
-import (
-       "crypto/tls"
-       "crypto/x509"
-       "fmt"
-       "io"
-       "log"
-       "net/http"
-       "os"
-
-       "golang.org/x/net/http2"
-)
-
-func main() {
-
-       certpool := x509.NewCertPool()
-
-       file_b, err := os.ReadFile("certs/ca.pem")
-
-       certpool.AppendCertsFromPEM(file_b)
-
-       tlsConfig := &tls.Config{
-               RootCAs: certpool,
-       }
-
-       transport := &http2.Transport{TLSClientConfig: tlsConfig}
-       client := &http.Client{Transport: transport}
-
-       resp, err := client.Get("https://localhost:8888/hello")
-
-       if err != nil {
-               log.Println(err)
-               return
-       }
-       defer resp.Body.Close()
-
-       fmt.Printf("is HTTP2: %v (%s)\n\n", resp.ProtoAtLeast(2, 0), resp.Proto)
-
-       io.Copy(os.Stdout, resp.Body)
-}
diff --git a/0xgo/http2/server/certs/server.csr b/0xgo/http2/server/certs/server.csr
deleted file mode 100644 (file)
index a8ff909..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAoxI3a2Syb8E0WC9zzUv60l4QTOtec1ilSs6vaVGz
-iLZJSdw8F8w0P3LGyw0T+8Hxsb8cySxXX/2BxfaUCldGhrhQmHcpj7uGodZ0SMQU
-n228xLFxvTjnjrL1mKIAN9o2rJyouwcTFiTpJ4nPowqtxzEaN1GdnxLjjigG9hAE
-k8d1O8WG4JMl3G3CepxV38QXacjMQueW0gpzerd6ShH29Ql/NV79cHEFzoWJX831
-EdhKVL24Vjn82Wn3anNxOO/meITSH9Jo/p8Upw7S0ZbjSw5MrkMk7mToJOfnKuHY
-NYwa3yNNhTkKgiJru5iLepJAXZN63LhRcSmP3cGt2QDIguCJtvxavM7iY8XFhZj2
-SZ4iWSn+Lxdb4HEBt9lVzl5AsQh73lSS2MRxcjovVjUTH1Zgoz8LF0AXN37pl2nq
-SwkaIY7edrG6xMVIn0m3mgkHJkzF26HsqvIL36iSiw4dZjvBePK8UUG6F3lltJu0
-DakYSx/rWwmBAgDluYman6eZcL8LZq/7VEZt7YfWPvYSi02RRq0HDn/ApH9uwT+f
-L8CTbVTm1OzpImf/PvQQj4yJLH1koTHdqDfyUKASERu7MppHLvfAJdF3SusbDgoU
-vZ32FCpznL0yMcDu817wV7y7PQTwAXp4+qeo2krNWBl9n9DQEnIhdNu9jD3bGQhx
-Aw8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCOsJn45TZzgno61B+3G6vB3N/2
-ZTfOSDef/HQyc0JVZbR5uoxw/4ac1GV/iDIFKiwBvC8siG5sNb1xvQTHm5MQPuqY
-Avs/JCsO9FTfoo9GG8DeobtxC01PV4gNk5/BCtwNhr7ztjltdzA/hosX2b1D4iXC
-DCnHm/NlMjohyPFWsleET6H1aGqY4sprunHAvj3nvM5kIHAy347ZKGBkSousGZs9
-+ysgq1N42cpmVMp9TZe4WOdpDrkTxXAxpRZhPnKU1uyPDv5tcI/d7DtNgmdiH4Hm
-lwIw27Vkt3x7ZbQDYMbsoKY2wGzNgIjQOHjHS5eQZEtdneH6BDNkRTmkwnXG06q1
-Qdw/MSY667tJyKtdQlBSHWTMcYCSe01amkWPsYH1Ud9L05c0WuKHV2I4nhKAc6vZ
-H3RX/Pj2WoWIikr7D6C1w6G47qTieCIh+N85AWEizjnlQKkaf8zzwMoiOJOjB/bQ
-DYreYbC9sV9JZDHFzBiuou+WDB0nTkUnRxi4fVac2hU8xcg5hLrbVobSug2yqccv
-s+qTgf2rQBcHDtYBS+ORPp6l1uE6bRpe3eUP6e20sjYmv5XPd5tSgoMcCo9IYi3b
-9L25fFY9oCLAUjyE7spjknrfBfYUUaZV1u+ssQ/l+1AMWmp2JNEt0kCZnyzTMDtY
-bsT3KS3zgcyxrcjwqg==
------END CERTIFICATE REQUEST-----
diff --git a/0xgo/http2/server/certs/server.key b/0xgo/http2/server/certs/server.key
deleted file mode 100644 (file)
index 5052679..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-Z73kid71Rbb2DAbXN9OXUmSDNTC1
------END PRIVATE KEY-----
diff --git a/0xgo/http2/server/certs/server.pem b/0xgo/http2/server/certs/server.pem
deleted file mode 100644 (file)
index cf3b1aa..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFCTCCAvGgAwIBAgIUNiH3wgbZ2sa232ix2HMRSTX/p9YwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwNzQxNDJaFw0yNTExMDIwNzQx
-NDJaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAKMSN2tksm/BNFgvc81L+tJeEEzrXnNYpUrOr2lRs4i2SUncPBfM
-ND9yxssNE/vB8bG/HMksV1/9gcX2lApXRoa4UJh3KY+7hqHWdEjEFJ9tvMSxcb04
-546y9ZiiADfaNqycqLsHExYk6SeJz6MKrccxGjdRnZ8S444oBvYQBJPHdTvFhuCT
-JdxtwnqcVd/EF2nIzELnltIKc3q3ekoR9vUJfzVe/XBxBc6FiV/N9RHYSlS9uFY5
-/Nlp92pzcTjv5niE0h/SaP6fFKcO0tGW40sOTK5DJO5k6CTn5yrh2DWMGt8jTYU5
-CoIia7uYi3qSQF2Tety4UXEpj93BrdkAyILgibb8WrzO4mPFxYWY9kmeIlkp/i8X
-W+BxAbfZVc5eQLEIe95UktjEcXI6L1Y1Ex9WYKM/CxdAFzd+6Zdp6ksJGiGO3nax
-usTFSJ9Jt5oJByZMxduh7KryC9+okosOHWY7wXjyvFFBuhd5ZbSbtA2pGEsf61sJ
-gQIA5bmJmp+nmXC/C2av+1RGbe2H1j72EotNkUatBw5/wKR/bsE/ny/Ak21U5tTs
-6SJn/z70EI+MiSx9ZKEx3ag38lCgEhEbuzKaRy73wCXRd0rrGw4KFL2d9hQqc5y9
-MjHA7vNe8Fe8uz0E8AF6ePqnqNpKzVgZfZ/Q0BJyIXTbvYw92xkIcQMPAgMBAAGj
-WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUI53WKowOvtTqI4Pm
-h2Ak+AVURfQwHwYDVR0jBBgwFoAUgoQLRoUoITdNuR2EcO1+gCnNHrwwDQYJKoZI
-hvcNAQELBQADggIBABEiS9WRtkMIgEfhwIl2Vrb12BHKcveGs+iJuzNKCEYE40R7
-j3c5FpPZ3X2rxvU/U4TTGCSQ8/ZtjcL/oRM6nVNw4pf3y3CvXsNVHd0QMnLGc2NZ
-swkmvE4CKCzmHOTAHVcPefyMC1fG7xf6IzLGH0P36QQw3M6Qcv4462ZGY07iZGwV
-qzEBYbOCVL1aawuz3Mu1+3Z/xTRlp3kaNjjkAM4xMvu8kxdfH2iCMu/6ExVwE+vu
-qZ6B9sRXvfvoZQsfKlXSnqPMOAVfgbi0iqQmr+s00azI/2G9oVt632KPtRgWFsZx
-yNPuiljo8DrhszSkwbZtGV0xkwTatz28scpO97OZfD3NaEdeCsc+oQgGC6ZYgDWD
-e+hU4B9e9gnLK5T+uRaklBrFFMXjftP2wOmOWLsu+iizJOU9OGnbQmFJ/zPehUYb
-Y4+5XifC0+UkR1/gwCsqb1VKRtqP2frLmyqe+3XXKHUDPcLE1OPmghMemc88UuxR
-sAClRxD24xjasPf0CJHRlq9rpWnqHxdVWqcKt5eVzao+42xK0o9hYmfMtzbaFJ1O
-UperlRXOfPHfDXhoEuOjmiVzz7pf3JtsVUjt01/3pl6oUZjvnDJGm5B7ipqvHYUV
-FRlIf7ltL/wvHAxYzlploypqr8oQN9fadIQ3IfdtqhM+0EMRyMRqKHQVspdq
------END CERTIFICATE-----
diff --git a/0xgo/http2/server/certs/server.pub b/0xgo/http2/server/certs/server.pub
deleted file mode 100644 (file)
index 6889ab0..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoxI3a2Syb8E0WC9zzUv6
-0l4QTOtec1ilSs6vaVGziLZJSdw8F8w0P3LGyw0T+8Hxsb8cySxXX/2BxfaUCldG
-hrhQmHcpj7uGodZ0SMQUn228xLFxvTjnjrL1mKIAN9o2rJyouwcTFiTpJ4nPowqt
-xzEaN1GdnxLjjigG9hAEk8d1O8WG4JMl3G3CepxV38QXacjMQueW0gpzerd6ShH2
-9Ql/NV79cHEFzoWJX831EdhKVL24Vjn82Wn3anNxOO/meITSH9Jo/p8Upw7S0Zbj
-Sw5MrkMk7mToJOfnKuHYNYwa3yNNhTkKgiJru5iLepJAXZN63LhRcSmP3cGt2QDI
-guCJtvxavM7iY8XFhZj2SZ4iWSn+Lxdb4HEBt9lVzl5AsQh73lSS2MRxcjovVjUT
-H1Zgoz8LF0AXN37pl2nqSwkaIY7edrG6xMVIn0m3mgkHJkzF26HsqvIL36iSiw4d
-ZjvBePK8UUG6F3lltJu0DakYSx/rWwmBAgDluYman6eZcL8LZq/7VEZt7YfWPvYS
-i02RRq0HDn/ApH9uwT+fL8CTbVTm1OzpImf/PvQQj4yJLH1koTHdqDfyUKASERu7
-MppHLvfAJdF3SusbDgoUvZ32FCpznL0yMcDu817wV7y7PQTwAXp4+qeo2krNWBl9
-n9DQEnIhdNu9jD3bGQhxAw8CAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/http2/server/main.go b/0xgo/http2/server/main.go
deleted file mode 100644 (file)
index 5dde53d..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-package main
-
-import (
-       "log"
-       "net/http"
-
-       "golang.org/x/net/http2"
-)
-
-func helloHandler(w http.ResponseWriter, r *http.Request) {
-
-       w.Write([]byte("hello"))
-}
-
-func main() {
-
-       http.HandleFunc("/hello", helloHandler)
-
-       var srv http.Server
-       srv.Addr = "0.0.0.0:8888"
-       http2.ConfigureServer(&srv, &http2.Server{})
-
-       err := srv.ListenAndServeTLS("certs/server.pem", "certs/server.key")
-       if err != nil {
-               log.Fatal("ListenAndServe: ", err)
-       }
-}
diff --git a/0xgo/http3/Makefile b/0xgo/http3/Makefile
deleted file mode 100644 (file)
index 804008c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-all:
-
-       go build -o client/client.out ./client
-
-       go build -o server/server.out ./server
-
-
-
-
diff --git a/0xgo/http3/certgen.sh b/0xgo/http3/certgen.sh
deleted file mode 100755 (executable)
index bdb69b5..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-
-rm -r ./client/certs/*
-
-rm -r ./server/certs/*
-
-
-mkdir -p ./client/certs
-
-mkdir -p ./server/certs
-
-echo "root generating...."
-
-openssl genrsa -out ./client/certs/ca_priv.pem 4096
-
-openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
-
-openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
-
-echo "server key pair, csr generating...."
-
-openssl genrsa -out ./server/certs/server.key 4096
-
-openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
-
-openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
-
-echo "signing requests for server...."
-
-openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
-
-
-echo "done!"
\ No newline at end of file
diff --git a/0xgo/http3/client/certs/ca.pem b/0xgo/http3/client/certs/ca.pem
deleted file mode 100644 (file)
index f889c44..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIE/zCCAuegAwIBAgIUS2Xr3/K1AiMYppcYEqVyQ8BB39IwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MDMwNzI1MzJaFw0zNDA1MDEwNzI1
-MzJaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQDCdLeyc2+abS9AcrDwlqyVAuACxnVsR14+P77krZobHCcXOTtNF3YHB4f9
-3hpXRMaQiLlO8ZxtFXbw8IPT+x0vZ+imFA+IqWT7/J9hXIU6QIdO+MXAG4DwzvVL
-krCuVypp+Gvu7/V00hPJIne/w8lCKp86BPm4LsJE3pVf7RuMgJa7bzt1p/bvzOlZ
-7yMSE4hp8fyoiHUSedjA4VO2ycg3kDnts9Ldqg4GguwGQ5QDfAluDymwoLwpPwAs
-sDyDObmsdo/clGVWT6MUsjwm8j76Of3FZ5yu6yywXqSsSXybNYpAkw/a0wapH31d
-ONZ6qAvdmcJYaZJoQReJXkfaJtGRNV5I7NbZeoAekSJK40nM/vG2LWAcJJo2G6uV
-aRbhB7AkN59zTduLFn06VmEJuWNcOyOWwcWZ8Fbp8TlV4kELXO/MX0wTkwpAHj9E
-WxOOH5qmncyHOESyzou1wbMpyEOSSA0J8ySoBZob06hVqbtJoDj/uiGg1SIcy14s
-gofdKJ++NwK6e1ZGoy5b6S4X/JgNnbdq4gS0M3A3KAGYA6PeU1ymS22YdXqTtatf
-NVm1jaAGGkMyOZm6W92YKZdzQksMHLuLz2CkS4BuF9CFowrDNMCgk/CUsi4BFp27
-zvqXYWCIYOhS4BUZTuscAQpeI/Oo9BcCtZSgb0CqcpVGf+efVQIDAQABo1MwUTAd
-BgNVHQ4EFgQUFQ+swYvYbeIM6DFpxjVYVJ0G4G0wHwYDVR0jBBgwFoAUFQ+swYvY
-beIM6DFpxjVYVJ0G4G0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
-AgEANqPpKGUIxjCuKEjDeCo8iQVg/VQSsbyygmh4S3oX92rtxfL0STbyGHcN2uOo
-V2x6NAoZJS96Pr782e99TYbEmMDSowFeWQKslytJJgR00XkiCXRC49Rev62LkJe/
-tb30i9TmbEFNzGYhcIqU0kmLr/gP0uZmWthBU2D2XKErNTsEYMsQGGVDbK0xblC2
-dSda/XoBG9FRSpalG30PZkg1adBCJgIUa5uxKqc6Ik/zx3yZjVI7R15cdNASH8Po
-4B3LASd2b+zSZNIiG94rxCv3K86xtpEncvfDNRZckZZ+5OxDlu0++W6bqCKIJAvQ
-XzIjoypEzfosBPgS49J42KSC4dE+o3rRZmNICuyxJETCOcDIPWjHlifR45p8Ugjn
-sCduQgk/6068QIQVwEJ3/lM4c/b2J2nFEVDa3+cpJLwgLpajUdMm9tgqcA3Vv5ce
-xRYE1qJo09MPKG6/uq09K0q4yIDK6Oma4RMBjcLciUQA82AyNcHN31YbkASxCyeV
-N4ySr3fM975o5JOPhHV7N/6xBWrUOS2eaOOridiMyzLl4/06Hg0y5b3mP6L3LlgK
-QY32Ar0cEHJJRNCoyUgy5g1tkiDcw6H7DG+GL9kVXed6N3A5wReVal/1/5ulhEiv
-A8N3rQrka2ccM7EMTzEEJwA3Dt9OWsl85OJz2RI3RN9oQBk=
------END CERTIFICATE-----
diff --git a/0xgo/http3/client/certs/ca_priv.pem b/0xgo/http3/client/certs/ca_priv.pem
deleted file mode 100644 (file)
index e576be0..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-6vyNiA+8sZAEJEQ9JfzRZ+simU+0Nw==
------END PRIVATE KEY-----
diff --git a/0xgo/http3/client/certs/ca_pub.pem b/0xgo/http3/client/certs/ca_pub.pem
deleted file mode 100644 (file)
index 1bd892d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwnS3snNvmm0vQHKw8Jas
-lQLgAsZ1bEdePj++5K2aGxwnFzk7TRd2BweH/d4aV0TGkIi5TvGcbRV28PCD0/sd
-L2fophQPiKlk+/yfYVyFOkCHTvjFwBuA8M71S5Kwrlcqafhr7u/1dNITySJ3v8PJ
-QiqfOgT5uC7CRN6VX+0bjICWu287daf278zpWe8jEhOIafH8qIh1EnnYwOFTtsnI
-N5A57bPS3aoOBoLsBkOUA3wJbg8psKC8KT8ALLA8gzm5rHaP3JRlVk+jFLI8JvI+
-+jn9xWecrusssF6krEl8mzWKQJMP2tMGqR99XTjWeqgL3ZnCWGmSaEEXiV5H2ibR
-kTVeSOzW2XqAHpEiSuNJzP7xti1gHCSaNhurlWkW4QewJDefc03bixZ9OlZhCblj
-XDsjlsHFmfBW6fE5VeJBC1zvzF9ME5MKQB4/RFsTjh+app3MhzhEss6LtcGzKchD
-kkgNCfMkqAWaG9OoVam7SaA4/7ohoNUiHMteLIKH3SifvjcCuntWRqMuW+kuF/yY
-DZ23auIEtDNwNygBmAOj3lNcpkttmHV6k7WrXzVZtY2gBhpDMjmZulvdmCmXc0JL
-DBy7i89gpEuAbhfQhaMKwzTAoJPwlLIuARadu876l2FgiGDoUuAVGU7rHAEKXiPz
-qPQXArWUoG9AqnKVRn/nn1UCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/http3/client/main.go b/0xgo/http3/client/main.go
deleted file mode 100644 (file)
index d4f31b3..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-package main
-
-import (
-       "bytes"
-       "crypto/tls"
-       "crypto/x509"
-       "flag"
-       "io"
-       "log"
-       "net/http"
-       "os"
-       "sync"
-
-       "github.com/quic-go/quic-go"
-       "github.com/quic-go/quic-go/http3"
-)
-
-func main() {
-       quiet := flag.Bool("q", false, "don't print the data")
-       keyLogFile := flag.String("keylog", "", "key log file")
-       insecure := flag.Bool("insecure", false, "skip certificate verification")
-       flag.Parse()
-       urls := flag.Args()
-
-       var keyLog io.Writer
-       if len(*keyLogFile) > 0 {
-               f, err := os.Create(*keyLogFile)
-               if err != nil {
-                       log.Fatal(err)
-               }
-               defer f.Close()
-               keyLog = f
-       }
-
-       caCert, err := os.ReadFile("certs/ca.pem")
-       if err != nil {
-               log.Fatalf("Reading server certificate: %s", err)
-       }
-       caCertPool := x509.NewCertPool()
-       caCertPool.AppendCertsFromPEM(caCert)
-
-       roundTripper := &http3.Transport{
-               TLSClientConfig: &tls.Config{
-                       RootCAs:            caCertPool,
-                       InsecureSkipVerify: *insecure,
-                       KeyLogWriter:       keyLog,
-               },
-               QUICConfig: &quic.Config{},
-       }
-       defer roundTripper.Close()
-       hclient := &http.Client{
-               Transport: roundTripper,
-       }
-
-       var wg sync.WaitGroup
-       wg.Add(len(urls))
-       for _, addr := range urls {
-               log.Printf("GET %s", addr)
-               go func(addr string) {
-                       rsp, err := hclient.Get(addr)
-                       if err != nil {
-                               log.Fatal(err)
-                       }
-                       log.Printf("Got response for %s: %#v", addr, rsp)
-
-                       body := &bytes.Buffer{}
-                       _, err = io.Copy(body, rsp.Body)
-                       if err != nil {
-                               log.Fatal(err)
-                       }
-                       if *quiet {
-                               log.Printf("Response Body: %d bytes", body.Len())
-                       } else {
-                               log.Printf("Response Body (%d bytes):\n%s", body.Len(), body.Bytes())
-                       }
-                       wg.Done()
-               }(addr)
-       }
-       wg.Wait()
-}
diff --git a/0xgo/http3/server/certs/server.csr b/0xgo/http3/server/certs/server.csr
deleted file mode 100644 (file)
index fb291c1..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEA0SFKaMBnIM6O0Djz9pz8POhrlqlIty5j6i95GfCA
-4bzAqcit4ugJ5NFAmiNfhLDTtnS2j0kNeBYsLjr5dOUkNBLHwbh5fZzMxXpzZ6EG
-9+AAaYEmwV3vjsyxZU34WY9E2EmgSdadkIZ/T3m0rhMdzdcU7/eGKnYrl2KWSNCh
-ZgOOgg3bElOqahky6MStfs0rdRBvCT4HzGz9DcE/TTozbuiABSTBt71+7AXnPfmA
-YkAVT9XiDdu3yIXF7AKV3RY6JjHPRgj2t5A3+jHBNXJ7+FEpSz40gEkZQAMOuUTL
-4yugLxdnqJt9vi1noyVTg7p3FrBCzFuYwbwQFoim+WGTYKEI9hfLP3nHHQhUfb6N
-VHhKh1EzxYItc4T7xFAznzNWEWxlL2duiYZfwqest6amR2fOQ/PBty3eFspxF7HL
-NUpC5PuXy2p8ZBPXieW4pc1O8bVTKhqnL5QE3c3KpFuNjdbXviouRZWP4JnCs9wU
-k7uEF/KysLqfMSGGrlGA9YQA/SH+v7iOR6JMiYpAEjSmV5QW6Rb2DJ/XI+NLKsIe
-FeX2VXwFzrGfn2zMIzGEsm5AXrY3SskxLckt6QSDw5I9AZOJBF5pKHAalf+vFzCp
-5cknPLwHd6KrKijIchpb9r96rFtQw6rCFIfPj6sACLaYiRMKasWFslUm74wOgPA1
-KIMCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQAeMrdaO0OS1FN3qLOkWdk7lLQs
-1OYh5sQ81N6HMRO7yCLdIgZrK25i/w5RLb/amKGg2IUBW/5TmuGGfcn44g4MnKcw
-MYAaEov72v4bSLtchMC3adcJq29+achKJsC9rBhKTN0wOCgpQqJIz6Vy+uYdKlcP
-N4WrE9LmavmDLHcBDlV1BohYobzvl/VrLLlm46NmCwlAyyxwa1kF5Pcb6pmEY2qd
-J/EeQjIx3GRZECibanWqvefHcLsDHcfHnbPxA4/W/8F1qzkcH5NKeyENXbluK5cL
-Bo+FS9Zshn0/lOuj6DZcnYRGFh9HNrikG53ktZe256Q8AM9X1O1nOItFtjHBs5/F
-lO6kcoOxDL3CCqr0ykF8pnQ4geeQq6T0Im6n8kQP8+OH+0MSES79HlZsp6fQk5E5
-uFMkHLEPdvi4GOmWM9tANb3oaeL73a+wytAkAwLccnzxuHnZAiORQeLWk6nrU/sP
-Uq8yjsn0EgUmyHghlCghFprz8KTd8jzEI+MVgyIjCDGzhNnzoEvcnlMUnEyz84Ag
-CxPE5rbgv7VvBcPFsDLRExYsCsHTsbRioOe/U6ol/avApwI0Cu8VjGK6nDGh2RSH
-wDrBMX/m9Kh1D3vDfhUhstloWKcvPUFsJlUQea0H2P2SrYdLxYNFvFplbvwOtMw6
-+NPTjzkgsbvjgtvw8Q==
------END CERTIFICATE REQUEST-----
diff --git a/0xgo/http3/server/certs/server.key b/0xgo/http3/server/certs/server.key
deleted file mode 100644 (file)
index 7eddacd..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-KLkG/qJU5C3Mvjes7O8jYjmCjxfL
------END PRIVATE KEY-----
diff --git a/0xgo/http3/server/certs/server.pem b/0xgo/http3/server/certs/server.pem
deleted file mode 100644 (file)
index 04fa24c..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFCTCCAvGgAwIBAgIUQr1JK18kJWCKyu7WBogsB5gZGIEwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MDMwNzI1MzRaFw0yNTA1MDMwNzI1
-MzRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBANEhSmjAZyDOjtA48/ac/Dzoa5apSLcuY+oveRnwgOG8wKnIreLo
-CeTRQJojX4Sw07Z0to9JDXgWLC46+XTlJDQSx8G4eX2czMV6c2ehBvfgAGmBJsFd
-747MsWVN+FmPRNhJoEnWnZCGf095tK4THc3XFO/3hip2K5dilkjQoWYDjoIN2xJT
-qmoZMujErX7NK3UQbwk+B8xs/Q3BP006M27ogAUkwbe9fuwF5z35gGJAFU/V4g3b
-t8iFxewCld0WOiYxz0YI9reQN/oxwTVye/hRKUs+NIBJGUADDrlEy+MroC8XZ6ib
-fb4tZ6MlU4O6dxawQsxbmMG8EBaIpvlhk2ChCPYXyz95xx0IVH2+jVR4SodRM8WC
-LXOE+8RQM58zVhFsZS9nbomGX8KnrLempkdnzkPzwbct3hbKcRexyzVKQuT7l8tq
-fGQT14nluKXNTvG1Uyoapy+UBN3NyqRbjY3W174qLkWVj+CZwrPcFJO7hBfysrC6
-nzEhhq5RgPWEAP0h/r+4jkeiTImKQBI0pleUFukW9gyf1yPjSyrCHhXl9lV8Bc6x
-n59szCMxhLJuQF62N0rJMS3JLekEg8OSPQGTiQReaShwGpX/rxcwqeXJJzy8B3ei
-qyooyHIaW/a/eqxbUMOqwhSHz4+rAAi2mIkTCmrFhbJVJu+MDoDwNSiDAgMBAAGj
-WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUztOHY4D+a1LHqT5U
-Jy6DVw4m3pwwHwYDVR0jBBgwFoAUFQ+swYvYbeIM6DFpxjVYVJ0G4G0wDQYJKoZI
-hvcNAQELBQADggIBAG/VaN8jCvcBuuo5tqgMgV1Ss8P/Arm63xhJ5nGNdiK+SbKC
-BPB9ihqO+sXCUpV3/m2e83IdfRi7FZeJVwfBxQttjYeEwvp4M8ffzKucj9h1mxcG
-T0AamVMPnEWKUtoh98r1cpbh8FvMtUpwuL1MMEYxN4TmJIG1X5Hj17h5M7bdEP7g
-mumAs+CN4BQX4EQkBDQHlj/qjh9yaWL80XsvBJyhqFPYU1Mqd34mqzp1YR4bkQCn
-x5LF3bIB36zOSP2tgJGOhu32bZCCyBAduH7jWtpfr7UXnp3k7xPl79yPkJ9ZDmn6
-lSaXUOWdKMiQJSi65H+LR4StfKUj7D/iyz21nhh6NNUwO94DOqDmJTSH00kONkIO
-xvcMlt13YXZMvgLxzu4JKR9Cm3g3E7HicskKRzLeSmWH2K3jKMPivDJinwDI1Z8C
-/i1G/10/eUT6USrvXrtVyxsVxWgND20PRJDnbh5018+4k+92b6O4CUhjf3EJwMsH
-00U7XNyLRxIVXoCjM4q3ORKHDm5cKBtckCtpQj/9gVuQfOeJqJaZrb4etfGKappM
-OtNg1tVpJb2oYBmgB2EBu5LnjsQIyUEzi1iEUEiMSjMMnHXk6iwVtkYcZDwJ2oXN
-cdmRl9zwqxGVL8+jYMTClBEoObSF9WfR63mOpLd9/ABmCZtw1ixnWN4Q0ODp
------END CERTIFICATE-----
diff --git a/0xgo/http3/server/certs/server.pub b/0xgo/http3/server/certs/server.pub
deleted file mode 100644 (file)
index 09ec88f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0SFKaMBnIM6O0Djz9pz8
-POhrlqlIty5j6i95GfCA4bzAqcit4ugJ5NFAmiNfhLDTtnS2j0kNeBYsLjr5dOUk
-NBLHwbh5fZzMxXpzZ6EG9+AAaYEmwV3vjsyxZU34WY9E2EmgSdadkIZ/T3m0rhMd
-zdcU7/eGKnYrl2KWSNChZgOOgg3bElOqahky6MStfs0rdRBvCT4HzGz9DcE/TToz
-buiABSTBt71+7AXnPfmAYkAVT9XiDdu3yIXF7AKV3RY6JjHPRgj2t5A3+jHBNXJ7
-+FEpSz40gEkZQAMOuUTL4yugLxdnqJt9vi1noyVTg7p3FrBCzFuYwbwQFoim+WGT
-YKEI9hfLP3nHHQhUfb6NVHhKh1EzxYItc4T7xFAznzNWEWxlL2duiYZfwqest6am
-R2fOQ/PBty3eFspxF7HLNUpC5PuXy2p8ZBPXieW4pc1O8bVTKhqnL5QE3c3KpFuN
-jdbXviouRZWP4JnCs9wUk7uEF/KysLqfMSGGrlGA9YQA/SH+v7iOR6JMiYpAEjSm
-V5QW6Rb2DJ/XI+NLKsIeFeX2VXwFzrGfn2zMIzGEsm5AXrY3SskxLckt6QSDw5I9
-AZOJBF5pKHAalf+vFzCp5cknPLwHd6KrKijIchpb9r96rFtQw6rCFIfPj6sACLaY
-iRMKasWFslUm74wOgPA1KIMCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/http3/server/main.go b/0xgo/http3/server/main.go
deleted file mode 100644 (file)
index 9e30d7e..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-package main
-
-import (
-       "crypto/md5"
-       "errors"
-       "flag"
-       "fmt"
-       "io"
-       "log"
-       "mime/multipart"
-       "net/http"
-       "strconv"
-       "strings"
-       "sync"
-
-       _ "net/http/pprof"
-
-       "github.com/quic-go/quic-go"
-       "github.com/quic-go/quic-go/http3"
-)
-
-type binds []string
-
-func (b binds) String() string {
-       return strings.Join(b, ",")
-}
-
-func (b *binds) Set(v string) error {
-       *b = strings.Split(v, ",")
-       return nil
-}
-
-// Size is needed by the /demo/upload handler to determine the size of the uploaded file
-type Size interface {
-       Size() int64
-}
-
-// See https://en.wikipedia.org/wiki/Lehmer_random_number_generator
-func generatePRData(l int) []byte {
-       res := make([]byte, l)
-       seed := uint64(1)
-       for i := 0; i < l; i++ {
-               seed = seed * 48271 % 2147483647
-               res[i] = byte(seed)
-       }
-       return res
-}
-
-func setupHandler(www string) http.Handler {
-       mux := http.NewServeMux()
-
-       if len(www) > 0 {
-               mux.Handle("/", http.FileServer(http.Dir(www)))
-       } else {
-               mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
-                       fmt.Printf("%#v\n", r)
-                       const maxSize = 1 << 30 // 1 GB
-                       num, err := strconv.ParseInt(strings.ReplaceAll(r.RequestURI, "/", ""), 10, 64)
-                       if err != nil || num <= 0 || num > maxSize {
-                               w.WriteHeader(400)
-                               return
-                       }
-                       w.Write(generatePRData(int(num)))
-               })
-       }
-
-       mux.HandleFunc("/demo/tile", func(w http.ResponseWriter, r *http.Request) {
-               // Small 40x40 png
-               w.Write([]byte{
-                       0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
-                       0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28,
-                       0x01, 0x03, 0x00, 0x00, 0x00, 0xb6, 0x30, 0x2a, 0x2e, 0x00, 0x00, 0x00,
-                       0x03, 0x50, 0x4c, 0x54, 0x45, 0x5a, 0xc3, 0x5a, 0xad, 0x38, 0xaa, 0xdb,
-                       0x00, 0x00, 0x00, 0x0b, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0x63, 0x18,
-                       0x61, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xe2, 0xb8, 0x75, 0x22, 0x00,
-                       0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
-               })
-       })
-
-       mux.HandleFunc("/demo/tiles", func(w http.ResponseWriter, r *http.Request) {
-               io.WriteString(w, "<html><head><style>img{width:40px;height:40px;}</style></head><body>")
-               for i := 0; i < 200; i++ {
-                       fmt.Fprintf(w, `<img src="/demo/tile?cachebust=%d">`, i)
-               }
-               io.WriteString(w, "</body></html>")
-       })
-
-       mux.HandleFunc("/demo/echo", func(w http.ResponseWriter, r *http.Request) {
-               body, err := io.ReadAll(r.Body)
-               if err != nil {
-                       fmt.Printf("error reading body while handling /echo: %s\n", err.Error())
-               }
-               w.Write(body)
-       })
-
-       // accept file uploads and return the MD5 of the uploaded file
-       // maximum accepted file size is 1 GB
-       mux.HandleFunc("/demo/upload", func(w http.ResponseWriter, r *http.Request) {
-               if r.Method == http.MethodPost {
-                       err := r.ParseMultipartForm(1 << 30) // 1 GB
-                       if err == nil {
-                               var file multipart.File
-                               file, _, err = r.FormFile("uploadfile")
-                               if err == nil {
-                                       var size int64
-                                       if sizeInterface, ok := file.(Size); ok {
-                                               size = sizeInterface.Size()
-                                               b := make([]byte, size)
-                                               file.Read(b)
-                                               md5 := md5.Sum(b)
-                                               fmt.Fprintf(w, "%x", md5)
-                                               return
-                                       }
-                                       err = errors.New("couldn't get uploaded file size")
-                               }
-                       }
-                       log.Printf("Error receiving upload: %#v", err)
-               }
-               io.WriteString(w, `<html><body><form action="/demo/upload" method="post" enctype="multipart/form-data">
-                               <input type="file" name="uploadfile"><br>
-                               <input type="submit">
-                       </form></body></html>`)
-       })
-
-       return mux
-}
-
-func main() {
-       // defer profile.Start().Stop()
-       go func() {
-               log.Println(http.ListenAndServe("localhost:6060", nil))
-       }()
-       // runtime.SetBlockProfileRate(1)
-
-       bs := binds{}
-       flag.Var(&bs, "bind", "bind to")
-       www := flag.String("www", "", "www data")
-       tcp := flag.Bool("tcp", false, "also listen on TCP")
-       key := flag.String("key", "", "TLS key (requires -cert option)")
-       cert := flag.String("cert", "", "TLS certificate (requires -key option)")
-       flag.Parse()
-
-       if len(bs) == 0 {
-               bs = binds{"localhost:6121"}
-       }
-
-       handler := setupHandler(*www)
-
-       var wg sync.WaitGroup
-       wg.Add(len(bs))
-       var certFile, keyFile string
-       if *key != "" && *cert != "" {
-               keyFile = *key
-               certFile = *cert
-       } else {
-
-               certFile = "certs/server.pem"
-
-               keyFile = "certs/server.key"
-
-       }
-       for _, b := range bs {
-               fmt.Println("listening on", b)
-               bCap := b
-               go func() {
-                       var err error
-                       if *tcp {
-                               err = http3.ListenAndServeQUIC(bCap, certFile, keyFile, handler)
-                       } else {
-                               server := http3.Server{
-                                       Handler:    handler,
-                                       Addr:       bCap,
-                                       QUICConfig: &quic.Config{},
-                               }
-                               err = server.ListenAndServeTLS(certFile, keyFile)
-                       }
-                       if err != nil {
-                               fmt.Println(err)
-                       }
-                       wg.Done()
-               }()
-       }
-       wg.Wait()
-}
diff --git a/0xgo/mysql-query/.gitignore b/0xgo/mysql-query/.gitignore
deleted file mode 100644 (file)
index c8691c4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.data
\ No newline at end of file
diff --git a/0xgo/mysql-query/Dockerfile b/0xgo/mysql-query/Dockerfile
deleted file mode 100644 (file)
index aab7eb5..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-FROM mysql:8
-
-ENV MYSQL_ROOT_PASSWORD universalpassword
-ENV MYSQL_HOST localhost
-ENV MYSQL_TCP_PORT 3306
-
-EXPOSE 3306
-
-ADD ./init.sql /docker-entrypoint-initdb.d
\ No newline at end of file
diff --git a/0xgo/mysql-query/core/modules.go b/0xgo/mysql-query/core/modules.go
deleted file mode 100644 (file)
index e060159..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-package core
-
-import (
-       "database/sql"
-       "fmt"
-       "time"
-
-       _ "github.com/go-sql-driver/mysql"
-)
-
-var DB *sql.DB
-
-func DbEstablish(db_id string, db_pw string, db_addr string, db_name string) error {
-
-       var err error
-
-       db_info := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", db_id, db_pw, db_addr, db_name)
-
-       DB, err = sql.Open("mysql", db_info)
-
-       if err != nil {
-
-               return fmt.Errorf("failed to open db: %s", err.Error())
-       }
-
-       DB.SetConnMaxLifetime(time.Second * 10)
-       DB.SetConnMaxIdleTime(time.Second * 5)
-       DB.SetMaxOpenConns(10)
-       DB.SetMaxIdleConns(10)
-
-       return nil
-}
-
-func DbQuery(query string, args []any) (*sql.Rows, error) {
-
-       var empty_row *sql.Rows
-
-       results, err := DB.Query(query, args[0:]...)
-
-       if err != nil {
-
-               return empty_row, fmt.Errorf("db query: %s", err.Error())
-
-       }
-
-       return results, err
-
-}
-
-func DbExec(query string, args []any) error {
-
-       result, err := DB.Exec(query, args[0:]...)
-
-       if err != nil {
-               return fmt.Errorf("db exec: %s", err.Error())
-       }
-
-       _, err = result.RowsAffected()
-
-       if err != nil {
-
-               return fmt.Errorf("db exec: rows: %s", err.Error())
-       }
-
-       return nil
-
-}
diff --git a/0xgo/mysql-query/docker-compose.yaml b/0xgo/mysql-query/docker-compose.yaml
deleted file mode 100644 (file)
index 53a5951..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-version: "3"
-
-services:
-                        
-        mysql-db:
-                build: .
-                container_name: mysql-db
-                ports:
-                        - "3306:3306"
-                volumes:
-                        - ./.data:/var/lib/mysql
-        
\ No newline at end of file
diff --git a/0xgo/mysql-query/init.sql b/0xgo/mysql-query/init.sql
deleted file mode 100644 (file)
index 2effb03..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-CREATE USER 'mysqldb'@'%' IDENTIFIED BY 'universalpassword';
-
-GRANT ALL PRIVILEGES ON *.* TO 'mysqldb'@'%';
-
-CREATE DATABASE mysqldb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
-USE mysqldb;
-
-
-CREATE TABLE user (
-
-    user_id INT NOT NULL AUTO_INCREMENT,
-    user_name VARCHAR(128),
-    user_pass TEXT,
-    PRIMARY KEY (user_id)
-
-);
-
-
-
-INSERT INTO 
-    user (
-        user_name,
-        user_pass
-    )
-    VALUES (
-
-        "test1",
-        "test1pw"
-    );
-
-COMMIT;
\ No newline at end of file
diff --git a/0xgo/mysql-query/main.go b/0xgo/mysql-query/main.go
deleted file mode 100644 (file)
index e4a6335..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "log"
-
-       pkgdbquery "github.com/seantywork/0xgo/mysql-query/core"
-)
-
-type DB_User struct {
-       UserId   int    `json:"user_id"`
-       UserName string `json:"user_name"`
-       UserPass string `json:"user_pass"`
-}
-
-func GetUsers() ([]DB_User, error) {
-
-       var dbuser_records []DB_User
-
-       q := `
-       
-               SELECT
-                       user_id,
-                       user_name,
-                       user_pass
-               FROM
-                       user
-       
-       `
-
-       a := []any{}
-
-       res, err := pkgdbquery.DbQuery(q, a)
-
-       if err != nil {
-
-               return nil, fmt.Errorf("failed to get user: %s", err.Error())
-
-       }
-
-       defer res.Close()
-
-       for res.Next() {
-
-               dbuser := DB_User{}
-
-               err = res.Scan(
-                       &dbuser.UserId,
-                       &dbuser.UserName,
-                       &dbuser.UserPass,
-               )
-
-               if err != nil {
-
-                       return nil, fmt.Errorf("failed to get user: row: %s", err.Error())
-               }
-
-               dbuser_records = append(dbuser_records, dbuser)
-       }
-
-       return dbuser_records, nil
-
-}
-
-func GetUserByName(name string) (*DB_User, error) {
-
-       var dbuser_records []DB_User
-
-       var dbuser DB_User
-
-       q := `
-       
-               SELECT
-                       user_id,
-                       user_pass
-               FROM
-                       user
-               WHERE
-                       user_name = ?
-       
-       `
-
-       a := []any{
-               name,
-       }
-
-       res, err := pkgdbquery.DbQuery(q, a)
-
-       if err != nil {
-
-               return nil, fmt.Errorf("failed to get user: %s", err.Error())
-
-       }
-
-       defer res.Close()
-
-       for res.Next() {
-
-               dbuser := DB_User{}
-
-               err = res.Scan(
-                       &dbuser.UserId,
-                       &dbuser.UserPass,
-               )
-
-               if err != nil {
-
-                       return nil, fmt.Errorf("failed to get user: row: %s", err.Error())
-               }
-
-               dbuser_records = append(dbuser_records, dbuser)
-       }
-
-       rlen := len(dbuser_records)
-
-       if rlen != 1 {
-               return nil, nil
-       }
-
-       dbuser = dbuser_records[0]
-
-       return &dbuser, nil
-}
-
-func SetUser(name string, pass string) error {
-
-       check, err := GetUserByName(name)
-
-       if err != nil {
-
-               return fmt.Errorf("set user: %s", err.Error())
-       }
-
-       var q string
-
-       a := make([]any, 0)
-
-       if check != nil {
-
-               log.Printf("user: %s: already exists: overriding\n", name)
-
-               q = `
-               
-                       UPDATE
-                               user
-                       SET
-                               user_pass = ?
-                       WHERE
-                               user_id = ?
-
-               
-               `
-
-               a = append(a, pass)
-
-               a = append(a, check.UserId)
-
-       } else {
-
-               log.Printf("user: %s: doesn't exist: create\n", name)
-
-               q = `
-               
-                       INSERT INTO
-                               user(
-                                       user_name,
-                                       user_pass
-                               )
-                               VALUES(
-                                       ?,
-                                       ?
-                               )
-
-               
-               `
-
-               a = append(a, name)
-               a = append(a, pass)
-       }
-
-       err = pkgdbquery.DbExec(q, a)
-
-       if err != nil {
-               return fmt.Errorf("failed to set user: %s", err.Error())
-       }
-
-       return nil
-}
-
-func run() error {
-
-       err := pkgdbquery.DbEstablish(
-               "mysqldb",
-               "universalpassword",
-               "localhost:3306",
-               "mysqldb",
-       )
-
-       if err != nil {
-
-               return fmt.Errorf("failed to establish db conn: %s", err.Error())
-       }
-
-       urecall, err := GetUsers()
-
-       if err != nil {
-
-               return fmt.Errorf("failed to get all users: %s\n", err.Error())
-
-       }
-
-       ulen := len(urecall)
-
-       for i := 0; i < ulen; i++ {
-
-               fmt.Printf("user: %d ===================\n", i)
-               fmt.Printf("id    : %d\n", urecall[i].UserId)
-               fmt.Printf("name  : %s\n", urecall[i].UserName)
-               fmt.Printf("pw    : %s\n", urecall[i].UserPass)
-               fmt.Printf("=============================\n")
-
-       }
-
-       newuser := "test2"
-       newpw := "test2pw"
-
-       err = SetUser(newuser, newpw)
-
-       if err != nil {
-               return fmt.Errorf("failed to set new user: %s", err.Error())
-       }
-
-       urecall2, err := GetUsers()
-
-       if err != nil {
-
-               return fmt.Errorf("failed to get all users 2: %s\n", err.Error())
-
-       }
-
-       ulen2 := len(urecall2)
-
-       for i := 0; i < ulen2; i++ {
-
-               fmt.Printf("user: %d ===================\n", i)
-               fmt.Printf("id    : %d\n", urecall2[i].UserId)
-               fmt.Printf("name  : %s\n", urecall2[i].UserName)
-               fmt.Printf("pw    : %s\n", urecall2[i].UserPass)
-               fmt.Printf("=============================\n")
-
-       }
-
-       return nil
-}
-
-func main() {
-
-       if err := run(); err != nil {
-
-               log.Fatal(err)
-       }
-
-}
diff --git a/0xgo/sock-tcp-async/certgen.sh b/0xgo/sock-tcp-async/certgen.sh
deleted file mode 100755 (executable)
index 493976f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-rm -r ./client/certs/*
-
-rm -r ./server/certs/*
-
-echo "root generating...."
-
-openssl genrsa -out ./client/certs/ca_priv.pem 4096
-
-openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
-
-openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
-
-echo "server key pair, csr generating...."
-
-openssl genrsa -out ./server/certs/server.key 4096
-
-openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
-
-openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
-
-echo "signing requests for server...."
-
-openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
-
-
-echo "done!"
\ No newline at end of file
diff --git a/0xgo/sock-tcp-async/client/certs/ca.pem b/0xgo/sock-tcp-async/client/certs/ca.pem
deleted file mode 100644 (file)
index 06e44c9..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIE/zCCAuegAwIBAgIUffjPF3nZtca+YmxkhFpPSg8+8r8wDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMDBaFw0zNTAyMDYxMTQx
-MDBaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCrNVWpVf4qCCS+PHmRPTRA7EnAfgYwTQ0tUYtirsrPipbrlPX5zLF2vfTO
-lJqzvDB0xnGC5pYAFeh6PRsar6HmkG5z46QZJeukybDIvcRBpHKn3Wg1xJ/Bswpe
-76UbzNYmvnhkAeJgtptMXq0aGrn/us9f1jKX3EFNjipH2+c11XshVUNtPKT5XSqg
-oveReVgBhJU8Vl/1qGvQdyI/CsT4C1BJ4r148J580Hg5BVla1fg610NPwjvWvT9q
-rikjR1BPfzRrwiEgUoewLuZqDNeOXyeZCBhxWo5ugXqsMFSoBnUc4UYzTKPSVZXL
-ceXXiHkk+EF7KdD4ZugLzO3StrH7EngO25iXNsJoKB3JBs/cgpNybS7HhP96VRBi
-VCuhQJnqtmRVNnHMYR42RI0dxDlCewX16w2jM+XgEQ9YWwTE3gZp8+q1aKCFM/3c
-F0TnHyWB5ENE0vjIJjHBLcKz6e4baYBTiPWq1TjBtRLKEOGHJhnxuLCRwNe3IDJI
-1pCQhorr1/WFEDTrq5axbsNZUVnl7CeskojMsHEGYDVhTYMbBwscRqRPVd+C9XFi
-AsfyHJb5QwwEMxzkwt5JyJvSEY483FwvQkiI8YDGydgdUPCOmYkEMahS7+QfHhwu
-Ybnnn0xBHwcE6BQ8LjYLeMhP3hfyI5NJpRnhpVkIefRZm2untwIDAQABo1MwUTAd
-BgNVHQ4EFgQUNTLhikFTfYlRZvi7OXJDrw0apSIwHwYDVR0jBBgwFoAUNTLhikFT
-fYlRZvi7OXJDrw0apSIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
-AgEAD6wBsPD4U4BJWKpUv56gfqqqhZ319u3aWy/+GDoV6ZQjDRGuwvxvzWGXbpI8
-kJA4ZWK3TNXb+h+z06ivY3oLRKuIEQs/vS7mwzv8EAf+4JVs/nvW3+dhbFW1u1FL
-5OoV5al+w4TyO50T8QejmSiYJkgfe0x2uDf2PP8tcmlv0LoHjHOJ+HA4X5eUvZOQ
-ehe9z4VOsflRv14eGuEYofy4+7YHzXbHVEvBIUqcnNxs99eLzZN3P2N7r0a3PazK
-eeUPbx8TBbwHGWAHJFkYgOGpUQQ61ejHTwAWctc8rlNd0uLFnPRzAlSuwFK/ezZa
-do8RE2B4fguyJup+DVwYW7mvbX3FlFrNSnH/sdo6dqGiqgxfCygKxG4GHdLVw1p6
-S+qwQjZYCtgl9dzVoXs5SBknSq1fUxS1WLzoseTpAy37O5ppXyqNUogl45FB/lSb
-p4fZpHXaQ3hrtCR81UbRR2plUYx56GPZLi80MhOeFm2xJ+O82jkv8YGH11ePV+JO
-AXyA3NX25DoTWIRbHOcNubaYCDQIIscNTuwQLYQgNqvHe5f+/coV8npOafCchY0j
-pB0jfIZ09tNENLkqtvJ5tNQKMe9EFzL5ctynst383UdjDz8rDa6ZB9tVoicF3dW0
-xyC+qGlBpJE7W+Bs6VCFdXKuzqqewIvoTs0mka5jTEfXV0I=
------END CERTIFICATE-----
diff --git a/0xgo/sock-tcp-async/client/certs/ca.srl b/0xgo/sock-tcp-async/client/certs/ca.srl
deleted file mode 100644 (file)
index 7ff6484..0000000
+++ /dev/null
@@ -1 +0,0 @@
-24A3A8C4B775B0724F02BB952BB38A54EE85CCC6
diff --git a/0xgo/sock-tcp-async/client/certs/ca_priv.pem b/0xgo/sock-tcp-async/client/certs/ca_priv.pem
deleted file mode 100644 (file)
index e371c5e..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQCrNVWpVf4qCCS+
-PHmRPTRA7EnAfgYwTQ0tUYtirsrPipbrlPX5zLF2vfTOlJqzvDB0xnGC5pYAFeh6
-PRsar6HmkG5z46QZJeukybDIvcRBpHKn3Wg1xJ/Bswpe76UbzNYmvnhkAeJgtptM
-Xq0aGrn/us9f1jKX3EFNjipH2+c11XshVUNtPKT5XSqgoveReVgBhJU8Vl/1qGvQ
-dyI/CsT4C1BJ4r148J580Hg5BVla1fg610NPwjvWvT9qrikjR1BPfzRrwiEgUoew
-LuZqDNeOXyeZCBhxWo5ugXqsMFSoBnUc4UYzTKPSVZXLceXXiHkk+EF7KdD4ZugL
-zO3StrH7EngO25iXNsJoKB3JBs/cgpNybS7HhP96VRBiVCuhQJnqtmRVNnHMYR42
-RI0dxDlCewX16w2jM+XgEQ9YWwTE3gZp8+q1aKCFM/3cF0TnHyWB5ENE0vjIJjHB
-LcKz6e4baYBTiPWq1TjBtRLKEOGHJhnxuLCRwNe3IDJI1pCQhorr1/WFEDTrq5ax
-bsNZUVnl7CeskojMsHEGYDVhTYMbBwscRqRPVd+C9XFiAsfyHJb5QwwEMxzkwt5J
-yJvSEY483FwvQkiI8YDGydgdUPCOmYkEMahS7+QfHhwuYbnnn0xBHwcE6BQ8LjYL
-eMhP3hfyI5NJpRnhpVkIefRZm2untwIDAQABAoICAAfijj4c96mWgKBOtBsA/06V
-wBtm7A1xoJxuzhh7f1vjZwPIWcz2GFHYYGJBP5/s5PhqPHqwXvkrCSI6fTlgT5I8
-VaUg6oMj/XNniV/jz+cyb5T7Ylv5+pEwfnCuR2OwrkfQUhNQPBpP+EM72wVB20FQ
-jutvHhswKcVfuXyTJdXGlFCnluuv6GzGby4Nw125gaWapkesnLSS9XNltGr3doHY
-yr5UYuO8654VxdIU3nwlMM6Y8M2UEi7Xvjt0dCP4gIjgwJiaTLp3dcgiwm1HVFTt
-kF40Ar6TUpr64jXBVhMulPQBctSHzSwYBMZlY2LNTL/SO5Ka2h50/6JHfy5+SCBH
-CfpY5t7yCus+6QXp58kd4gFHPH43QzNFQIe7xJWOWKslse6pJBN/9Ooete4X2Eqd
-EdOrlTtXdOU+fEjRl5GvA8hqv/YRXFS0D/UoSh4GVPxpgCy6cOpjxtwRaT821s5f
-LmC2mULoJVP2CX+uzsLVqdncpycmcrs46SfGbwOyO8+8dz9nu8mmXM53sh+fVUxE
-HQqABfFEb1Od3JTeHHlEjUv5UsSag4vSb/owpDUak7AfJQS1k05sjxbdO/WNSOd4
-gaOiPhnt118i6NQq33ghIvZhtqX3Dok0J/gFOvh67qihQq3fLONIuAxOx+6foZhw
-FF9qcY12SRrPvqs2oHCpAoIBAQDhDvUSnwZoTCSODom4eUG9hiKveidYVjVkUNAA
-/bs+Z4qM8BOt/EcRRPfKoYiwsIY6xRNY4O3x+KR2+Ap4WWPX61zHZpjfmBDO83qS
-9CcBowTM8eDNAe3nNJ596H0fHoI2S0KyO0zifm1VjSeM12CEmSJQFW9X0Ds6z9bI
-9hjtqIBDi72MnvfCf2+b7hXTUODD0LeGLcZyRZBGn83qsVSJsCgi+y5kx1NvsQsB
-LxAfuWn57J3M9/7e2zjzsRGRdXyZpPIITl/4fSInN7WAguV3YbY2NdljoSMktoiI
-+xNpO9lhxfqIxY4HoIXUGGEZynf7Up2wivbdyH/Ba2pyYlk/AoIBAQDCvxjHB/JI
-yVv3ibGti1UwfI0ItfPvGbT+rM+/sPrAgTZtVYW+iwbQieRodfwUNJn4wAvVR+Xg
-AObN9kj31QI8IuLBMRnAYCP0sCtDuvBWYuqZHOd2FCmMs5RM5XeKuxJyDTyWvrez
-JZiCPZcoi4I0XycvLzBamoX+eZn6GLrrh0m9dypvux7bZ76yqcKPDC8QbfDyOog+
-ACq5mSTc6r84ARjyndQzq7hOehFJMvShso7iXV7VfTvfHfEkeO4cVNaiWE0fXhEx
-99SD9ciBFHWkInofWw8WI213lICNm5QbZzNa9cfUXYJxyaOhu3Vy/OvudUiO4Aaw
-clKnqqtIT9uJAoIBAQDa7Nja91SdSkxY3616hIG9oejFt9bkKGAhqDbeb/Of3cq6
-FKOgIILlOqisNPwpnF3Gd4S9dXghZFRf4iMVNSdZl3sWASh+gIcBOXmnz9bN0c1O
-q4+Y/OJ2gQoXwntMNTpHJGjJxcOho4gpq3ioma4q7mehbWh1DHtBV4JA1JwlOz8h
-9aI6Uz0Bt0NTdINInyk1cifEX2zmJeMVwEfnn/5zPaedd6eGoxr30Em7KhPOOGft
-lQ1foHIOSUQaUcmcLKQ7NWe3Sr4yk08QxTFKxIoA2k0MaM+CCfKMuP8R+OLGAFES
-uipet4XUx4LHcburAfg6wv/gBx3jWjFkbmAKyr6zAoIBAQCsvHerwl6jNQd/7wBM
-YHP1h+RIv6tYf0LNSlcTPlWL/pBaNitlMUegHU8dYNlwyp9vxlg4m4dIQ0R1l2ht
-euB6mq7qkTS4MA50cPZPIzceSKqxmLOtRoD8LiTyd+6qfPgFdbwyMYQbQNOfYiX7
-bpLVBTlqXr7S/pCvgQiUju7tDpjXlyVq6VybW9AIBQ9vdm0gc4PuNwC1jcxXx4Cs
-+wMVF9QbDucz1bKq2RcQCER4UDrwicUeM/CxHIvRv/nj41Rlt1Dg67zwx1QWoCFy
-bMVUCsirm0csacwk7vF/qWmbTNR+b9cJhM+5QhMD15R7o99ZKWpsYEVOqHisA3Pd
-tgeRAoIBAQC8Qq9oGt1G1ZpEjSll/7Mi3iK+ENjeU6Gb9aSZiaCrTB4RXVe2jiB4
-4hmfpVghifULvphCZZY6dahKIqGmJFkKu049ltyhHfnc/r/nThyKTs2+ESv68pLx
-7pjqDRDcd72Lna9cO4dDihlSwmEXrUzzZ6Hkn6JG9ZZ3e/nMsmpOS8d/a+NVL2QL
-w8stjB8VDHaqWnWoe/ZIePZ66UcNMtv6Q4JyyOmarTL1SVq3hOK+6FHkFDufgIjj
-gbSbCtxNUxs24GX4a4M6nVyHY2zESPzknb3cAcWKvxoG20lXj1HjZE/KaA7g+KXM
-HvhSKWc8Lsus1sPYi7BXTC2qJhPn5esv
------END PRIVATE KEY-----
diff --git a/0xgo/sock-tcp-async/client/certs/ca_pub.pem b/0xgo/sock-tcp-async/client/certs/ca_pub.pem
deleted file mode 100644 (file)
index 1f2732c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqzVVqVX+Kggkvjx5kT00
-QOxJwH4GME0NLVGLYq7Kz4qW65T1+cyxdr30zpSas7wwdMZxguaWABXoej0bGq+h
-5pBuc+OkGSXrpMmwyL3EQaRyp91oNcSfwbMKXu+lG8zWJr54ZAHiYLabTF6tGhq5
-/7rPX9Yyl9xBTY4qR9vnNdV7IVVDbTyk+V0qoKL3kXlYAYSVPFZf9ahr0HciPwrE
-+AtQSeK9ePCefNB4OQVZWtX4OtdDT8I71r0/aq4pI0dQT380a8IhIFKHsC7magzX
-jl8nmQgYcVqOboF6rDBUqAZ1HOFGM0yj0lWVy3Hl14h5JPhBeynQ+GboC8zt0rax
-+xJ4DtuYlzbCaCgdyQbP3IKTcm0ux4T/elUQYlQroUCZ6rZkVTZxzGEeNkSNHcQ5
-QnsF9esNozPl4BEPWFsExN4GafPqtWighTP93BdE5x8lgeRDRNL4yCYxwS3Cs+nu
-G2mAU4j1qtU4wbUSyhDhhyYZ8biwkcDXtyAySNaQkIaK69f1hRA066uWsW7DWVFZ
-5ewnrJKIzLBxBmA1YU2DGwcLHEakT1XfgvVxYgLH8hyW+UMMBDMc5MLeScib0hGO
-PNxcL0JIiPGAxsnYHVDwjpmJBDGoUu/kHx4cLmG5559MQR8HBOgUPC42C3jIT94X
-8iOTSaUZ4aVZCHn0WZtrp7cCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/sock-tcp-async/client/main.go b/0xgo/sock-tcp-async/client/main.go
deleted file mode 100644 (file)
index 573819f..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "net"
-       "os"
-)
-
-func main() {
-
-       mode := os.Args[1]
-
-       if mode == "net" {
-               conn, err := net.Dial("tcp", "localhost:8080")
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               wbuf := make([]byte, 1024)
-
-               copy(wbuf, "Hello, server!")
-
-               _, err = conn.Write(wbuf)
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               conn.Close()
-
-       } else if mode == "tls" {
-
-               TlsConnection()
-       }
-
-}
diff --git a/0xgo/sock-tcp-async/client/tls.go b/0xgo/sock-tcp-async/client/tls.go
deleted file mode 100644 (file)
index 574c0e5..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-package main
-
-import (
-       "crypto/tls"
-       "crypto/x509"
-       "fmt"
-       "log"
-       "os"
-       "time"
-)
-
-func TlsConnection() {
-
-       certpool := x509.NewCertPool()
-
-       file_b, err := os.ReadFile("certs/ca.pem")
-
-       /*
-               ca_pem := new(bytes.Buffer)
-
-               pem.Encode(ca_pem, &pem.Block{
-                       Type:  "CERTIFICATE",
-                       Bytes: file_b,
-               })
-       */
-       certpool.AppendCertsFromPEM(file_b)
-
-       config := tls.Config{RootCAs: certpool}
-       conn, err := tls.Dial("tcp", "localhost:8080", &config)
-       if err != nil {
-               log.Fatalf("client: dial: %s", err)
-       }
-       defer conn.Close()
-       log.Println("client: connected to: ", conn.RemoteAddr())
-
-       state := conn.ConnectionState()
-       for _, v := range state.PeerCertificates {
-               fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey))
-               fmt.Println(v.Subject)
-       }
-       log.Println("client: handshake: ", state.HandshakeComplete)
-       log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual)
-       wbuf := make([]byte, 1024)
-
-       copy(wbuf, "Hello, tls server!")
-       n, err := conn.Write(wbuf)
-       if err != nil {
-               log.Fatalf("client: write: %s", err)
-       }
-
-       reply := make([]byte, 1024)
-
-       readlen := 0
-
-       for readlen != 1024 {
-
-               n, err = conn.Read(reply[readlen:])
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               readlen += n
-       }
-
-       log.Printf("client: read :%s (%d bytes)", string(reply[:readlen]), readlen)
-       time.Sleep(time.Millisecond * 1000)
-       log.Print("client: exiting")
-}
diff --git a/0xgo/sock-tcp-async/server/certs/server.csr b/0xgo/sock-tcp-async/server/certs/server.csr
deleted file mode 100644 (file)
index d1716a7..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAyZ3Q53iz5sEydVn6ZweetnvPhYwY9UPcQwlHuEw6
-dMiwbWLFl3bvy0pMbK2Q2Jd/TNd1xQnG2IX7uMVsmecJCV9eKFJ5C1WyePglNBCg
-rPwccFPFWqAXj6s27meaNxUAge7S3LqZlwVSmdfyTtjCgvDSj1WvFv+3myG83sdH
-yRpiXVal4R5Lsd2pEIvJ+BnAGxazVdRWIcYT2yLdz32eaoFVCNMmi08c9xZSbT8+
-5mqBhhBDw20yhiH7cUsGg49mYVM9rUgz0DjQalqg01QQUOG7afJHMzSX3zDsKPDJ
-IucHgIfIEtoIIOD0i1IVqgHRywzue18S/5M/I4YctDxzPZntRUu6iPZQlPGCGlcQ
-XAlai5+u/jfg953dSMBLUoGSxmIFixHhN8QcSRRY10OK88BLIJM7twDGiD17YMhh
-iTA3DmkIOODAHaVN4akdfhmMP4gP20PaD/ULVUIl67p217sROouCa6Id/v6KmEfs
-9+8MVSZjz1xYNv/+nWMxla1IomLskifGPQaJYW6eH0h7JFe/Xgfn/ihJXpMiB2vP
-sSO1hio4NM3Ci1whP3H6iPjW6r2/gGJ/UOQ1H5zZde+UxW3BrLvfMGq8T9MNz2Du
-rIiG7lBBZEKpoL/slHf28MX7ALXqnhfq891Qb3Kl2zKySX7wAtbgJUG5lMazUzUb
-6OUCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQDBarvtlgaaiF32tTzMDAU+94+F
-0WKdstbGIcUDjW126WhiDMD9nsbjNscdkFpw7/JqvnD6CX3nOaE7EmO0Zh5+AXn+
-SgD+KsdEPDAw40zX/ceaEyLo13HYTqEXXf9GyVYFoUrPs1kI4ncvOcY6T6hGsoCn
-OzqzkQA0M44ct+VZkLZHtdotI/Pt0O3EGTIvxpH9LssI2XsAazRakudnECgf7krq
-qqtWceclClqmGR3xSpV5oWPt2V3Y1dDFvX0W1spxiMG8FHgT1b4Gf5WM4jOfcNm9
-g23PFc+ffqeEs1+1LhFWf+r61NLjrKKH82JEzXPj+kXSZ844JJrGdsjh8tuVtMvf
-ivYL8Di8AbEE2zSo7/bP3WKDkVN5oHC3/oz3V7vtPTfaWUHsJwI8qBkMO200KwH9
-FvTodg+NI8z7EOWhBvCE+hjlL1fn+9l2pLUV+fqjeXBQEsrHep+vN7zCCkJAmM0A
-mpU7OPNc7zm28L6zGK5TkKUHU4aGVyeItam6eU8+d/sZjkrQqQ/lEJbiLVCz//Kd
-/qGchrSksm6rKEcwYGE5h31wl8SAIjADk2cx/iQianhTdZaliL1I+s7pR67esTvi
-BhK16uLW+x6fuASKU5kDqLuHc+3rT+icu/DNEsQvR6j3t5i/iu6GYLLBHhWZWH1T
-0rS8ffinyso9IuImyQ==
------END CERTIFICATE REQUEST-----
diff --git a/0xgo/sock-tcp-async/server/certs/server.key b/0xgo/sock-tcp-async/server/certs/server.key
deleted file mode 100644 (file)
index e45fe9b..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-Ug07IGqNaURkyoQerKUv7X+DOFO1Qo4=
------END PRIVATE KEY-----
diff --git a/0xgo/sock-tcp-async/server/certs/server.pem b/0xgo/sock-tcp-async/server/certs/server.pem
deleted file mode 100644 (file)
index 9973288..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFCTCCAvGgAwIBAgIUJKOoxLd1sHJPAruVK7OKVO6FzMYwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMDBaFw0yNjAyMDgxMTQx
-MDBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAMmd0Od4s+bBMnVZ+mcHnrZ7z4WMGPVD3EMJR7hMOnTIsG1ixZd2
-78tKTGytkNiXf0zXdcUJxtiF+7jFbJnnCQlfXihSeQtVsnj4JTQQoKz8HHBTxVqg
-F4+rNu5nmjcVAIHu0ty6mZcFUpnX8k7YwoLw0o9Vrxb/t5shvN7HR8kaYl1WpeEe
-S7HdqRCLyfgZwBsWs1XUViHGE9si3c99nmqBVQjTJotPHPcWUm0/PuZqgYYQQ8Nt
-MoYh+3FLBoOPZmFTPa1IM9A40GpaoNNUEFDhu2nyRzM0l98w7CjwySLnB4CHyBLa
-CCDg9ItSFaoB0csM7ntfEv+TPyOGHLQ8cz2Z7UVLuoj2UJTxghpXEFwJWoufrv43
-4Ped3UjAS1KBksZiBYsR4TfEHEkUWNdDivPASyCTO7cAxog9e2DIYYkwNw5pCDjg
-wB2lTeGpHX4ZjD+ID9tD2g/1C1VCJeu6dte7ETqLgmuiHf7+iphH7PfvDFUmY89c
-WDb//p1jMZWtSKJi7JInxj0GiWFunh9IeyRXv14H5/4oSV6TIgdrz7EjtYYqODTN
-wotcIT9x+oj41uq9v4Bif1DkNR+c2XXvlMVtway73zBqvE/TDc9g7qyIhu5QQWRC
-qaC/7JR39vDF+wC16p4X6vPdUG9ypdsyskl+8ALW4CVBuZTGs1M1G+jlAgMBAAGj
-WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUbVC6F4cp3g11LRik
-jHUBSlLFXF4wHwYDVR0jBBgwFoAUNTLhikFTfYlRZvi7OXJDrw0apSIwDQYJKoZI
-hvcNAQELBQADggIBAHq7EV5kIo/RNG4Uzwnob6Zwi94la8ZDq7qFQoj6GJbbd/l0
-bQCIDTeIl5JzrPTv6Ka00DbSJ4BbY6OUTgUCeBDOX/lJ/FAYHhRMeTtOi7KTxyX2
-D8FKdQ/ZAYrU/GY0bC4vVwDqCmn5t+xkD2cXQlAAJIlQWVNEXIMrdDY4Q0jYyIiY
-lFyCu/cJY2phOzltbcwTOHzFSyPTyYSGacyE7xAyWj9va9renOQ3+kmj5Nu+jkMv
-hsAWNH6RjaJgOSYN5ItUi+i7qyqhWHOuU3ParKr0SEdl8cx9zvDRzNd2ZJQLtPvo
-CLlyifI0IAhe/Xh52mTEAJ8WBzjbVazPLBn9RUpN330h3mbFi3LxqZjyGmYNr5L3
-GwxVLcnRr8nL7FPb0AP1GlzTkxWULSwAJuivPgZywwZCxfkRdPGe7bq6c92W/bAx
-qAjEiqKZBzEpHMhwOvJXMo79/DmE4Q4N2yQxaA7vx8FQbFYvX0NhFIymKo6D4Uu+
-kYyFbSE3LymWbzGh0kFEf9xXl3xqQy1rXBYf8d9Z5+5acZG+6jcwmVQxqnWloajE
-uZmO7CKnUW8uJgE/1WCR7pF0DFWvNpq3zOssOV3dJZhvgEp6XXiwymbF8RlBnUy0
-4/GwXud7beKomxBwbYmYmGKO6lmQOQou7VP6Ag/637oOt8YaU/DKEdKwpKdQ
------END CERTIFICATE-----
diff --git a/0xgo/sock-tcp-async/server/certs/server.pub b/0xgo/sock-tcp-async/server/certs/server.pub
deleted file mode 100644 (file)
index 9901d75..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyZ3Q53iz5sEydVn6Zwee
-tnvPhYwY9UPcQwlHuEw6dMiwbWLFl3bvy0pMbK2Q2Jd/TNd1xQnG2IX7uMVsmecJ
-CV9eKFJ5C1WyePglNBCgrPwccFPFWqAXj6s27meaNxUAge7S3LqZlwVSmdfyTtjC
-gvDSj1WvFv+3myG83sdHyRpiXVal4R5Lsd2pEIvJ+BnAGxazVdRWIcYT2yLdz32e
-aoFVCNMmi08c9xZSbT8+5mqBhhBDw20yhiH7cUsGg49mYVM9rUgz0DjQalqg01QQ
-UOG7afJHMzSX3zDsKPDJIucHgIfIEtoIIOD0i1IVqgHRywzue18S/5M/I4YctDxz
-PZntRUu6iPZQlPGCGlcQXAlai5+u/jfg953dSMBLUoGSxmIFixHhN8QcSRRY10OK
-88BLIJM7twDGiD17YMhhiTA3DmkIOODAHaVN4akdfhmMP4gP20PaD/ULVUIl67p2
-17sROouCa6Id/v6KmEfs9+8MVSZjz1xYNv/+nWMxla1IomLskifGPQaJYW6eH0h7
-JFe/Xgfn/ihJXpMiB2vPsSO1hio4NM3Ci1whP3H6iPjW6r2/gGJ/UOQ1H5zZde+U
-xW3BrLvfMGq8T9MNz2DurIiG7lBBZEKpoL/slHf28MX7ALXqnhfq891Qb3Kl2zKy
-SX7wAtbgJUG5lMazUzUb6OUCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/sock-tcp-async/server/main.go b/0xgo/sock-tcp-async/server/main.go
deleted file mode 100644 (file)
index a5dcff0..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "net"
-       "os"
-)
-
-func main() {
-
-       mode := os.Args[1]
-
-       if mode == "net" {
-               ln, err := net.Listen("tcp", "0.0.0.0:8080")
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               for {
-                       conn, err := ln.Accept()
-                       if err != nil {
-                               fmt.Println(err)
-                               continue
-                       }
-
-                       rc := make(chan []byte, 1024)
-
-                       wc := make(chan []byte, 1024)
-
-                       go readHandler(conn, rc)
-
-                       go worker(rc, wc)
-
-                       go writeHandler(conn, wc)
-
-               }
-       } else if mode == "tls" {
-
-               TlsListen()
-
-       }
-
-}
-
-func readHandler(c net.Conn, rc chan []byte) {
-
-       buf := make([]byte, 1024)
-
-       for {
-
-               readlen := 0
-
-               for readlen != 1024 {
-
-                       n, err := c.Read(buf[readlen:])
-                       if err != nil {
-                               fmt.Println(err)
-                               return
-                       }
-
-                       readlen += n
-               }
-
-               fmt.Printf("Received len: %d\n", readlen)
-
-               rc <- buf
-
-       }
-
-}
-
-func worker(rc chan []byte, wc chan []byte) {
-
-       for {
-
-               rbuf := <-rc
-
-               fmt.Printf("Worker: %s\n", string(rbuf))
-
-               wc <- rbuf
-
-       }
-
-}
-
-func writeHandler(c net.Conn, wc chan []byte) {
-
-       for {
-
-               wbuf := <-wc
-
-               n, err := c.Write(wbuf)
-
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               fmt.Printf("Write len: %d\n", n)
-
-       }
-
-}
diff --git a/0xgo/sock-tcp-async/server/tls.go b/0xgo/sock-tcp-async/server/tls.go
deleted file mode 100644 (file)
index 36457fa..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-package main
-
-import (
-       "crypto/rand"
-       "crypto/tls"
-       "crypto/x509"
-       "log"
-)
-
-func TlsListen() {
-       cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key")
-       if err != nil {
-               log.Fatalf("server: loadkeys: %s", err)
-       }
-       config := tls.Config{Certificates: []tls.Certificate{cert}}
-       config.Rand = rand.Reader
-       service := "0.0.0.0:8080"
-       listener, err := tls.Listen("tcp", service, &config)
-       if err != nil {
-               log.Fatalf("server: listen: %s", err)
-       }
-       log.Print("server: listening")
-       for {
-               conn, err := listener.Accept()
-               if err != nil {
-                       log.Printf("server: accept: %s", err)
-                       break
-               }
-               defer conn.Close()
-               log.Printf("server: accepted from %s", conn.RemoteAddr())
-               tlscon, ok := conn.(*tls.Conn)
-               if ok {
-                       log.Print("ok=true")
-                       state := tlscon.ConnectionState()
-                       for _, v := range state.PeerCertificates {
-                               log.Print(x509.MarshalPKIXPublicKey(v.PublicKey))
-                       }
-               }
-
-               rc := make(chan []byte, 1024)
-
-               wc := make(chan []byte, 1024)
-
-               go readHandler(conn, rc)
-
-               go worker(rc, wc)
-
-               go writeHandler(conn, wc)
-
-       }
-}
diff --git a/0xgo/sock-tcp/certgen.sh b/0xgo/sock-tcp/certgen.sh
deleted file mode 100755 (executable)
index 493976f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-rm -r ./client/certs/*
-
-rm -r ./server/certs/*
-
-echo "root generating...."
-
-openssl genrsa -out ./client/certs/ca_priv.pem 4096
-
-openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
-
-openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
-
-echo "server key pair, csr generating...."
-
-openssl genrsa -out ./server/certs/server.key 4096
-
-openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
-
-openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
-
-echo "signing requests for server...."
-
-openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
-
-
-echo "done!"
\ No newline at end of file
diff --git a/0xgo/sock-tcp/client/certs/ca.pem b/0xgo/sock-tcp/client/certs/ca.pem
deleted file mode 100644 (file)
index a01c57f..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIE/zCCAuegAwIBAgIUJaxWVeWBx0o+5tTvweUncow0Ma0wDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMjlaFw0zNTAyMDYxMTQx
-MjlaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCpRl2utUhApEwha6B7Vr+8YJLWgbINjHMkzCJOyqVnvi6+Ja0pfYFXiZAp
-xewegSsK1QaEpW8zTRgmTVaA9q4MryV7PoYz5Lx+vQR+Q5TYy2WkeW3TAKmSiZOS
-tPa6UVjryGq5rK5L+3QkiJ5ckNXUpi6xYvSwWpVMVKm3XFD2VNM19wcxi42UfhSG
-ABa6F+qkz/TG/3DChCakCxEPB68ldKm9NeS0QSrDtmyvgMg2uigmupRZcbnnS6i6
-WI89N+9hO2SED0WG9AjbnpWYTkG+XyD9ljILtgO85vMPR+kcV5nRgrk6tONpDsA0
-rOsreu0zXyP6olnZyGLCrwrsDTQTda4DZ1H10OLZ6NMbEWzf6pMGS/RPLBxYKaZZ
-ITZqrF35QKlF3BUQxOwZrIeNuZlfwD7X9k5f7Z1b+ChX6wuG/qjsQNtkdQl9V0/T
-fKWeFslJvIghQjaQQef5tqiF5AGUV1MBPdYQ4M8pSEMvESaK3a7RrMImbGpi2uvq
-Ua5Rik6liw0m3jGT2tEMfOOhLUP6rpAelNzykqI7dN9yELLK57gmvKUrUt59oqdI
-wkjcYXrlxk/ntKS4sLcz9LsFYM98Gecl6irK0KqmR4fM0ueTumvMNkeKOn6BISJz
-hoDbjb6BU06N6q/p2ZBG1yJmAVgxdQ4ejJqtOuNLL8N6kX/bSQIDAQABo1MwUTAd
-BgNVHQ4EFgQUfMktrWwZkMks0TEaY4IclVFnb5IwHwYDVR0jBBgwFoAUfMktrWwZ
-kMks0TEaY4IclVFnb5IwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
-AgEAZ1kQ6OUReLN9CIz6MCb0ZMbMkvA469R5WYLuq/GbguE51l7sKfCRIc7isRe1
-ubt1qgBIIYveZu6FI4OCBgOpRJMoKFRSyo9MVNGyVjEuqqxW+MxE6LIb6NoRypNl
-XrynxlfgrLCIMNhI73Ri1A+THwc91G8NJM5AkCygMejiCMKoDFM0hadMP8B5/hqE
-WeviGenzrsuSuG/3G75RFvBpo6kYLEhIwMWfOsnOUi//M9MBOczjsOBTBbrZcIYL
-T9UP8jiKjGjcwLBrKLbwhu01zFC3vokwB+91MCyCTmNbuPY7KoIPnhKhWtgzd7g1
-EltiNwOShyS/kURHm4XquEvj95FVLGLTHm/selrJKtt+rzOvGi+MWRxfXentoDyt
-6OkbaaBToEmI9xYldKpA35yNirUEbvi7mTHm6Q5BtlSBvBL1xvVXPwUEdoJUirAl
-I9x+EEWwvFJZ0eroCkv1NjDHtpybRQbbnVNushPbfMyUFOSmLLKb5JVjWNWGCpHv
-0VFBohUr3lrm04Hc6VLcXEoTs9a/7fu5h9THsA1cnaHYq4aS8trTgx1Zh3wxDScK
-s9GfSgjfNutRvzwCaIgCio73g9k0Ac4mUxJAaEwQBbLl9pMH3NHfe6LKU94vhRHM
-PzN2NXG+uef5/OU1qp1fnJyNsoD7V9baW5FTxdBTINt0QDk=
------END CERTIFICATE-----
diff --git a/0xgo/sock-tcp/client/certs/ca.srl b/0xgo/sock-tcp/client/certs/ca.srl
deleted file mode 100644 (file)
index e446e15..0000000
+++ /dev/null
@@ -1 +0,0 @@
-583097A8573CE10C8940EFE5892C6FB7706960C7
diff --git a/0xgo/sock-tcp/client/certs/ca_priv.pem b/0xgo/sock-tcp/client/certs/ca_priv.pem
deleted file mode 100644 (file)
index 4db6c12..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-fJIrFNbakNgT3zvHUrA2KSgwKsTW
------END PRIVATE KEY-----
diff --git a/0xgo/sock-tcp/client/certs/ca_pub.pem b/0xgo/sock-tcp/client/certs/ca_pub.pem
deleted file mode 100644 (file)
index 988570c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqUZdrrVIQKRMIWuge1a/
-vGCS1oGyDYxzJMwiTsqlZ74uviWtKX2BV4mQKcXsHoErCtUGhKVvM00YJk1WgPau
-DK8lez6GM+S8fr0EfkOU2MtlpHlt0wCpkomTkrT2ulFY68hquayuS/t0JIieXJDV
-1KYusWL0sFqVTFSpt1xQ9lTTNfcHMYuNlH4UhgAWuhfqpM/0xv9wwoQmpAsRDwev
-JXSpvTXktEEqw7Zsr4DINrooJrqUWXG550uouliPPTfvYTtkhA9FhvQI256VmE5B
-vl8g/ZYyC7YDvObzD0fpHFeZ0YK5OrTjaQ7ANKzrK3rtM18j+qJZ2chiwq8K7A00
-E3WuA2dR9dDi2ejTGxFs3+qTBkv0TywcWCmmWSE2aqxd+UCpRdwVEMTsGayHjbmZ
-X8A+1/ZOX+2dW/goV+sLhv6o7EDbZHUJfVdP03ylnhbJSbyIIUI2kEHn+baoheQB
-lFdTAT3WEODPKUhDLxEmit2u0azCJmxqYtrr6lGuUYpOpYsNJt4xk9rRDHzjoS1D
-+q6QHpTc8pKiO3TfchCyyue4JrylK1LefaKnSMJI3GF65cZP57SkuLC3M/S7BWDP
-fBnnJeoqytCqpkeHzNLnk7przDZHijp+gSEic4aA242+gVNOjeqv6dmQRtciZgFY
-MXUOHoyarTrjSy/DepF/20kCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/sock-tcp/client/main.go b/0xgo/sock-tcp/client/main.go
deleted file mode 100644 (file)
index 573819f..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "net"
-       "os"
-)
-
-func main() {
-
-       mode := os.Args[1]
-
-       if mode == "net" {
-               conn, err := net.Dial("tcp", "localhost:8080")
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               wbuf := make([]byte, 1024)
-
-               copy(wbuf, "Hello, server!")
-
-               _, err = conn.Write(wbuf)
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               conn.Close()
-
-       } else if mode == "tls" {
-
-               TlsConnection()
-       }
-
-}
diff --git a/0xgo/sock-tcp/client/tls.go b/0xgo/sock-tcp/client/tls.go
deleted file mode 100644 (file)
index 5cf24bd..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-package main
-
-import (
-       "crypto/tls"
-       "crypto/x509"
-       "fmt"
-       "log"
-       "os"
-       "time"
-)
-
-func TlsConnection() {
-
-       certpool := x509.NewCertPool()
-
-       file_b, err := os.ReadFile("certs/ca.pem")
-
-       /*
-               ca_pem := new(bytes.Buffer)
-
-               pem.Encode(ca_pem, &pem.Block{
-                       Type:  "CERTIFICATE",
-                       Bytes: file_b,
-               })
-       */
-       certpool.AppendCertsFromPEM(file_b)
-
-       config := tls.Config{RootCAs: certpool}
-       conn, err := tls.Dial("tcp", "localhost:8080", &config)
-       if err != nil {
-               log.Fatalf("client: dial: %s", err)
-       }
-       defer conn.Close()
-       log.Println("client: connected to: ", conn.RemoteAddr())
-
-       state := conn.ConnectionState()
-       for _, v := range state.PeerCertificates {
-               fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey))
-               fmt.Println(v.Subject)
-       }
-       log.Println("client: handshake: ", state.HandshakeComplete)
-       log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual)
-
-       message := make([]byte, 1024)
-       copy(message, "hello tls server")
-       n, err := conn.Write(message)
-       if err != nil {
-               log.Fatalf("client: write: %s", err)
-       }
-
-       reply := make([]byte, 1024)
-
-       readlen := 0
-
-       for readlen != 1024 {
-
-               n, err = conn.Read(reply[readlen:])
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               readlen += n
-       }
-       log.Printf("client: read :%s (%d bytes)", string(reply[:readlen]), readlen)
-       time.Sleep(time.Millisecond * 1000)
-       log.Print("client: exiting")
-}
diff --git a/0xgo/sock-tcp/server/certs/server.csr b/0xgo/sock-tcp/server/certs/server.csr
deleted file mode 100644 (file)
index 5b41b91..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAkjTQrJ54b5bGM+dC2UBSnzfohGT2Jf+4hcckBUDi
-3w5xnvqbzCjjjy39i59WqzzblrdDmu6sgbWzLxbNLHMGm9Zugj5nW6aerycBY8Yr
-tyj6udqQ4UFnnhnN3yD0DSUhLMCxAd+j3441XabI+YL1RhEjC5UWdEtmRUIhGL5Y
-JtfomEXdpNeshpRZXU3Ui6o6zW5Vwq1ZuhAL17emLDta1R5R0VTLccnE43imhC4K
-pLmsXM5QZc+fSmHHQD3MX6v5TQN2ASYhtYvT6KuVT4dHq4EfVqfTzcScW+KDV7rg
-PH8WYh2SrONhugNtNsSc+Y2BjcEzKk3FEJmyRP0/lULpUkg5MzANHUW+D3l0sUJd
-oQ+wsq+aeLH5D2RUW0/o4dZREo7N2uJgCzWawebuIxD1Hnsrm0XNnyk1z1blEssp
-rstTbCuOQPC5HWG/SdyX5rCuiTtnSyO1x+mNBhtBrwXO8ur7bgBuzT6QUPcYtRgz
-0cEeUTofuczeLonsL+t77khK+LdtisXmCqFZelm5VoHDxBYde7uBR/IIrL29s8KF
-SFcU5hstpJKcTpbXvKOxvh2axUq2OJysn8xVSEZ1tDyOHIjH3NBwVcFkcZHEgrLA
-/ph0HwolIiH1EE7473XyGOqqyJKyk9DA6jL9UF282m42t1gHsTVwIAcpsh2U5uXe
-8GECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCLvBYMKRYpz8FWWwA8Asq7RrXl
-jPsaHhy8Bt+7s58VYKrvt10ip0qF97equA8AJB5sf8KxihfKeuWYMfuy3cyq8Erx
-geUPa+TrlVdLkbi3qqeSJaDObg/MYrZmv+dJGYRMUxlzeOGncCZEhIOKUQRRkT73
-rxOEFEc1gLPi0p9fqsTuyyLWmQUd8rwfhoMubFiXkhFnw/NEBJPl6GqpjNGTsbyN
-lUtA9wNK9ys2tuyL9yEzgmrKAkBljS6f98QIqN14EvSvF85Y910m5aC9uzadv6zr
-Llgs7s18GI4tLq9xl1IpiiVrZxE1I97rgjJa29hSF0EZy3UW0esI/ZN8GpDmHwLN
-CSbDOJDuNYsYeGrIsXzKNSK5kZYG2Zs4iVIwug335Bi/lN4g3NyMJxi2IdDHqgHw
-GRDqb24VXhS5TyuVJ16schCCqA02Qh6SOSCWyy/Ao8UWm+XnMn8alm3DGGTCZNFP
-pvSAd4YztkKcTayk7FDHczZcCDK7FMIVBSKRmsF1ahYYiiYfPAMs0Kf0D0GkSBPz
-NR1+ImpNitFh94fAffo18lTm8eUE324ajBLgj9xOD6S4e2F1Q1GvgFaIWThe3thg
-bcp9lGl+fBdmDz3wmPN+5/AitSr3W655eBoMYqObgjYpMj7/7/PTauvh/vQ4xzPX
-SpUNK+yMT+N/hc2H+w==
------END CERTIFICATE REQUEST-----
diff --git a/0xgo/sock-tcp/server/certs/server.key b/0xgo/sock-tcp/server/certs/server.key
deleted file mode 100644 (file)
index 1382e5c..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-YBLNr2GdmvMahJVy1gQXG9HlYIj/sA==
------END PRIVATE KEY-----
diff --git a/0xgo/sock-tcp/server/certs/server.pem b/0xgo/sock-tcp/server/certs/server.pem
deleted file mode 100644 (file)
index 2f00061..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFCTCCAvGgAwIBAgIUWDCXqFc84QyJQO/liSxvt3BpYMcwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMzBaFw0yNjAyMDgxMTQx
-MzBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAJI00KyeeG+WxjPnQtlAUp836IRk9iX/uIXHJAVA4t8OcZ76m8wo
-448t/YufVqs825a3Q5rurIG1sy8WzSxzBpvWboI+Z1umnq8nAWPGK7co+rnakOFB
-Z54Zzd8g9A0lISzAsQHfo9+ONV2myPmC9UYRIwuVFnRLZkVCIRi+WCbX6JhF3aTX
-rIaUWV1N1IuqOs1uVcKtWboQC9e3piw7WtUeUdFUy3HJxON4poQuCqS5rFzOUGXP
-n0phx0A9zF+r+U0DdgEmIbWL0+irlU+HR6uBH1an083EnFvig1e64Dx/FmIdkqzj
-YboDbTbEnPmNgY3BMypNxRCZskT9P5VC6VJIOTMwDR1Fvg95dLFCXaEPsLKvmnix
-+Q9kVFtP6OHWURKOzdriYAs1msHm7iMQ9R57K5tFzZ8pNc9W5RLLKa7LU2wrjkDw
-uR1hv0ncl+awrok7Z0sjtcfpjQYbQa8FzvLq+24Abs0+kFD3GLUYM9HBHlE6H7nM
-3i6J7C/re+5ISvi3bYrF5gqhWXpZuVaBw8QWHXu7gUfyCKy9vbPChUhXFOYbLaSS
-nE6W17yjsb4dmsVKtjicrJ/MVUhGdbQ8jhyIx9zQcFXBZHGRxIKywP6YdB8KJSIh
-9RBO+O918hjqqsiSspPQwOoy/VBdvNpuNrdYB7E1cCAHKbIdlObl3vBhAgMBAAGj
-WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU89cgoz1/aHzj2bu3
-RywilJJM5M8wHwYDVR0jBBgwFoAUfMktrWwZkMks0TEaY4IclVFnb5IwDQYJKoZI
-hvcNAQELBQADggIBAKHCXvS4uX9o24h3XGN20Q4FzfofAZ7dHDjqNglg/0SxxvgO
-2R1kyDNrD8PiaQRP990gNhodSp38XtMLro8nRWjQHyY0Wxv/msBd+BQF4kJ6/BLn
-l2TBFpGCa1VN6zKed4Nf0BW5WKEuQIiuJ2IfNpp/Eel/5duKWGbhAKr4tVGXCWRV
-SmpNl+aGKsxgrx2vZw92JgoRJ/bBOQp/C+etwI/Yravgbl6KVRhpx4Fwbu/nXErm
-YUXyynpk2wlfKvOgW0DJpeJ7VwGukwtvLdeaOq6+goVXa2rJrrjYyLBsCNIaiNiW
-cmBZp1k8zJQ0BQbY8a/FTb3yrFMo80EzpRQ10VtBztO8I11IE2K8fIEv5HpqIDYJ
-h6sdvWP7dJYyXih1cKS78LRCuyOTyrRPjpyVwyzz5bbbrlcu5smNvK5HqbM9GeAT
-R4+43ifMk9ZIObd8MlKgXTDC7QFb2GjiCUJF5hMGTlrwUZDNR4Esibe8l1xHd0yL
-XQSNzBvj0UcKmuhabx79dAZLl/DutB95kH8esjPj0eCLwlZYkAZwXuw/xIbUIL5s
-GsN0klNego9c51ey27K4CVVznt/8xPRfR182ZOr9KVE20cphK0UyAFaXhSCkZLaq
-b/3+P6Dg7dDK2k5wFLWfOX0bhVbhfYIX8GZM9VGX/Dn3DqZtC1QXxDpyFlDG
------END CERTIFICATE-----
diff --git a/0xgo/sock-tcp/server/certs/server.pub b/0xgo/sock-tcp/server/certs/server.pub
deleted file mode 100644 (file)
index 058ca12..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkjTQrJ54b5bGM+dC2UBS
-nzfohGT2Jf+4hcckBUDi3w5xnvqbzCjjjy39i59WqzzblrdDmu6sgbWzLxbNLHMG
-m9Zugj5nW6aerycBY8Yrtyj6udqQ4UFnnhnN3yD0DSUhLMCxAd+j3441XabI+YL1
-RhEjC5UWdEtmRUIhGL5YJtfomEXdpNeshpRZXU3Ui6o6zW5Vwq1ZuhAL17emLDta
-1R5R0VTLccnE43imhC4KpLmsXM5QZc+fSmHHQD3MX6v5TQN2ASYhtYvT6KuVT4dH
-q4EfVqfTzcScW+KDV7rgPH8WYh2SrONhugNtNsSc+Y2BjcEzKk3FEJmyRP0/lULp
-Ukg5MzANHUW+D3l0sUJdoQ+wsq+aeLH5D2RUW0/o4dZREo7N2uJgCzWawebuIxD1
-Hnsrm0XNnyk1z1blEssprstTbCuOQPC5HWG/SdyX5rCuiTtnSyO1x+mNBhtBrwXO
-8ur7bgBuzT6QUPcYtRgz0cEeUTofuczeLonsL+t77khK+LdtisXmCqFZelm5VoHD
-xBYde7uBR/IIrL29s8KFSFcU5hstpJKcTpbXvKOxvh2axUq2OJysn8xVSEZ1tDyO
-HIjH3NBwVcFkcZHEgrLA/ph0HwolIiH1EE7473XyGOqqyJKyk9DA6jL9UF282m42
-t1gHsTVwIAcpsh2U5uXe8GECAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/sock-tcp/server/main.go b/0xgo/sock-tcp/server/main.go
deleted file mode 100644 (file)
index 95a0920..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "net"
-       "os"
-)
-
-func main() {
-
-       mode := os.Args[1]
-
-       if mode == "net" {
-               ln, err := net.Listen("tcp", "0.0.0.0:8080")
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-               for {
-                       conn, err := ln.Accept()
-                       if err != nil {
-                               fmt.Println(err)
-                               continue
-                       }
-
-                       go handleConnection(conn)
-               }
-       } else if mode == "tls" {
-
-               TlsListen()
-
-       }
-
-}
-
-func handleConnection(conn net.Conn) {
-
-       defer conn.Close()
-
-       buf := make([]byte, 1024)
-
-       for {
-
-               readlen := 0
-
-               for readlen != 1024 {
-
-                       n, err := conn.Read(buf[readlen:])
-                       if err != nil {
-                               fmt.Println(err)
-                               return
-                       }
-
-                       readlen += n
-               }
-
-               fmt.Printf("Received: %s", buf)
-
-               _, err := conn.Write(buf)
-
-               if err != nil {
-                       fmt.Println(err)
-                       return
-               }
-
-       }
-
-}
diff --git a/0xgo/sock-tcp/server/tls.go b/0xgo/sock-tcp/server/tls.go
deleted file mode 100644 (file)
index b168244..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-package main
-
-import (
-       "crypto/rand"
-       "crypto/tls"
-       "crypto/x509"
-       "log"
-       "net"
-)
-
-func TlsListen() {
-       cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key")
-       if err != nil {
-               log.Fatalf("server: loadkeys: %s", err)
-       }
-       config := tls.Config{Certificates: []tls.Certificate{cert}}
-       config.Rand = rand.Reader
-       service := "0.0.0.0:8080"
-       listener, err := tls.Listen("tcp", service, &config)
-       if err != nil {
-               log.Fatalf("server: listen: %s", err)
-       }
-       log.Print("server: listening")
-       for {
-               conn, err := listener.Accept()
-               if err != nil {
-                       log.Printf("server: accept: %s", err)
-                       break
-               }
-               defer conn.Close()
-               log.Printf("server: accepted from %s", conn.RemoteAddr())
-               tlscon, ok := conn.(*tls.Conn)
-               if ok {
-                       log.Print("ok=true")
-                       state := tlscon.ConnectionState()
-                       for _, v := range state.PeerCertificates {
-                               log.Print(x509.MarshalPKIXPublicKey(v.PublicKey))
-                       }
-               }
-               go handleClient(conn)
-       }
-}
-
-func handleClient(conn net.Conn) {
-       defer conn.Close()
-       buf := make([]byte, 1024)
-       var reterr error = nil
-       for {
-               readlen := 0
-               log.Print("server: conn: waiting")
-
-               for readlen != 1024 {
-
-                       n, err := conn.Read(buf[readlen:])
-                       if err != nil {
-
-                               reterr = err
-                               break
-                       }
-
-                       readlen += n
-               }
-
-               if reterr != nil {
-                       log.Printf("server: conn: read: %s", reterr)
-                       return
-               }
-
-               log.Printf("server: conn: echo %s\n", string(buf))
-               _, err := conn.Write(buf)
-
-               if err != nil {
-                       log.Printf("server: write: %s", err)
-                       break
-               }
-       }
-       log.Println("server: conn: closed")
-}
diff --git a/0xgo/sock-udp/Makefile b/0xgo/sock-udp/Makefile
deleted file mode 100644 (file)
index 372df8f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-all:
-
-       go build -o client/client.out ./client 
-
-       go build -o server/server.out ./server
\ No newline at end of file
diff --git a/0xgo/sock-udp/client/main.go b/0xgo/sock-udp/client/main.go
deleted file mode 100644 (file)
index 0693e2b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "net"
-)
-
-var addr = "0.0.0.0:8888"
-
-func main() {
-
-       p := make([]byte, 128)
-       conn, err := net.Dial("udp", addr)
-
-       if err != nil {
-               fmt.Printf("Some error %v", err)
-               return
-       }
-
-       copy(p, "hello udp server")
-
-       n, err := conn.Write(p)
-
-       if err == nil {
-               fmt.Printf("sent %d\n", n)
-       } else {
-               fmt.Printf("Some error %v\n", err)
-       }
-       conn.Close()
-}
diff --git a/0xgo/sock-udp/server/main.go b/0xgo/sock-udp/server/main.go
deleted file mode 100644 (file)
index 304bda3..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "log"
-       "net"
-       "strings"
-)
-
-var addr = "0.0.0.0:8888"
-
-func GetServer(addr string) (*net.UDPConn, error) {
-
-       addrlist := strings.Split(addr, ":")
-
-       var port int
-
-       fmt.Sscanf(addrlist[1], "%d", &port)
-
-       ip := net.ParseIP(addrlist[0]).To4()
-
-       udpaddr := net.UDPAddr{
-
-               IP:   ip,
-               Port: port,
-       }
-
-       listener, err := net.ListenUDP("udp", &udpaddr)
-
-       if err != nil {
-
-               return nil, fmt.Errorf("failed to get server: %s", err.Error())
-       }
-
-       return listener, nil
-}
-
-func main() {
-
-       l, err := GetServer(addr)
-
-       if err != nil {
-
-               log.Printf("failed: %s\n", err.Error())
-
-               return
-       }
-
-       for {
-
-               buf := make([]byte, 128)
-
-               _, remoteaddr, err := l.ReadFromUDP(buf)
-
-               strbuf := string(buf)
-
-               fmt.Printf("Read a message from %v: %s\n", remoteaddr, strbuf)
-
-               if err != nil {
-                       fmt.Printf("Some error  %v", err)
-                       continue
-               }
-
-       }
-}
diff --git a/0xgo/sock-unix/Makefile b/0xgo/sock-unix/Makefile
deleted file mode 100644 (file)
index 8421f5a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-all:
-
-       go build -o client/client.out ./client 
-
-       go build -o server/server.out ./server 
-
diff --git a/0xgo/sock-unix/client/main.go b/0xgo/sock-unix/client/main.go
deleted file mode 100644 (file)
index c1def0a..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "log"
-       "net"
-       "time"
-)
-
-var addr = "/tmp/this.sock"
-
-func GetClient(baseAddr string) (net.Conn, error) {
-
-       c, err := net.Dial("unix", baseAddr)
-
-       if err != nil {
-
-               return nil, fmt.Errorf("failed to set ipc client: %s", err.Error())
-       }
-
-       return c, nil
-}
-
-func main() {
-
-       c, err := GetClient(addr)
-
-       if err != nil {
-
-               log.Printf("failed: %s\n", err.Error())
-
-               return
-       }
-
-       buff := make([]byte, 512)
-
-       copy(buff, "hello world")
-
-       for {
-
-               time.Sleep(1 * time.Second)
-
-               n, err := c.Write(buff)
-
-               if err != nil {
-
-                       log.Printf("write failed: %s\n", err.Error())
-
-                       break
-               }
-
-               _ = n
-
-               buff := make([]byte, 512)
-
-               n, err = c.Read(buff)
-
-               if err != nil {
-
-                       log.Printf("read failed: %s\n", err.Error())
-
-                       break
-
-               }
-
-               log.Printf("got message\n")
-
-               fmt.Println(string(buff))
-
-       }
-
-}
diff --git a/0xgo/sock-unix/server/main.go b/0xgo/sock-unix/server/main.go
deleted file mode 100644 (file)
index 2245519..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "log"
-       "net"
-)
-
-var addr = "/tmp/this.sock"
-
-func GetServer(baseAddr string) (net.Listener, error) {
-
-       listener, err := net.Listen("unix", baseAddr)
-
-       if err != nil {
-
-               return nil, fmt.Errorf("listen error: %s", err.Error())
-
-       }
-
-       return listener, nil
-}
-
-func doProcess(c net.Conn) {
-
-       for {
-
-               buf := make([]byte, 512)
-
-               wbuf := make([]byte, 512)
-
-               n, err := c.Read(buf)
-
-               if err != nil {
-
-                       log.Printf("read: %s\n", err.Error())
-
-                       return
-               }
-
-               nStr := fmt.Sprintf("%d", n)
-
-               var strlen int = 0
-
-               for i := 0; i < 512; i++ {
-
-                       strlen = i
-
-                       if buf[i] == 0 {
-
-                               break
-                       }
-
-               }
-
-               copy(wbuf, buf[:strlen])
-
-               copy(wbuf[strlen:], []byte(nStr))
-
-               _, err = c.Write(wbuf)
-
-               if err != nil {
-
-                       log.Printf("write: %s\n", err.Error())
-
-                       return
-               }
-
-       }
-
-}
-
-func main() {
-
-       l, err := GetServer(addr)
-
-       if err != nil {
-               log.Printf("failed to get server: %s\n", err.Error())
-
-               return
-       }
-
-       for {
-
-               c, err := l.Accept()
-
-               if err != nil {
-
-                       log.Printf("failed to accept: %s\n", err.Error())
-
-                       continue
-               }
-
-               go doProcess(c)
-
-       }
-
-}
diff --git a/0xgo/util/util.go b/0xgo/util/util.go
deleted file mode 100644 (file)
index c62c06e..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-package util
-
-import (
-       "bytes"
-       "crypto/rand"
-       "encoding/hex"
-       "io"
-       "log"
-       "os"
-       "strconv"
-       "strings"
-       "time"
-
-       "golang.org/x/crypto/ssh"
-)
-
-var HEX_RUNES = []rune{
-       '0',
-       '1',
-       '2',
-       '3',
-       '4',
-       '5',
-       '6',
-       '7',
-       '8',
-       '9',
-       'a',
-       'b',
-       'c',
-       'd',
-       'e',
-       'f',
-}
-
-func CheckIfSliceContains[T comparable](slice []T, ele T) bool {
-
-       hit := false
-
-       for i := 0; i < len(slice); i++ {
-
-               if slice[i] == ele {
-
-                       hit = true
-
-                       return hit
-               }
-
-       }
-
-       return hit
-
-}
-
-func PopFromSliceByIndex[T comparable](slice []T, idx int) (T, []T) {
-
-       pop_val := slice[idx]
-
-       return pop_val, append(slice[:idx], slice[idx+1:]...)
-
-}
-
-func InsertToSliceByIndex[T comparable](slice []T, idx int, val T) []T {
-
-       return append(slice[:idx], append([]T{val}, slice[idx:]...)...)
-}
-
-func SplitStrict(content string) map[string]string {
-       out := map[string]string{}
-       for _, line := range strings.Split(content, "\n") {
-               parts := strings.SplitN(line, "=", 2)
-               if len(parts) != 2 {
-                       continue
-               }
-               key := parts[0]
-               if len(key) == 0 || key[0] == '#' {
-                       continue
-               }
-
-               value := parts[1]
-               if len(value) > 2 && value[0] == '"' && value[len(value)-1] == '"' {
-
-                       var err error
-                       value, err = strconv.Unquote(value)
-                       if err != nil {
-                               continue
-                       }
-               }
-               out[key] = value
-       }
-       return out
-}
-
-func MakeOSReleaseLinux() map[string]string {
-
-       var osRelease map[string]string
-
-       if osRelease == nil {
-
-               osRelease = map[string]string{}
-               if bytes, err := os.ReadFile("/etc/os-release"); err == nil {
-                       osRelease = SplitStrict(string(bytes))
-               }
-       }
-       return osRelease
-}
-
-func SliceContains(s []string, str string) bool {
-       for _, v := range s {
-               if v == str {
-                       return true
-               }
-       }
-
-       return false
-}
-
-func RandomHex(n int) (string, error) {
-       bytes := make([]byte, n)
-       if _, err := rand.Read(bytes); err != nil {
-               return "", err
-       }
-       return hex.EncodeToString(bytes), nil
-}
-
-type ShellConnection struct {
-       *ssh.Client
-       password string
-}
-
-func ShellConnect(addr, user, password string) (*ShellConnection, error) {
-
-       var hostkeyCallback = ssh.InsecureIgnoreHostKey()
-
-       sshConfig := &ssh.ClientConfig{
-               User: user,
-               Auth: []ssh.AuthMethod{
-                       ssh.Password(password),
-               },
-               HostKeyCallback: hostkeyCallback,
-       }
-
-       conn, err := ssh.Dial("tcp", addr, sshConfig)
-       if err != nil {
-               return nil, err
-       }
-
-       return &ShellConnection{conn, password}, nil
-
-}
-
-func (conn *ShellConnection) SendCommands(cmds string) ([]byte, error) {
-       session, err := conn.NewSession()
-       if err != nil {
-               log.Fatal(err)
-       }
-       defer session.Close()
-
-       modes := ssh.TerminalModes{
-               ssh.ECHO:          0,
-               ssh.TTY_OP_ISPEED: 14400,
-               ssh.TTY_OP_OSPEED: 14400,
-       }
-
-       err = session.RequestPty("xterm", 80, 40, modes)
-       if err != nil {
-               return []byte{}, err
-       }
-
-       stdoutB := new(bytes.Buffer)
-       session.Stdout = stdoutB
-       in, _ := session.StdinPipe()
-
-       go func(in io.Writer, output *bytes.Buffer) {
-
-               t_start := time.Now()
-
-               for {
-
-                       t_now := time.Now()
-
-                       diff := t_now.Sub(t_start)
-                       if strings.Contains(string(output.Bytes()), "[sudo] password for ") {
-                               _, err = in.Write([]byte(conn.password + "\n"))
-                               if err != nil {
-                                       break
-                               }
-                               break
-                       }
-                       if diff.Seconds() > 30 {
-                               break
-                       }
-               }
-       }(in, stdoutB)
-
-       err = session.Run(cmds)
-       if err != nil {
-               return []byte{}, err
-       }
-       return stdoutB.Bytes(), nil
-}
-
-func (conn *ShellConnection) SendCommandsBackground(cmds string) ([]byte, error) {
-       session, err := conn.NewSession()
-       if err != nil {
-               log.Fatal(err)
-       }
-       defer session.Close()
-
-       stdoutB := new(bytes.Buffer)
-       session.Stdout = stdoutB
-       in, _ := session.StdinPipe()
-
-       go func(in io.Writer, output *bytes.Buffer) {
-
-               t_start := time.Now()
-
-               for {
-
-                       t_now := time.Now()
-
-                       diff := t_now.Sub(t_start)
-
-                       if strings.Contains(string(output.Bytes()), "[sudo] password for ") {
-                               _, err = in.Write([]byte(conn.password + "\n"))
-                               if err != nil {
-                                       break
-                               }
-                               break
-                       }
-
-                       if diff.Seconds() > 30 {
-                               break
-                       }
-
-               }
-       }(in, stdoutB)
-
-       err = session.Start(cmds)
-       if err != nil {
-               return []byte{}, err
-       }
-       return stdoutB.Bytes(), nil
-}
-
-func SanitizeUnnecessary(line string) string {
-
-       ret := ""
-
-       line = strings.ReplaceAll(line, " ", "")
-       line = strings.ReplaceAll(line, "\n", "")
-
-       llen := len(line)
-
-       for i := 0; i < llen; i++ {
-
-               if line[i] == '[' || line[i] == ']' {
-
-                       continue
-
-               } else if line[i] == ',' {
-
-                       ret += " "
-
-               } else {
-
-                       ret += string(line[i])
-
-               }
-
-       }
-
-       return ret
-}
diff --git a/0xgo/webrtc/Makefile b/0xgo/webrtc/Makefile
deleted file mode 100644 (file)
index c0436be..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-all:
-       go build -o main.out .
-
-clean:
-
-       rm -rf *.out
\ No newline at end of file
diff --git a/0xgo/webrtc/config.yaml b/0xgo/webrtc/config.yaml
deleted file mode 100644 (file)
index ae7f13f..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-turnServerAddr:
-  - addr: turn:localhost:3478
-    id: hello
-    pw: example
-
-rooms:
-  - key: abcd
-    members:
-      - hello
-      - world
-
-url: "localhost"
-
-signalPort: 8002
-
-rtpReceivePort: 8004
-
-peerSignalAttemptSync: 5
-
-peerSignalAddr : /signal/peer/
-
-rtcpPLIInterval: 3
-
-udpMuxPort: 8006
-
-udpEphemeralPortMin: 31000
-udpEphemeralPortMax: 31100
diff --git a/0xgo/webrtc/main.go b/0xgo/webrtc/main.go
deleted file mode 100644 (file)
index 5bebae4..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-package main
-
-import (
-       "fmt"
-       "log"
-       "os"
-       "time"
-
-       "github.com/gin-gonic/contrib/sessions"
-       "github.com/gin-gonic/gin"
-       "gopkg.in/yaml.v3"
-
-       "github.com/seantywork/0xgo/webrtc/webrtc"
-)
-
-type Config struct {
-       TurnServerAddr []struct {
-               Addr string `yaml:"addr"`
-               Id   string `yaml:"id"`
-               Pw   string `yaml:"pw"`
-       } `yaml:"turnServerAddr"`
-       Rooms []struct {
-               Key     string   `yaml:"key"`
-               Members []string `yaml:"members"`
-       } `yaml:"rooms"`
-       Url                   string `yaml:"url"`
-       SignalPort            int    `yaml:"signalPort"`
-       RtpReceivePort        int    `yaml:"rtpReceivePort"`
-       PeerSignalAttemptSync int    `yaml:"peerSignalAttemptSync"`
-       PeerSignalAddr        string `yaml:"peerSignalAddr"`
-       RtcpPLIInterval       int    `yaml:"rtcpPLIInterval"`
-       UdpMuxPort            int    `yaml:"udpMuxPort"`
-       UdpEphemeralPortMin   int    `yaml:"udpEphemeralPortMin"`
-       UdpEphemeralPortMax   int    `yaml:"udpEphemeralPortMax"`
-}
-
-func GetIndex(c *gin.Context) {
-
-       c.HTML(200, "index.html", gin.H{})
-
-}
-
-func main() {
-
-       file_b, err := os.ReadFile("config.yaml")
-
-       if err != nil {
-
-               log.Printf("failed to read config.yaml: %v", err)
-
-               os.Exit(-1)
-       }
-
-       conf := Config{}
-
-       err = yaml.Unmarshal(file_b, &conf)
-
-       if err != nil {
-               log.Printf("failed to unmarshal: %v\n", err)
-
-               os.Exit(-1)
-       }
-
-       turnlen := len(conf.TurnServerAddr)
-
-       for i := 0; i < turnlen; i++ {
-
-               addr := struct {
-                       Addr string `json:"addr"`
-                       Id   string `json:"id"`
-                       Pw   string `json:"pw"`
-               }{}
-
-               addr.Addr = conf.TurnServerAddr[i].Addr
-               addr.Id = conf.TurnServerAddr[i].Id
-               addr.Pw = conf.TurnServerAddr[i].Pw
-
-               webrtc.TURN_SERVER_ADDR = append(webrtc.TURN_SERVER_ADDR, addr)
-
-       }
-
-       roomlen := len(conf.Rooms)
-
-       for i := 0; i < roomlen; i++ {
-
-               pc := webrtc.PeersCreate{}
-
-               pc.RoomName = conf.Rooms[i].Key
-
-               pc.Users = conf.Rooms[i].Members
-
-               webrtc.CreatePeers(&pc)
-
-       }
-
-       webrtc.URL = conf.Url
-       webrtc.CHANNEL_PORT = fmt.Sprintf("%d", conf.SignalPort)
-       webrtc.RTP_RECEIVE_PORT = fmt.Sprintf("%d", conf.RtpReceivePort)
-       webrtc.PEER_SIGNAL_ATTEMPT_SYNC = conf.PeerSignalAttemptSync
-       webrtc.PEERS_SIGNAL_PATH = conf.PeerSignalAddr
-       webrtc.RTCP_PLI_INTERVAL = time.Second * time.Duration(conf.RtcpPLIInterval)
-       webrtc.UDP_MUX_PORT = conf.UdpMuxPort
-       webrtc.UDP_EPHEMERAL_PORT_MIN = conf.UdpEphemeralPortMin
-       webrtc.UDP_EPHEMERAL_PORT_MAX = conf.UdpEphemeralPortMax
-
-       webrtc.InitWebRTCApi()
-
-       server := gin.Default()
-
-       store := sessions.NewCookieStore([]byte("WEBRTC"))
-
-       server.Use(sessions.Sessions("WEBRTC", store))
-
-       server.LoadHTMLGlob("view/*")
-
-       server.Static("/public", "./public")
-
-       server.GET("/", GetIndex)
-
-       server.GET("/rtmp", webrtc.GetRtmp)
-
-       server.POST("/api/rtmp/open", webrtc.RtmpOpen)
-
-       server.GET("/room/:roomId/:userId", webrtc.GetRoom)
-
-       server.GET("/api/peers/signal/address", webrtc.GetPeersSignalAddress)
-
-       go webrtc.InitRTMPServer()
-
-       webrtc.AddChannelHandler(conf.PeerSignalAddr, webrtc.RoomSignalHandler)
-
-       webrtc.AddChannelCallback(webrtc.SignalDispatcher)
-
-       go webrtc.StartAllChannelHandlers()
-
-       server.Run("0.0.0.0:8000")
-}
diff --git a/0xgo/webrtc/public/js/room.js b/0xgo/webrtc/public/js/room.js
deleted file mode 100644 (file)
index 3290502..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-
-
-pc = {}
-ws = {}
-
-PEERS_SIGNAL_ADDRESS = ""
-
-TURN_SERVER_ADDRESS= {}
-
-ICE_SENT = 0
-
-MESSAGE_FORMAT = {
-
-    command: "",
-    data: ""
-
-}
-
-async function initPeers(){
-
-
-
-    let roomInfo = JSON.stringify(ROOM_INFO)
-
-    if(roomInfo == ""){
-
-        alert("no room info provided")
-
-        return
-    }
-
-    await init()
-
-
-
-    navigator.mediaDevices.getUserMedia({ video: true, audio: true })
-        .then(function(stream){
-
-            pc = new RTCPeerConnection({
-//                        iceServers: [
-//                            {
-//                                urls: TURN_SERVER_ADDRESS.addr,
-//                                username: TURN_SERVER_ADDRESS.id,
-//                                credential: TURN_SERVER_ADDRESS.pw
-//                            }
-//                        ]
-                    })
-                
-            document.getElementById('localVideo').srcObject = stream
-            stream.getTracks().forEach(function(track) {pc.addTrack(track, stream)})
-        
-            if (location.protocol !== 'https:') {
-
-                ws = new WebSocket("ws://" + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name)
-        
-            } else {
-        
-                ws = new WebSocket("wss://" + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name)
-        
-        
-            }
-
-            ws.onopen = function(evt){
-
-                ws.send(JSON.stringify({command: 'auth', data: roomInfo}))
-
-            }
-            
-            ws.onclose = function(evt) {
-                alert("Websocket has closed")
-            }
-        
-            ws.onmessage = function(evt) {
-                let msg = JSON.parse(evt.data)
-        
-                if (!msg) {
-                    return console.log('failed to parse msg')
-                }
-        
-        
-                switch (msg.command) {
-                    case 'offer':
-                    let offer = JSON.parse(atob(msg.data))
-                    if (!offer) {
-                        return console.log('failed to parse answer')
-                    }
-                    
-                    console.log("got offer")
-
-                    pc.setRemoteDescription(offer)
-                    pc.createAnswer().then(function(answer) {
-                        pc.setLocalDescription(answer)
-                        ws.send(JSON.stringify({command: 'answer', data: btoa(JSON.stringify(answer))}))
-                    })
-
-                    console.log("sent answer")
-
-                    return
-        
-                    case 'candidate':
-                    
-                    console.log("got candidate")
-
-                    let candidate = JSON.parse(atob(msg.data))
-                    if (!candidate) {
-                        return console.log('failed to parse candidate')
-                    }
-
-                    pc.addIceCandidate(candidate)
-
-                    console.log("added candidate")
-
-                    return
-
-                    case 'chat':
-                    
-                    let chatData = msg.data
-
-                    let chatMessage = JSON.parse(chatData) 
-
-                    document.getElementById("chat-reader").innerText += `<${chatMessage.user}> ${chatMessage.message} \n`
-
-                    return
-                }
-            }
-
-            ws.onerror = function(evt) {
-                console.log("ERROR: " + evt.data)
-            }
-
-            pc.ontrack = function (event) {
-                if (event.track.kind === 'audio') {
-                    return
-                }
-        
-                let el = document.createElement(event.track.kind)
-                el.srcObject = event.streams[0]
-                el.autoplay = true
-                el.controls = true
-                document.getElementById('remoteVideos').appendChild(el)
-        
-                event.track.onmute = function(event) {
-                    el.play()
-                }
-                
-                event.streams[0].onremovetrack = function({track}) {
-
-                    if (el.parentNode) {
-                        el.parentNode.removeChild(el)
-                    }
-                }
-            }
-        
-        
-            pc.onicecandidate = function(e){
-                
-                if (!e.candidate) {
-        
-                    console.log("not a candidate")
-        
-                    return
-                }
-        
-                ws.send(JSON.stringify({command: 'candidate', data: btoa(JSON.stringify(e.candidate))}))
-                console.log("sent ice candidate")
-
-
-            }
-                
-        
-        
-            console.log("opened peer connection ready")
-
-        })
-        .catch(function(e){
-
-            alert(e)
-        })
-
-
-
-}
-
-function sendChat(){
-
-    let chatConent = document.getElementById("chat-sender").value
-
-    document.getElementById("chat-sender").value = ""
-
-    let req = JSON.parse(JSON.stringify(MESSAGE_FORMAT))
-
-    req.command = "chat"
-    req.data = chatConent
-
-    ws.send(JSON.stringify(req))
-
-}
-
-
-async function init(){
-
-    let options = {
-        method: "GET"
-    }
-    let result = await fetch("/api/peers/signal/address", options)
-
-    let data = await result.json()
-
-    if(data.status != "success"){
-
-        alert("failed to get peers signal address")
-
-        return
-    }
-
-
-    PEERS_SIGNAL_ADDRESS = data.reply 
-
-    console.log("peersSignalAddr: " + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name)
-
-
-    console.log("opened channel for peer signal")
-
-}
-
-
-(async function (){
-
-    await initPeers()
-
-})()
\ No newline at end of file
diff --git a/0xgo/webrtc/public/js/rtmp.js b/0xgo/webrtc/public/js/rtmp.js
deleted file mode 100644 (file)
index a9c2d45..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-pc = {}
-
-ws = {}
-
-
-
-TURN_SERVER_ADDRESS = {}
-
-
-STREAMING_KEY = ""
-
-CLIENT_REQ = {
-    "data":""
-}
-
-SERVER_RE = {
-    "status": "",
-    "reply": ""
-}
-
-
-
-RTMP_STRUCT = {
-
-    "streaming_key":"",
-    "description": ""
-
-}
-
-
-
-async function initRTMP(){
-
-
-    pc = new RTCPeerConnection({
-//        iceServers: [
-//            {
-//                urls: TURN_SERVER_ADDRESS.addr,
-//                username: TURN_SERVER_ADDRESS.id,
-//                credential: TURN_SERVER_ADDRESS.pw
-//            }
-//        ]
-    })
-
-    pc.oniceconnectionstatechange = function(e) {console.log(pc.iceConnectionState)}
-
-    pc.onicecandidate = async function(event){
-
-        if (event.candidate === null){
-
-
-            let req = {
-                data: JSON.stringify(pc.localDescription)
-            }
-
-            let options = {
-                method: "POST",
-                headers: {
-                  "Content-Type": "application/json" 
-                },
-                body: JSON.stringify(req) 
-            }
-
-            let resp = await fetch("/api/rtmp/open", options)
-
-            let data = await resp.json()
-
-            if (data.status != "success") {
-
-                alert("failed to start cctv offer")
-            }
-            try {
-            
-                cs = JSON.parse(data.reply)
-
-                console.log(cs)
-
-                let remoteDesc = JSON.parse(cs.description)
-                
-                pc.setRemoteDescription(new RTCSessionDescription(remoteDesc))
-            
-                STREAMING_KEY = cs.streaming_key
-
-                alert("streaming address: " + cs.location)
-                
-            
-            } catch (e){
-
-                alert(e)
-            }
-
-        }
-
-
-    }
-
-    pc.ontrack = function (event) {
-
-        var el = document.createElement(event.track.kind)
-        el.srcObject = event.streams[0]
-        el.autoplay = true
-        el.controls = true
-
-        document.getElementById('cctv-reader').appendChild(el)
-
-    }
-
-    pc.addTransceiver('video')
-    pc.addTransceiver('audio')
-    
-    let offer = await pc.createOffer()
-
-    pc.setLocalDescription(offer)
-
-    console.log("init success")
-
-}
-
-
-
-
-
-
-
-
diff --git a/0xgo/webrtc/setup.sh b/0xgo/webrtc/setup.sh
deleted file mode 100755 (executable)
index d825bc5..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-
-sudo apt update
-
-sudo apt install coturn -y
\ No newline at end of file
diff --git a/0xgo/webrtc/turn.md b/0xgo/webrtc/turn.md
deleted file mode 100644 (file)
index 2ca68d2..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-sudo vim /etc/default/coturn
-
-TURNSERVER_ENABLED=1
-
-sudo systemctl start coturn
-
-sudo vim /etc/turnserver.conf
-
-listening-ip=0.0.0.0
-
-listening-port=3478
-
-external-ip=feebdaed.xyz/192.168.0.1 
-
-min-port=3479 max-port=3579
-
-verbose
-
-lt-cred-mech
-
-user=MYUSER:MYPASS
-
-realm=feebdaed.xyz
-
-sudo systemctl restart coturn
\ No newline at end of file
diff --git a/0xgo/webrtc/view/index.html b/0xgo/webrtc/view/index.html
deleted file mode 100644 (file)
index 4cc9b1b..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{{ define "index.html" }}
-<!DOCTYPE html>
-<html class="tui-bg-blue-black">
-  <head>
-
-    <meta charset="utf-8">
-    <title> index </title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  </head>
-  <body>
-    
-    index
-
-    video chat: /room/:roomId/:userId
-
-    rtmp: /rtmp
-
-  </body>
-
-</html>
-{{ end }}
\ No newline at end of file
diff --git a/0xgo/webrtc/view/room.html b/0xgo/webrtc/view/room.html
deleted file mode 100644 (file)
index eed0ac8..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-{{ define "room.html" }}
-<!DOCTYPE html>
-<html class="tui-bg-blue-black">
-  <head>
-
-    <meta charset="utf-8">
-    <title> room </title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script>
-
-      ROOM_INFO = JSON.parse("{{ .room_code }}")
-
-    </script>
-
-  </head>
-  <body>
-    <div class="container">
-      <div class="row">
-        <div class="col s12 m12 l12">
-          <div class="tui-window tui-scroll-white">
-            <fieldset class="tui-fieldset tui-border-double">
-              <legend>Video</legend>
-              <h3> Local Video </h3>
-              <fieldset class="tui-fieldset tui-border-dotted">
-                <video id="localVideo" width="160" height="120" autoplay muted></video> <br />
-              </fieldset>
-              <h3> Remote Video </h3>
-              <fieldset class="tui-fieldset tui-border-dotted">
-                <div id="remoteVideos"></div> <br>  
-              </fieldset>    
-            </fieldset>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="tui-overlap">
-      <div id="modal" class="tui-modal">
-          <div class="tui-window tui-scroll-white">
-            <fieldset class="tui-fieldset tui-border-double">
-              <legend class="red-255 yellow-255-text">Chat</legend>
-              <textarea class="tui-input purple-255" id="chat-sender"></textarea>
-              <br>
-              <input class="tui-button" type="button" value="send" onclick="sendChat()">
-              <p>Thread</p>
-              <fieldset class="tui-fieldset tui-border-dotted">
-                <pre id="chat-reader"></pre>
-              </fieldset>
-              <button class="tui-button tui-modal-close-button right" data-modal="modal">close</button>
-            </fieldset>
-          </div>
-      </div>
-    </div>
-
-
-
-  </body>
-
-  <script src="/public/js/room.js"></script>
-</html>
-{{ end }}
\ No newline at end of file
diff --git a/0xgo/webrtc/view/rtmp.html b/0xgo/webrtc/view/rtmp.html
deleted file mode 100644 (file)
index 5549b35..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-{{ define "rtmp.html" }}
-<!doctype html>
-<html class="tui-bg-blue-black">
-  <head>
-    <title> rtmp </title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  </head>
-
-  <body>
-
-    <div class="container">
-      <div class="row">
-        <div class="col s6 m6 l6"></div>
-          <div class="tui-window tui-scroll-white">
-            <fieldset class="tui-fieldset tui-border-double">
-              <legend>rtmp</legend>
-              <fieldset class="tui-fieldset tui-border-dotted">
-                <div id="cctv-reader"></div>
-              </fieldset>
-              <input class="tui-button" type="button" onclick="initRTMP()" value="start rtmp">
-
-            </fieldset>
-          </div>
-        </div>
-  </body>
-
-  <script src="/public/js/rtmp.js"></script>
-
-
-</html>
-{{ end }}
\ No newline at end of file
diff --git a/0xgo/webrtc/webrtc/com.go b/0xgo/webrtc/webrtc/com.go
deleted file mode 100644 (file)
index 5b7353a..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-package webrtc
-
-import (
-       "encoding/json"
-       "fmt"
-       "log"
-       "net/http"
-       "sync"
-
-       "github.com/gin-gonic/gin"
-       "github.com/gorilla/websocket"
-)
-
-type CLIENT_REQ struct {
-       Data string `json:"data"`
-}
-
-type SERVER_RE struct {
-       Status string `json:"status"`
-       Reply  string `json:"reply"`
-}
-
-type RT_REQ_DATA struct {
-       Command string `json:"command"`
-       Data    string `json:"data"`
-}
-
-type RT_RESP_DATA struct {
-       Status string `json:"status"`
-       Data   string `json:"data"`
-}
-
-var CHANNEL_ADDR string = "0.0.0.0"
-
-var CHANNEL_PORT string
-
-var USER_CHANNEL = make(map[string]*websocket.Conn)
-
-var CH_CALLBACKS []func()
-
-var ListLock sync.RWMutex
-
-type ThreadSafeWriter struct {
-       *websocket.Conn
-       sync.Mutex
-}
-
-func GetRtmp(c *gin.Context) {
-
-       c.HTML(200, "rtmp.html", gin.H{})
-}
-
-func GetRoom(c *gin.Context) {
-
-       roomId := c.Param("roomId")
-
-       userId := c.Param("userId")
-
-       p_users, okay := ROOMREG[roomId]
-
-       if !okay {
-               fmt.Printf("view room: no such room\n")
-
-               c.JSON(http.StatusForbidden, SERVER_RE{Status: "error", Reply: "not allowed"})
-
-               return
-       }
-
-       pu_len := len(p_users)
-
-       allowed := 0
-
-       user_index := -1
-
-       for i := 0; i < pu_len; i++ {
-
-               if p_users[i].User == userId {
-
-                       allowed = 1
-
-                       user_index = i
-
-                       break
-               }
-
-       }
-
-       if allowed != 1 {
-
-               fmt.Printf("view room: user not allowed\n")
-
-               c.JSON(http.StatusForbidden, SERVER_RE{Status: "error", Reply: "not allowed"})
-
-               return
-
-       }
-
-       var pj PeersJoin
-
-       pj.RoomName = roomId
-       pj.User = p_users[user_index].User
-       pj.UserKey = p_users[user_index].UserKey
-
-       jb, err := json.Marshal(pj)
-
-       if err != nil {
-
-               fmt.Printf("view room: marshal\n")
-
-               c.JSON(http.StatusInternalServerError, SERVER_RE{Status: "error", Reply: "failed to get room"})
-
-               return
-
-       }
-
-       c.HTML(200, "room.html", gin.H{
-               "room_code": string(jb),
-       })
-
-}
-
-func (t *ThreadSafeWriter) WriteJSON(v interface{}) error {
-       t.Lock()
-       defer t.Unlock()
-
-       return t.Conn.WriteJSON(v)
-}
-
-func AddChannelHandler(channelPath string, channelHandler func(w http.ResponseWriter, r *http.Request)) {
-
-       http.HandleFunc(channelPath, channelHandler)
-
-}
-
-func AddChannelCallback(channelFunction func()) {
-
-       CH_CALLBACKS = append(CH_CALLBACKS, channelFunction)
-}
-
-func StartAllChannelHandlers() {
-
-       callback_count := len(CH_CALLBACKS)
-
-       for i := 0; i < callback_count; i++ {
-
-               go CH_CALLBACKS[i]()
-
-       }
-
-       channel_addr := CHANNEL_ADDR + ":" + CHANNEL_PORT
-
-       log.Fatal(http.ListenAndServe(channel_addr, nil))
-
-}
diff --git a/0xgo/webrtc/webrtc/peers.go b/0xgo/webrtc/webrtc/peers.go
deleted file mode 100644 (file)
index 62db91a..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-package webrtc
-
-import (
-       "encoding/json"
-       "fmt"
-       "html"
-       "log"
-       "net/http"
-       "strings"
-       "sync"
-       "time"
-
-       "github.com/gin-gonic/gin"
-       "github.com/pion/rtcp"
-       "github.com/pion/webrtc/v4"
-)
-
-var URL string = "localhost"
-
-var PEERS_SIGNAL_PATH string
-
-var PEER_SIGNAL_ATTEMPT_SYNC int
-
-type PeersEntryStruct struct {
-       RoomName []string `json:"room_name"`
-}
-
-type PeersUserStruct struct {
-       UserKey string `json:"user_key"`
-       User    string `json:"user"`
-}
-
-type PeersCreate struct {
-       RoomName string   `json:"room_name"`
-       Users    []string `json:"users"`
-}
-
-type PeersJoin struct {
-       RoomName string `json:"room_name"`
-       User     string `json:"user"`
-       UserKey  string `json:"user_key"`
-}
-
-type ChatMessage struct {
-       User    string `json:"user"`
-       Message string `json:"message"`
-}
-
-var ROOMREG = make(map[string][]PeersUserStruct)
-
-func GetPeersSignalAddress(c *gin.Context) {
-
-       var s_addr string
-
-       s_addr = URL + ":" + CHANNEL_PORT + PEERS_SIGNAL_PATH
-
-       c.JSON(http.StatusOK, SERVER_RE{Status: "success", Reply: s_addr})
-
-}
-
-func CreatePeers(pc *PeersCreate) {
-
-       fmt.Println("create peers")
-
-       var p_create PeersCreate = *pc
-
-       ROOMREG[p_create.RoomName] = make([]PeersUserStruct, 0)
-
-       u_len := len(p_create.Users)
-
-       for i := 0; i < u_len; i++ {
-
-               ROOMREG[p_create.RoomName] = append(ROOMREG[p_create.RoomName], PeersUserStruct{
-                       UserKey: p_create.Users[i],
-                       User:    p_create.Users[i],
-               })
-
-       }
-
-       roomPeerConnections[p_create.RoomName] = []peerConnectionState{}
-
-       roomTrackLocals[p_create.RoomName] = nil
-
-       return
-
-}
-
-func roomJoinAuth(c *ThreadSafeWriter) (string, error) {
-
-       timeout_iter_count := 0
-
-       timeout_iter := TIMEOUT_SEC * 10
-
-       ticker := time.NewTicker(100 * time.Millisecond)
-
-       received_auth := make(chan RT_REQ_DATA)
-
-       got_auth := 0
-
-       var req RT_REQ_DATA
-
-       go func() {
-
-               auth_req := RT_REQ_DATA{}
-
-               err := c.ReadJSON(&auth_req)
-
-               if err != nil {
-
-                       log.Fatal("read auth:", err)
-                       return
-               }
-
-               received_auth <- auth_req
-
-       }()
-
-       for got_auth == 0 {
-
-               select {
-
-               case <-ticker.C:
-
-                       if timeout_iter_count <= timeout_iter {
-
-                               timeout_iter_count += 1
-
-                       } else {
-
-                               return "", fmt.Errorf("read auth: timed out")
-                       }
-
-               case a := <-received_auth:
-
-                       req = a
-
-                       got_auth = 1
-
-                       break
-               }
-
-       }
-
-       var pj PeersJoin
-
-       err := json.Unmarshal([]byte(req.Data), &pj)
-
-       if err != nil {
-
-               return "", fmt.Errorf("read auth: marshal: %s", err.Error())
-       }
-
-       p_users, okay := ROOMREG[pj.RoomName]
-
-       if !okay {
-
-               return "", fmt.Errorf("failed to get okay: %s", "no such room")
-       }
-
-       pu_len := len(p_users)
-
-       found := 0
-
-       for i := 0; i < pu_len; i++ {
-
-               if p_users[i].User == pj.User && p_users[i].UserKey == pj.UserKey {
-
-                       found = 1
-
-                       break
-
-               }
-
-       }
-
-       if found != 1 {
-
-               return "", fmt.Errorf("no matching user found")
-
-       }
-
-       return pj.User, nil
-}
-
-func RoomSignalHandler(w http.ResponseWriter, r *http.Request) {
-       // Upgrade HTTP request to Websocket
-
-       UPGRADER.CheckOrigin = func(r *http.Request) bool { return true }
-
-       unsafeConn, err := UPGRADER.Upgrade(w, r, nil)
-       if err != nil {
-               log.Printf("upgrade: %s\n", err.Error())
-               return
-       }
-
-       roomParam := strings.TrimPrefix(r.URL.Path, PEERS_SIGNAL_PATH)
-
-       log.Printf("room: %s\n", roomParam)
-
-       _, okay := roomPeerConnections[roomParam]
-
-       if !okay {
-
-               log.Printf("no such room: %s\n", roomParam)
-
-               return
-       }
-
-       c := &ThreadSafeWriter{unsafeConn, sync.Mutex{}}
-
-       // When this frame returns close the Websocket
-       defer c.Close() //nolint
-
-       thisUser, err := roomJoinAuth(c)
-
-       if err != nil {
-
-               log.Print("auth:", err)
-
-               return
-       }
-       log.Printf("auth success: user: %s, room: %s\n", thisUser, roomParam)
-
-       // Create new PeerConnection
-       peerConnection, err := api.NewPeerConnection(webrtc.Configuration{
-               ICEServers: []webrtc.ICEServer{
-                       {
-                               URLs:       []string{TURN_SERVER_ADDR[0].Addr},
-                               Username:   TURN_SERVER_ADDR[0].Id,
-                               Credential: TURN_SERVER_ADDR[0].Pw,
-                       },
-               },
-       })
-
-       if err != nil {
-               log.Print(err)
-               return
-       }
-
-       log.Print("new peerconnection added")
-
-       // When this frame returns close the PeerConnection
-       defer peerConnection.Close() //nolint
-
-       // Accept one audio and one video track incoming
-       for _, typ := range []webrtc.RTPCodecType{webrtc.RTPCodecTypeVideo, webrtc.RTPCodecTypeAudio} {
-               if _, err := peerConnection.AddTransceiverFromKind(typ, webrtc.RTPTransceiverInit{
-                       Direction: webrtc.RTPTransceiverDirectionRecvonly,
-               }); err != nil {
-                       log.Print(err)
-                       return
-               }
-       }
-
-       // Add our new PeerConnection to global list
-       ListLock.Lock()
-       roomPeerConnections[roomParam] = append(roomPeerConnections[roomParam], peerConnectionState{peerConnection, c})
-       ListLock.Unlock()
-
-       // Trickle ICE. Emit server candidate to client
-       peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) {
-
-               log.Printf("got ice candidate\n")
-
-               if i == nil {
-                       return
-               }
-
-               candidateStringEnc := Encode(i.ToJSON())
-
-               if writeErr := c.WriteJSON(&SIGNAL_INFO{
-                       Command: "candidate",
-                       Data:    candidateStringEnc,
-               }); writeErr != nil {
-                       log.Println(writeErr)
-               }
-
-               log.Printf("sent ice candidate\n")
-       })
-
-       // If PeerConnection is closed remove it from global list
-       peerConnection.OnConnectionStateChange(func(p webrtc.PeerConnectionState) {
-               switch p {
-               case webrtc.PeerConnectionStateFailed:
-                       log.Printf("on connection state change: %s \n", p.String())
-                       if err := peerConnection.Close(); err != nil {
-                               log.Print(err)
-                       }
-               case webrtc.PeerConnectionStateClosed:
-                       log.Printf("on connection state change: %s \n", p.String())
-                       signalPeerConnections(roomParam)
-               default:
-                       log.Printf("on connection state change: %s \n", p.String())
-               }
-       })
-
-       peerConnection.OnTrack(func(t *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
-               // Create a track to fan out our incoming video to all peers
-               trackLocal := addTrack(roomParam, t)
-               defer removeTrack(roomParam, trackLocal)
-
-               buf := make([]byte, 1500)
-               for {
-                       i, _, err := t.Read(buf)
-                       if err != nil {
-                               return
-                       }
-
-                       if _, err = trackLocal.Write(buf[:i]); err != nil {
-                               return
-                       }
-               }
-       })
-
-       // Signal for the new PeerConnection
-
-       signalPeerConnections(roomParam)
-
-       message := &SIGNAL_INFO{}
-       for {
-
-               _, raw, err := c.ReadMessage()
-               if err != nil {
-                       log.Println(err)
-                       return
-               } else if err := json.Unmarshal(raw, &message); err != nil {
-                       log.Println(err)
-                       return
-               }
-
-               log.Printf("got message: %s\n", message.Command)
-
-               switch message.Command {
-               case "candidate":
-
-                       log.Printf("got client ice candidate")
-
-                       candidate := webrtc.ICECandidateInit{}
-
-                       Decode(message.Data, &candidate)
-
-                       /*
-                               if err := json.Unmarshal([]byte(message.Data), &candidate); err != nil {
-                                       log.Println(err)
-                                       return
-                               }
-
-                       */
-                       if err := peerConnection.AddICECandidate(candidate); err != nil {
-                               log.Println(err)
-                               return
-                       }
-
-                       log.Printf("added client ice candidiate")
-
-               case "answer":
-                       answer := webrtc.SessionDescription{}
-
-                       Decode(message.Data, &answer)
-
-                       /*
-                               if err := json.Unmarshal([]byte(message.Data), &answer); err != nil {
-                                       log.Println(err)
-                                       return
-                               }
-                       */
-
-                       if err := peerConnection.SetRemoteDescription(answer); err != nil {
-                               log.Println(err)
-                               return
-                       }
-
-               case "chat":
-
-                       cm := ChatMessage{
-                               Message: html.EscapeString(message.Data),
-                               User:    thisUser,
-                       }
-
-                       jb, err := json.Marshal(cm)
-
-                       if err != nil {
-
-                               log.Println(err)
-
-                               return
-                       }
-
-                       message.Data = string(jb)
-
-                       broadcastPeerConnections(roomParam, message)
-
-               }
-       }
-}
-
-func dispatchKeyFrame(k string) {
-       ListLock.Lock()
-       defer ListLock.Unlock()
-
-       for i := range roomPeerConnections[k] {
-               for _, receiver := range roomPeerConnections[k][i].peerConnection.GetReceivers() {
-                       if receiver.Track() == nil {
-                               continue
-                       }
-
-                       _ = roomPeerConnections[k][i].peerConnection.WriteRTCP([]rtcp.Packet{
-                               &rtcp.PictureLossIndication{
-                                       MediaSSRC: uint32(receiver.Track().SSRC()),
-                               },
-                       })
-               }
-       }
-
-}
-
-func broadcastPeerConnections(roomName string, message *SIGNAL_INFO) {
-
-       for i := range roomPeerConnections[roomName] {
-
-               roomPeerConnections[roomName][i].websocket.WriteJSON(*message)
-
-       }
-
-}
-
-func signalPeerConnections(k string) {
-       ListLock.Lock()
-
-       defer func() {
-               ListLock.Unlock()
-               dispatchKeyFrame(k)
-       }()
-
-       for syncAttempt := 0; ; syncAttempt++ {
-               if syncAttempt == PEER_SIGNAL_ATTEMPT_SYNC {
-                       // We might be blocking a RemoveTrack or AddTrack
-                       go func() {
-                               time.Sleep(time.Second * 3)
-                               signalPeerConnections(k)
-                       }()
-                       return
-               }
-
-               if !attemptSync(k) {
-
-                       break
-               }
-       }
-}
-
-func attemptSync(k string) bool {
-
-       for i := range roomPeerConnections[k] {
-               if roomPeerConnections[k][i].peerConnection.ConnectionState() == webrtc.PeerConnectionStateClosed {
-                       roomPeerConnections[k] = append(roomPeerConnections[k][:i], roomPeerConnections[k][i+1:]...)
-                       return true // We modified the slice, start from the beginning
-               }
-
-               // map of sender we already are sending, so we don't double send
-               existingSenders := map[string]bool{}
-
-               for _, sender := range roomPeerConnections[k][i].peerConnection.GetSenders() {
-                       if sender.Track() == nil {
-                               continue
-                       }
-
-                       existingSenders[sender.Track().ID()] = true
-
-                       // If we have a RTPSender that doesn't map to a existing track remove and signal
-                       if _, ok := roomTrackLocals[k][sender.Track().ID()]; !ok {
-
-                               if err := roomPeerConnections[k][i].peerConnection.RemoveTrack(sender); err != nil {
-                                       return true
-                               }
-                       }
-               }
-
-               // Don't receive videos we are sending, make sure we don't have loopback
-
-               for _, receiver := range roomPeerConnections[k][i].peerConnection.GetReceivers() {
-                       if receiver.Track() == nil {
-                               continue
-                       }
-
-                       existingSenders[receiver.Track().ID()] = true
-
-               }
-
-               // Add all track we aren't sending yet to the PeerConnection
-               for trackID, t := range roomTrackLocals[k] {
-
-                       if _, ok := existingSenders[trackID]; !ok {
-
-                               if _, err := roomPeerConnections[k][i].peerConnection.AddTrack(t); err != nil {
-                                       return true
-                               }
-                       }
-               }
-
-               offer, err := roomPeerConnections[k][i].peerConnection.CreateOffer(nil)
-               if err != nil {
-                       return true
-               }
-
-               if err = roomPeerConnections[k][i].peerConnection.SetLocalDescription(offer); err != nil {
-                       return true
-               }
-
-               offerStringEnc := Encode(offer)
-
-               if err = roomPeerConnections[k][i].websocket.WriteJSON(&SIGNAL_INFO{
-                       Command: "offer",
-                       Data:    offerStringEnc,
-               }); err != nil {
-                       return true
-               }
-       }
-
-       return false
-}
diff --git a/0xgo/webrtc/webrtc/rtmp.go b/0xgo/webrtc/webrtc/rtmp.go
deleted file mode 100644 (file)
index 0261fa7..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-package webrtc
-
-import (
-       "bytes"
-       "encoding/binary"
-       "encoding/json"
-       "fmt"
-       "io"
-       "log"
-       "net"
-       "time"
-
-       "github.com/gin-gonic/gin"
-       "github.com/pion/webrtc/v4"
-       "github.com/pion/webrtc/v4/pkg/media"
-       "github.com/pkg/errors"
-
-       flvtag "github.com/yutopp/go-flv/tag"
-       "github.com/yutopp/go-rtmp"
-       rtmpmsg "github.com/yutopp/go-rtmp/message"
-)
-
-var RTP_RECEIVE_ADDR string = "0.0.0.0"
-
-var RTP_RECEIVE_PORT string
-
-var RTP_CONSUMERS = make(map[string]RTMPWebRTCPeer)
-
-const RTP_HEADER_LENGTH_FIELD = 4
-
-var TEST_KEY string = "foobar"
-
-var UDP_BUFFER_BYTE_SIZE int = 65536
-
-var RECV_STARTED int = 0
-
-type RTMPHandler struct {
-       rtmp.DefaultHandler
-       PublisherKey string
-}
-
-type RTMPWebRTCPeer struct {
-       peerConnection *webrtc.PeerConnection
-       videoTrack     *webrtc.TrackLocalStaticSample
-       audioTrack     *webrtc.TrackLocalStaticSample
-}
-
-type CCTVStruct struct {
-       Location     string `json:"location"`
-       StreamingKey string `json:"streaming_key"`
-       Description  string `json:"description"`
-}
-
-func RtmpOpen(c *gin.Context) {
-
-       log.Println("incoming rtmp open request")
-
-       peerConnection, err := api.NewPeerConnection(webrtc.Configuration{
-               ICEServers: []webrtc.ICEServer{
-                       {
-                               URLs:       []string{TURN_SERVER_ADDR[0].Addr},
-                               Username:   TURN_SERVER_ADDR[0].Id,
-                               Credential: TURN_SERVER_ADDR[0].Pw,
-                       },
-               },
-       })
-       if err != nil {
-               panic(err)
-       }
-       /*
-               peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
-                       fmt.Printf("Connection State has changed %s \n", connectionState.String())
-
-                       if connectionState == webrtc.ICEConnectionStateFailed {
-                               if closeErr := peerConnection.Close(); closeErr != nil {
-                                       panic(closeErr)
-                               }
-                       }
-               })
-       */
-       videoTrack, err := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH264}, "video", "pion")
-       if err != nil {
-               panic(err)
-       }
-       if _, err = peerConnection.AddTrack(videoTrack); err != nil {
-               panic(err)
-       }
-
-       audioTrack, err := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypePCMA}, "audio", "pion")
-       if err != nil {
-               panic(err)
-       }
-       if _, err = peerConnection.AddTrack(audioTrack); err != nil {
-               panic(err)
-       }
-
-       var req CLIENT_REQ
-
-       var offer webrtc.SessionDescription
-
-       if err := c.BindJSON(&req); err != nil {
-
-               panic(err)
-
-       }
-
-       err = json.Unmarshal([]byte(req.Data), &offer)
-
-       if err != nil {
-
-               panic(err)
-       }
-
-       if err := peerConnection.SetRemoteDescription(offer); err != nil {
-               panic(err)
-       }
-
-       gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
-       answer, err := peerConnection.CreateAnswer(nil)
-       if err != nil {
-               panic(err)
-       } else if err = peerConnection.SetLocalDescription(answer); err != nil {
-               panic(err)
-       }
-       <-gatherComplete
-
-       streamingKey, err := GetRandomHex(32)
-
-       if err != nil {
-
-               panic(err)
-       }
-
-       log.Printf("rtmp key: %s\n", streamingKey)
-
-       RTP_CONSUMERS[streamingKey] = RTMPWebRTCPeer{
-               peerConnection: peerConnection,
-               videoTrack:     videoTrack,
-               audioTrack:     audioTrack,
-       }
-
-       desc_b, err := json.Marshal(peerConnection.LocalDescription())
-
-       if err != nil {
-               panic(err)
-       }
-
-       var resp SERVER_RE
-
-       var cs CCTVStruct
-
-       cs.Location = "rtmp://" + URL + ":" + string(RTP_RECEIVE_PORT) + "/publish/" + streamingKey
-
-       cs.StreamingKey = streamingKey
-
-       cs.Description = string(desc_b)
-
-       cs_b, err := json.Marshal(cs)
-
-       if err != nil {
-
-               panic(err)
-
-       }
-
-       resp.Status = "success"
-       resp.Reply = string(cs_b)
-
-       c.JSON(200, resp)
-
-}
-
-func InitRTMPServer() {
-       log.Println("starting RTMP Server")
-
-       tcpAddr, err := net.ResolveTCPAddr("tcp", RTP_RECEIVE_ADDR+":"+RTP_RECEIVE_PORT)
-       if err != nil {
-               log.Panicf("Failed: %+v", err)
-       }
-
-       listener, err := net.ListenTCP("tcp", tcpAddr)
-       if err != nil {
-               log.Panicf("Failed: %+v", err)
-       }
-
-       srv := rtmp.NewServer(&rtmp.ServerConfig{
-               OnConnect: func(conn net.Conn) (io.ReadWriteCloser, *rtmp.ConnConfig) {
-                       return conn, &rtmp.ConnConfig{
-                               Handler: &RTMPHandler{},
-
-                               ControlState: rtmp.StreamControlStateConfig{
-                                       DefaultBandwidthWindowSize: 6 * 1024 * 1024 / 8,
-                               },
-                       }
-               },
-       })
-       if err := srv.Serve(listener); err != nil {
-               log.Panicf("Failed: %+v", err)
-       }
-}
-
-func (h *RTMPHandler) OnServe(conn *rtmp.Conn) {
-}
-
-func (h *RTMPHandler) OnConnect(timestamp uint32, cmd *rtmpmsg.NetConnectionConnect) error {
-       log.Printf("OnConnect: %#v", cmd)
-       return nil
-}
-
-func (h *RTMPHandler) OnCreateStream(timestamp uint32, cmd *rtmpmsg.NetConnectionCreateStream) error {
-       log.Printf("OnCreateStream: %#v", cmd)
-       return nil
-}
-
-func (h *RTMPHandler) OnPublish(ctx *rtmp.StreamContext, timestamp uint32, cmd *rtmpmsg.NetStreamPublish) error {
-       log.Printf("OnPublish: %#v", cmd)
-
-       if cmd.PublishingName == "" {
-
-               log.Printf("publishing name is empty")
-
-               return errors.New("publishing name is empty")
-       }
-
-       _, okay := RTP_CONSUMERS[cmd.PublishingName]
-
-       if !okay {
-
-               log.Printf("publishing name doesn't exist")
-
-               return errors.New("publishing name doesn't exist")
-
-       }
-
-       h.PublisherKey = cmd.PublishingName
-
-       return nil
-}
-
-func (h *RTMPHandler) OnAudio(timestamp uint32, payload io.Reader) error {
-       var audio flvtag.AudioData
-
-       consumer, okay := RTP_CONSUMERS[h.PublisherKey]
-
-       if !okay {
-
-               return fmt.Errorf("invalid publisher")
-
-       }
-
-       consumerAudioTrack := consumer.audioTrack
-
-       if err := flvtag.DecodeAudioData(payload, &audio); err != nil {
-               return err
-       }
-
-       data := new(bytes.Buffer)
-       if _, err := io.Copy(data, audio.Data); err != nil {
-               return err
-       }
-
-       return consumerAudioTrack.WriteSample(media.Sample{
-               Data:     data.Bytes(),
-               Duration: 128 * time.Millisecond,
-       })
-}
-
-func (h *RTMPHandler) OnVideo(timestamp uint32, payload io.Reader) error {
-       var video flvtag.VideoData
-
-       consumer, okay := RTP_CONSUMERS[h.PublisherKey]
-
-       if !okay {
-
-               return fmt.Errorf("invalid publisher")
-
-       }
-
-       consumerVideoTrack := consumer.videoTrack
-
-       if err := flvtag.DecodeVideoData(payload, &video); err != nil {
-               return err
-       }
-
-       data := new(bytes.Buffer)
-       if _, err := io.Copy(data, video.Data); err != nil {
-               return err
-       }
-
-       outBuf := []byte{}
-       videoBuffer := data.Bytes()
-       for offset := 0; offset < len(videoBuffer); {
-               bufferLength := int(binary.BigEndian.Uint32(videoBuffer[offset : offset+RTP_HEADER_LENGTH_FIELD]))
-               if offset+bufferLength >= len(videoBuffer) {
-                       break
-               }
-
-               offset += RTP_HEADER_LENGTH_FIELD
-               outBuf = append(outBuf, []byte{0x00, 0x00, 0x00, 0x01}...)
-               outBuf = append(outBuf, videoBuffer[offset:offset+bufferLength]...)
-
-               offset += int(bufferLength)
-       }
-
-       return consumerVideoTrack.WriteSample(media.Sample{
-               Data:     outBuf,
-               Duration: time.Second / 30,
-       })
-}
-
-func (h *RTMPHandler) OnClose() {
-       log.Printf("OnClose")
-}
diff --git a/0xgo/webrtc/webrtc/stream.go b/0xgo/webrtc/webrtc/stream.go
deleted file mode 100644 (file)
index acf5c33..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-package webrtc
-
-import (
-       "log"
-       "strings"
-       "time"
-
-       "github.com/gorilla/websocket"
-       "github.com/pion/ice/v3"
-       "github.com/pion/webrtc/v4"
-)
-
-var DEBUG bool = false
-
-var RTCP_PLI_INTERVAL time.Duration
-
-var UDP_MUX_PORT int
-
-var UDP_EPHEMERAL_PORT_MIN int
-
-var UDP_EPHEMERAL_PORT_MAX int
-
-var TIMEOUT_SEC int = 30
-
-var TURN_SERVER_ADDR []struct {
-       Addr string `json:"addr"`
-       Id   string `json:"id"`
-       Pw   string `json:"pw"`
-}
-
-var api *webrtc.API
-
-type SIGNAL_INFO struct {
-       Command string `json:"command"`
-       Status  string `json:"status"`
-       Data    string `json:"data"`
-}
-
-var UPGRADER = websocket.Upgrader{}
-
-var roomPeerConnections = make(map[string][]peerConnectionState)
-
-var roomTrackLocals = make(map[string]map[string]*webrtc.TrackLocalStaticRTP)
-
-type peerConnectionState struct {
-       peerConnection *webrtc.PeerConnection
-       websocket      *ThreadSafeWriter
-}
-
-func InitWebRTCApi() {
-
-       settingEngine := webrtc.SettingEngine{}
-
-       var filterFunc func(string) bool = func(ifname string) bool {
-
-               if strings.HasPrefix(ifname, "br-") {
-
-                       return false
-               } else if strings.HasPrefix(ifname, "vir") {
-
-                       return false
-               } else if strings.HasPrefix(ifname, "docker") {
-
-                       return false
-               }
-
-               return true
-
-       }
-
-       ifaceFilter := ice.UDPMuxFromPortWithInterfaceFilter(filterFunc)
-       mux, err := ice.NewMultiUDPMuxFromPort(UDP_MUX_PORT, ifaceFilter)
-
-       log.Println("creating webrtc api")
-
-       settingEngine.SetICEUDPMux(mux)
-       if err != nil {
-               panic(err)
-       }
-
-       log.Println("created webrtc api")
-
-       settingEngine.SetEphemeralUDPPortRange(uint16(UDP_EPHEMERAL_PORT_MIN), uint16(UDP_EPHEMERAL_PORT_MAX))
-
-       api = webrtc.NewAPI(webrtc.WithSettingEngine(settingEngine))
-
-}
-
-func SignalDispatcher() {
-
-       for range time.NewTicker(time.Second * RTCP_PLI_INTERVAL).C {
-
-               for k, _ := range roomPeerConnections {
-
-                       dispatchKeyFrame(k)
-               }
-
-       }
-}
-
-func addTrack(k string, t *webrtc.TrackRemote) *webrtc.TrackLocalStaticRTP {
-       ListLock.Lock()
-       defer func() {
-               ListLock.Unlock()
-               signalPeerConnections(k)
-       }()
-
-       trackLocal, err := webrtc.NewTrackLocalStaticRTP(t.Codec().RTPCodecCapability, t.ID(), t.StreamID())
-       if err != nil {
-               panic(err)
-       }
-
-       if roomTrackLocals[k] == nil {
-               roomTrackLocals[k] = make(map[string]*webrtc.TrackLocalStaticRTP)
-       }
-
-       roomTrackLocals[k][t.ID()] = trackLocal
-       return trackLocal
-}
-
-func removeTrack(k string, t *webrtc.TrackLocalStaticRTP) {
-       ListLock.Lock()
-       defer func() {
-               ListLock.Unlock()
-               signalPeerConnections(k)
-       }()
-
-       delete(roomTrackLocals, k)
-}
diff --git a/0xgo/webrtc/webrtc/utils.go b/0xgo/webrtc/webrtc/utils.go
deleted file mode 100644 (file)
index 8f469a5..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-package webrtc
-
-import (
-       "bytes"
-       "compress/gzip"
-       "crypto/rand"
-       "encoding/base64"
-       "encoding/hex"
-       "encoding/json"
-       "io"
-)
-
-var USE_COMPRESS bool = false
-
-func GetRandomHex(n int) (string, error) {
-       bytes := make([]byte, n)
-       if _, err := rand.Read(bytes); err != nil {
-               return "", err
-       }
-       return hex.EncodeToString(bytes), nil
-}
-
-func Encode(obj interface{}) string {
-       b, err := json.Marshal(obj)
-       if err != nil {
-               panic(err)
-       }
-
-       if USE_COMPRESS {
-               b = Zip(b)
-       }
-
-       return base64.StdEncoding.EncodeToString(b)
-}
-
-// Decode decodes the input from base64
-// It can optionally unzip the input after decoding
-func Decode(in string, obj interface{}) {
-       b, err := base64.StdEncoding.DecodeString(in)
-       if err != nil {
-               panic(err)
-       }
-
-       if USE_COMPRESS {
-               b = Unzip(b)
-       }
-
-       err = json.Unmarshal(b, obj)
-       if err != nil {
-               panic(err)
-       }
-}
-
-func Zip(in []byte) []byte {
-       var b bytes.Buffer
-       gz := gzip.NewWriter(&b)
-       _, err := gz.Write(in)
-       if err != nil {
-               panic(err)
-       }
-       err = gz.Flush()
-       if err != nil {
-               panic(err)
-       }
-       err = gz.Close()
-       if err != nil {
-               panic(err)
-       }
-       return b.Bytes()
-}
-
-func Unzip(in []byte) []byte {
-       var b bytes.Buffer
-       _, err := b.Write(in)
-       if err != nil {
-               panic(err)
-       }
-       r, err := gzip.NewReader(&b)
-       if err != nil {
-               panic(err)
-       }
-       res, err := io.ReadAll(r)
-       if err != nil {
-               panic(err)
-       }
-       return res
-}
diff --git a/0xgo/websocket/Makefile b/0xgo/websocket/Makefile
deleted file mode 100644 (file)
index 804008c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-all:
-
-       go build -o client/client.out ./client
-
-       go build -o server/server.out ./server
-
-
-
-
diff --git a/0xgo/websocket/certgen.sh b/0xgo/websocket/certgen.sh
deleted file mode 100755 (executable)
index bdb69b5..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-
-rm -r ./client/certs/*
-
-rm -r ./server/certs/*
-
-
-mkdir -p ./client/certs
-
-mkdir -p ./server/certs
-
-echo "root generating...."
-
-openssl genrsa -out ./client/certs/ca_priv.pem 4096
-
-openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem
-
-openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root"
-
-echo "server key pair, csr generating...."
-
-openssl genrsa -out ./server/certs/server.key 4096
-
-openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub
-
-openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr  -subj "/CN=localhost" 
-
-echo "signing requests for server...."
-
-openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem 
-
-
-echo "done!"
\ No newline at end of file
diff --git a/0xgo/websocket/client/certs/ca.pem b/0xgo/websocket/client/certs/ca.pem
deleted file mode 100644 (file)
index 0f067d6..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIE/zCCAuegAwIBAgIUFAZ/NqdKQOVulUfJJk7XN13AzzYwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODE3MDRaFw0zNDEwMzEwODE3
-MDRaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCVq7U00wHqr7bic/De8n6w/QWKZ8wPSVK0QXokpWGr3FVgWU4D6cDQGEZR
-A2qABWKG492a4yBM90NYKvVU6Ilfm0TxoBPqYzfdH0Txt15N/SnnV0DhGkJvDeqU
-pfvnZ2+5/iMpLn1ptU03h5Fz4iDTRzKV+xTkWF3vEMOasMfevseSaIJJNaMf97rv
-GsqBpRKF6eNqhewtz+gPf4J+2Y0019XCkEoWgIyFs2W3OZOmzNJI1XXXYZU3dsCS
-YDK0V0KpNYdlHtPCHQ1gtrbYiIhP8kIYhgbhyGXUSpQoDghUotE0SHK15MBI+oBu
-OkQB3+uGbtXw+HW6ReyI6Ks7ICrsQW+eiK/V9pOP6TaNnajRSg7sOBfdJCWOoBNv
-6OdfYKgMORjfu8FpPaEca9L+38e0texXCNZt9lWyfHmuRFHF0MnbqDS409AMzhUl
-upXbaFpdz6g7F4twAyFdB3pjSsO28toTqKIamXhl1+8D7byC9/sATEEm9/tO44GC
-+01Z63R3mazn+9fAjReMEQMw5HtXYHho24zR433VpbTXJ14YMWeJa1VZAw5CRVKi
-g5vxjUILIMu5DAi8KZdBjqKNgzT6v/KfjPMPenrHZYMqfXrttkmsU3kAUurOtVE8
-ppEN8fLY3LDONqwrG5hHZWTzeggFHtXSbK0dlhYZsBsPuCltSwIDAQABo1MwUTAd
-BgNVHQ4EFgQUWryFapRsKtm4PFy0xy7IciUzQGMwHwYDVR0jBBgwFoAUWryFapRs
-Ktm4PFy0xy7IciUzQGMwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
-AgEAU+dGb3c4G9XDPui89cvrGqJDSytoy6VENvEiF4Vl1KLwbq/nhaDXD5Gh1irr
-YmhZJwmV/6wx8hOA9A2ZipETucIGrJ/Zw82WBvJ76T7sXfDd16Pg1XUQVzl28W4/
-8T+BcVNVjSYIh6idQyoxCZ+AC+/ivVaOVwI4vJJh8J1Nlz2EbEw+A5qhkUlfwKOl
-beC9WTY2N3Csu/COn8qacPTjrsnCYpN7YkZ+iav0jZit7Mb73XD8FTI86aUt99VU
-/jLQ7oHQasX/WcBTTm7e8dsBM/C6PUVj4CbXSkGlXrJeqr09cBrR0Pq3vOVOBXII
-9xlczTrbjZlG4/8KULMS4jGE0Ruqer8ULjr/g+b2RRTM3FR0ixuwyiwGN1SjAjNX
-2p3FfP3IIo4VzYavfTvxKrOS4FDX+AFEruXLlt6Ufygg8woXyRPGsmRNtTNGElGl
-0qSP73zwZX6Uix88ohCMrYPYMb/tk1Buiw8cGiNPZeSP/3Q4sg3yC7yQm8aPIS+U
-J0Wwgm+bFMpsAO5B9DDeFRx2P2ygULSl1gMZnfHblhJSu563odrTVeOqeyF1kjSp
-evXyeTXX+SMKV2UUl2z15bk+T+8f6TMt2bYyvMhF1uK8kxWIfWMlg+2c4vAJRJhM
-gQ4YdEf2xD90PoEkoI6JNZFzEbViprDo68qYFnXHwK4haNE=
------END CERTIFICATE-----
diff --git a/0xgo/websocket/client/certs/ca_priv.pem b/0xgo/websocket/client/certs/ca_priv.pem
deleted file mode 100644 (file)
index bf7e8e4..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-g9mNZa3rFeivom6DV1fJp7UHkKlA4g==
------END PRIVATE KEY-----
diff --git a/0xgo/websocket/client/certs/ca_pub.pem b/0xgo/websocket/client/certs/ca_pub.pem
deleted file mode 100644 (file)
index 70f3dcd..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlau1NNMB6q+24nPw3vJ+
-sP0FimfMD0lStEF6JKVhq9xVYFlOA+nA0BhGUQNqgAVihuPdmuMgTPdDWCr1VOiJ
-X5tE8aAT6mM33R9E8bdeTf0p51dA4RpCbw3qlKX752dvuf4jKS59abVNN4eRc+Ig
-00cylfsU5Fhd7xDDmrDH3r7HkmiCSTWjH/e67xrKgaUShenjaoXsLc/oD3+CftmN
-NNfVwpBKFoCMhbNltzmTpszSSNV112GVN3bAkmAytFdCqTWHZR7Twh0NYLa22IiI
-T/JCGIYG4chl1EqUKA4IVKLRNEhyteTASPqAbjpEAd/rhm7V8Ph1ukXsiOirOyAq
-7EFvnoiv1faTj+k2jZ2o0UoO7DgX3SQljqATb+jnX2CoDDkY37vBaT2hHGvS/t/H
-tLXsVwjWbfZVsnx5rkRRxdDJ26g0uNPQDM4VJbqV22haXc+oOxeLcAMhXQd6Y0rD
-tvLaE6iiGpl4ZdfvA+28gvf7AExBJvf7TuOBgvtNWet0d5ms5/vXwI0XjBEDMOR7
-V2B4aNuM0eN91aW01ydeGDFniWtVWQMOQkVSooOb8Y1CCyDLuQwIvCmXQY6ijYM0
-+r/yn4zzD3p6x2WDKn167bZJrFN5AFLqzrVRPKaRDfHy2NywzjasKxuYR2Vk83oI
-BR7V0mytHZYWGbAbD7gpbUsCAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/websocket/client/main.go b/0xgo/websocket/client/main.go
deleted file mode 100644 (file)
index 6d4496f..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-package main
-
-import (
-       "crypto/tls"
-       "crypto/x509"
-       "fmt"
-       "log"
-       "os"
-
-       "github.com/gorilla/websocket"
-)
-
-type CommJSON struct {
-       Data string `json:"data"`
-}
-
-func run() error {
-
-       certpool := x509.NewCertPool()
-
-       file_ca, err := os.ReadFile("certs/ca.pem")
-
-       if err != nil {
-
-               return fmt.Errorf("failed to connect: read ca: %s", err.Error())
-       }
-
-       okay := certpool.AppendCertsFromPEM(file_ca)
-
-       if !okay {
-
-               return fmt.Errorf("failed to connect: add ca")
-       }
-
-       websocket.DefaultDialer.TLSClientConfig = &tls.Config{
-               RootCAs: certpool,
-       }
-
-       c, _, err := websocket.DefaultDialer.Dial("wss://localhost:8888/hello", nil)
-
-       if err != nil {
-
-               return fmt.Errorf("failed to connect: dial: %s", err.Error())
-       }
-
-       req := CommJSON{
-               Data: "hi",
-       }
-
-       resp := CommJSON{}
-
-       err = c.WriteJSON(req)
-
-       if err != nil {
-
-               return fmt.Errorf("failed to write: %s", err.Error())
-
-       }
-
-       err = c.ReadJSON(&resp)
-
-       if err != nil {
-
-               return fmt.Errorf("failed to read: %s", err.Error())
-       }
-
-       log.Printf("server data: %s\n", resp.Data)
-
-       return nil
-}
-
-func main() {
-
-       if err := run(); err != nil {
-
-               log.Fatal(err.Error())
-       }
-
-}
diff --git a/0xgo/websocket/server/certs/server.csr b/0xgo/websocket/server/certs/server.csr
deleted file mode 100644 (file)
index 1c45ad2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAt6ebQc1m2xodW+7YsSxrL5Wu2nk7bqI+mIfEL+D0
-6RUdEObrhBTZuatweBCM+NN2I6GpNuc9oIJcjksbAmDQfZm41DHQjLVEfvR/zd+i
-0ox5aZhK6wRqE5LKKprKoh69py9M0sWsBIUiSQvgD6rkznVQhiA4m4mz3s4e+Qbd
-LJThY8xGbF4NLmlcpUK9AVh9thMPuGYVGun/ihVN3wfQgiVWMsx+ZAaPARMBdu+I
-bLQLQbriZqMZz6EDS3BBJRbXedjyWtzc8nus4VXfe+X82hrxW11Qme3B/4I9o7re
-RF3i+DLvnZZkoK6IFgcV0SHg+7lCSQrNCVRac8N/qoR/lih5wULOh/g4cVrKVOrG
-JJa9r5u6YtpyGOY5m49J48xCpbq1Wmbc0VW9Y0PcZkJOrUd4c1wUDaiu9ZXpGUdl
-Den7HDl1h7SUKw5GJbyAk8ANR9kxwS3GrrZkpL6iGAKeA3dmH1AeG+jfT/BIBAOn
-14bKwZIVrHKQkKP8hcZeKPflJ7qFh75ZyfSMnuaItQG/vKhBIKkuiUl4RcHD5MEt
-BTH2OyzbWSbvxzLgvDdfdwZ4VVVSaW9iXnAb0SLCjXPURujtYsN5N5EUvrnQCAV9
-Yz2wFboBQimXLhebBjsZS+5dQChncN+kaGRcIuPKuIGUS7jRieTuBT+7HPqt1H6V
-Gh8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQANCCvGhAnI6lmBjKV0iE7G+rKV
-KHB7nG4p4TRQcmy6o1/wVyGMBRHvowtvvcmX0wsfPX92g7exJr7sD+OvesDcG6Zi
-/Ve/W3B3HKCiCXAQdfjHlunleqs8UtXlDg595OsnRdXM/lIG846oRvDtNEXSbga4
-vNyEcvsz96mzpekO+PYM9/txvMm4EA8XEdOw/Vfrfinw2Z2JHlbt/iyylbK9tDbj
-SGV5iK/8alSdUhGe5HFJKy2mv1VpOiTtpAF9jNp0ZZ2Dlz6PKdhVndZOiYHexMRT
-PTplq1khuokySRUxlXwhWva2rRFMWHtG/K9PLansvN1vT0i+fkp46kpyHEkzhljS
-zF7Epb+5iffjwqyLLfU3w6yVnuan4KLUmllS4WNoHirBPNSMgvgJ+1YN4zsyI0UR
-DENWQCMkxrQs8YiraavY5ATP2gQM/GbODa4ExX0ZT83IoffeqlXdS0Yjh84AeZ9m
-yv32VMLTm+gOa2CjOSDTvUSdcFvTMU2bmoxSnJnj+8r/dnL+uB6mciAO54jc3B9I
-0LBO0YYFYvIfmOU+aYYHriG9pf3B4GAwF6sbOQxhYGK2iaaBhf2y2RbOlENxcOza
-y+NHUc/H0gLJd8RJ+0WxedqxuCvz2cZ2myEl3+wSGyrR4XEDkJohIwH9j5ogf8a2
-NYzZl+hZcN1MeEe1mQ==
------END CERTIFICATE REQUEST-----
diff --git a/0xgo/websocket/server/certs/server.key b/0xgo/websocket/server/certs/server.key
deleted file mode 100644 (file)
index 22f4510..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-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
-SU4uK7xkjfLHk93yJH5gTzmq8Ol2
------END PRIVATE KEY-----
diff --git a/0xgo/websocket/server/certs/server.pem b/0xgo/websocket/server/certs/server.pem
deleted file mode 100644 (file)
index af41410..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFCTCCAvGgAwIBAgIUPv8CXUm2Dfb1zIxZic8wGRFtg9AwDQYJKoZIhvcNAQEL
-BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODE3MDVaFw0yNTExMDIwODE3
-MDVaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBALenm0HNZtsaHVvu2LEsay+Vrtp5O26iPpiHxC/g9OkVHRDm64QU
-2bmrcHgQjPjTdiOhqTbnPaCCXI5LGwJg0H2ZuNQx0Iy1RH70f83fotKMeWmYSusE
-ahOSyiqayqIevacvTNLFrASFIkkL4A+q5M51UIYgOJuJs97OHvkG3SyU4WPMRmxe
-DS5pXKVCvQFYfbYTD7hmFRrp/4oVTd8H0IIlVjLMfmQGjwETAXbviGy0C0G64maj
-Gc+hA0twQSUW13nY8lrc3PJ7rOFV33vl/Noa8VtdUJntwf+CPaO63kRd4vgy752W
-ZKCuiBYHFdEh4Pu5QkkKzQlUWnPDf6qEf5YoecFCzof4OHFaylTqxiSWva+bumLa
-chjmOZuPSePMQqW6tVpm3NFVvWND3GZCTq1HeHNcFA2orvWV6RlHZQ3p+xw5dYe0
-lCsORiW8gJPADUfZMcEtxq62ZKS+ohgCngN3Zh9QHhvo30/wSAQDp9eGysGSFaxy
-kJCj/IXGXij35Se6hYe+Wcn0jJ7miLUBv7yoQSCpLolJeEXBw+TBLQUx9jss21km
-78cy4Lw3X3cGeFVVUmlvYl5wG9Eiwo1z1Ebo7WLDeTeRFL650AgFfWM9sBW6AUIp
-ly4XmwY7GUvuXUAoZ3DfpGhkXCLjyriBlEu40Ynk7gU/uxz6rdR+lRofAgMBAAGj
-WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU1PBtM/5U3mtg85f5
-tgBP1JQ0y+0wHwYDVR0jBBgwFoAUWryFapRsKtm4PFy0xy7IciUzQGMwDQYJKoZI
-hvcNAQELBQADggIBAF1jwJ/Om0GcOnKGSJYaqxJydYyqcDhEgxODMGgNoDd2yNN8
-74E29G41cwZe3eATw2PstXXicFLZTz1Nhu457BqvGgxwz8lsKXreDNLczuTr6KTh
-+S/9CCONQ0bkLu3pJLdkfEEWxYNYyI9Nz35WJt24ESSyKBTxka7y3NBgVwGrN4Ys
-Tk8PtvgCVBRS1SD08WKoVhaD03M2wWJu2zvwcVqfYZxqgWxO+c5ElE/IF92WI3Gn
-jP8dL2qbsN7dGHi0JV9uzukc4PTVNnwdEodCDgufhcrtvTpR4KsGktHqzXXiQsGy
-hVMpx7yO+BCsjLCfCkbZXaXazp2PXLhIrAwhg3HFDbyESKJiAXQUGSlaNXD06UeT
-zZfHDl/8hswnFdJLhS2eAahAh7n0FRLGHHx0BIk/FLktzzAZouQlSw4HXm/710GZ
-8Z2agRv5g9e6bg7afks9grj4IhcZyCUNOQeZD/6+KBd97TqnfaYgFQzd192m+7eb
-WBbuLnx5INHzBjmbmLAUP4OZ+t5krOeWQMxUQOJUHtts0cs7K3EI2PB4pf+KRDy/
-Ij9KkYtOJ7WEmSy1JlR7vQEuAgZ80PLjHsjndJO+hOUdaqdkwgKHkkHdh9NQ8TQx
-AFyG5CSFHgGPPgJV2yaI/mIbzMxvuTnazhFyFjMXqWGyGxluchpmJWRfKxt6
------END CERTIFICATE-----
diff --git a/0xgo/websocket/server/certs/server.pub b/0xgo/websocket/server/certs/server.pub
deleted file mode 100644 (file)
index 0eec661..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt6ebQc1m2xodW+7YsSxr
-L5Wu2nk7bqI+mIfEL+D06RUdEObrhBTZuatweBCM+NN2I6GpNuc9oIJcjksbAmDQ
-fZm41DHQjLVEfvR/zd+i0ox5aZhK6wRqE5LKKprKoh69py9M0sWsBIUiSQvgD6rk
-znVQhiA4m4mz3s4e+QbdLJThY8xGbF4NLmlcpUK9AVh9thMPuGYVGun/ihVN3wfQ
-giVWMsx+ZAaPARMBdu+IbLQLQbriZqMZz6EDS3BBJRbXedjyWtzc8nus4VXfe+X8
-2hrxW11Qme3B/4I9o7reRF3i+DLvnZZkoK6IFgcV0SHg+7lCSQrNCVRac8N/qoR/
-lih5wULOh/g4cVrKVOrGJJa9r5u6YtpyGOY5m49J48xCpbq1Wmbc0VW9Y0PcZkJO
-rUd4c1wUDaiu9ZXpGUdlDen7HDl1h7SUKw5GJbyAk8ANR9kxwS3GrrZkpL6iGAKe
-A3dmH1AeG+jfT/BIBAOn14bKwZIVrHKQkKP8hcZeKPflJ7qFh75ZyfSMnuaItQG/
-vKhBIKkuiUl4RcHD5MEtBTH2OyzbWSbvxzLgvDdfdwZ4VVVSaW9iXnAb0SLCjXPU
-RujtYsN5N5EUvrnQCAV9Yz2wFboBQimXLhebBjsZS+5dQChncN+kaGRcIuPKuIGU
-S7jRieTuBT+7HPqt1H6VGh8CAwEAAQ==
------END PUBLIC KEY-----
diff --git a/0xgo/websocket/server/main.go b/0xgo/websocket/server/main.go
deleted file mode 100644 (file)
index e3bbe1d..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-package main
-
-import (
-       "log"
-       "net/http"
-       "time"
-
-       "github.com/gorilla/websocket"
-)
-
-type CommJSON struct {
-       Data string `json:"data"`
-}
-
-func clientHandler(w http.ResponseWriter, r *http.Request) {
-
-       log.Println("client access")
-
-       u := websocket.Upgrader{}
-
-       u.CheckOrigin = func(r *http.Request) bool { return true }
-
-       c, err := u.Upgrade(w, r, nil)
-       if err != nil {
-               log.Printf("client upgrade: %s\n", err.Error())
-               return
-       }
-
-       c.SetReadDeadline(time.Time{})
-
-       defer c.Close()
-
-       log.Printf("client accepted")
-
-       for {
-
-               req := CommJSON{}
-
-               resp := CommJSON{}
-
-               err := c.ReadJSON(&req)
-
-               if err != nil {
-
-                       log.Printf("client handle: client gone")
-
-                       _ = c.Close()
-
-                       return
-
-               }
-
-               log.Printf("client data: %s\n", req.Data)
-
-               resp.Data = req.Data
-
-               err = c.WriteJSON(resp)
-
-               if err != nil {
-
-                       log.Printf("failed to write: %s", err.Error())
-
-                       _ = c.Close()
-
-                       return
-               }
-
-       }
-
-}
-
-func run() error {
-
-       http.HandleFunc("/hello", clientHandler)
-
-       log.Fatal(http.ListenAndServeTLS("0.0.0.0:8888", "certs/server.pem", "certs/server.key", nil))
-
-       return nil
-}
-
-func main() {
-
-       if err := run(); err != nil {
-
-               log.Fatal(err.Error())
-       }
-
-}