From 6c3780fe4d0bcb2b96443e7e0dda8a6d5221a7cd Mon Sep 17 00:00:00 2001 From: devlights Date: Mon, 8 Jul 2024 07:55:14 +0000 Subject: [PATCH 01/22] Update godotenv/04.read --- examples/singleapp/godotenv/04.read/main.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/examples/singleapp/godotenv/04.read/main.go b/examples/singleapp/godotenv/04.read/main.go index 38e3b9e..92ec0d7 100644 --- a/examples/singleapp/godotenv/04.read/main.go +++ b/examples/singleapp/godotenv/04.read/main.go @@ -1,6 +1,8 @@ package main import ( + "os" + "github.com/joho/godotenv" "github.com/k0kubun/pp/v3" ) @@ -24,15 +26,19 @@ func run() error { } pp.Println(myEnv["HELLO"]) + if _, ok := os.LookupEnv("HELLO"); !ok { + pp.Println("環境変数側にHELLOは存在しない") + } return nil /* - $ task - task: [build] go build -o app . - task: [run] echo -n "HELLO=WORLD" > ./.env - task: [run] ./app - "WORLD" - task: [run] rm -f ./.env + $ task + task: [build] go build -o app . + task: [run] echo -n "HELLO=WORLD" > ./.env + task: [run] ./app + "WORLD" + "環境変数側にHELLOは存在しない" + task: [run] rm -f ./.env */ } From 75eb9fc61df257043037e7f5f53db213123ea3c0 Mon Sep 17 00:00:00 2001 From: devlights Date: Tue, 16 Jul 2024 06:27:46 +0000 Subject: [PATCH 02/22] Add examples/singleapp/pdf/01.split-pages --- .../singleapp/pdf/01.split-pages/.gitignore | 3 ++ .../singleapp/pdf/01.split-pages/Taskfile.yml | 20 ++++++++ examples/singleapp/pdf/01.split-pages/main.go | 49 +++++++++++++++++++ go.mod | 8 +++ go.sum | 16 ++++++ 5 files changed, 96 insertions(+) create mode 100644 examples/singleapp/pdf/01.split-pages/.gitignore create mode 100644 examples/singleapp/pdf/01.split-pages/Taskfile.yml create mode 100644 examples/singleapp/pdf/01.split-pages/main.go diff --git a/examples/singleapp/pdf/01.split-pages/.gitignore b/examples/singleapp/pdf/01.split-pages/.gitignore new file mode 100644 index 0000000..d86754b --- /dev/null +++ b/examples/singleapp/pdf/01.split-pages/.gitignore @@ -0,0 +1,3 @@ +*.pdf +app* +out/ diff --git a/examples/singleapp/pdf/01.split-pages/Taskfile.yml b/examples/singleapp/pdf/01.split-pages/Taskfile.yml new file mode 100644 index 0000000..a0256ec --- /dev/null +++ b/examples/singleapp/pdf/01.split-pages/Taskfile.yml @@ -0,0 +1,20 @@ +# https://taskfile.dev + +version: '3' + +vars: + IPA_PDF_URL: https://www.ipa.go.jp/security/vuln/websecurity/ug65p900000196e2-att/000017316.pdf + PDF_FILE: test.pdf + OUT_DIR: out + +tasks: + prepare: + cmds: + - wget -O {{.PDF_FILE}} {{.IPA_PDF_URL}} + build: + cmds: + - go build -o app{{.exeExt}} . + run: + cmds: + - mkdir -p {{.OUT_DIR}} + - ./app{{.exeExt}} -in {{.PDF_FILE}} -out {{.OUT_DIR}} diff --git a/examples/singleapp/pdf/01.split-pages/main.go b/examples/singleapp/pdf/01.split-pages/main.go new file mode 100644 index 0000000..5174338 --- /dev/null +++ b/examples/singleapp/pdf/01.split-pages/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "flag" + "fmt" + "log" + "os" + + "github.com/pdfcpu/pdfcpu/pkg/api" +) + +type ( + Args struct { + inFile string + outDir string + } +) + +var ( + args Args +) + +func init() { + log.SetFlags(log.Lmicroseconds) + + flag.StringVar(&args.inFile, "in", "", "input file") + flag.StringVar(&args.outDir, "out", "", "output dir") +} + +func main() { + flag.Parse() + + if args.inFile == "" || args.outDir == "" { + flag.PrintDefaults() + os.Exit(1) + } + + if err := run(); err != nil { + log.Fatal(err) + } +} + +func run() error { + if err := api.SplitFile(args.inFile, args.outDir, 1, nil); err != nil { + return fmt.Errorf("error splitting PDF: %w", err) + } + + return nil +} diff --git a/go.mod b/go.mod index b53b737..316e49b 100644 --- a/go.mod +++ b/go.mod @@ -14,15 +14,23 @@ require ( github.com/google/go-cmp v0.6.0 github.com/nokute78/go-bit/v2 v2.2.1 github.com/nxadm/tail v1.4.11 + github.com/pdfcpu/pdfcpu v0.8.0 github.com/skanehira/clipboard-image/v2 v2.0.0 golang.org/x/sync v0.7.0 ) require ( github.com/fatih/color v1.17.0 // indirect + github.com/hhrutter/lzw v1.0.0 // indirect + github.com/hhrutter/tiff v1.0.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + golang.org/x/image v0.15.0 // indirect golang.org/x/term v0.21.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) require ( diff --git a/go.sum b/go.sum index 9a56ae0..c481703 100644 --- a/go.sum +++ b/go.sum @@ -30,6 +30,10 @@ github.com/goccy/go-reflect v1.2.0/go.mod h1:n0oYZn8VcV2CkWTxi8B9QjkCoq6GTtCEdfm 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/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0= +github.com/hhrutter/lzw v1.0.0/go.mod h1:2HC6DJSn/n6iAZfgM3Pg+cP1KxeWc3ezG8bBqW5+WEo= +github.com/hhrutter/tiff v1.0.1 h1:MIus8caHU5U6823gx7C6jrfoEvfSTGtEFRiM8/LOzC0= +github.com/hhrutter/tiff v1.0.1/go.mod h1:zU/dNgDm0cMIa8y8YwcYBeuEEveI4B0owqHyiPpJPHc= github.com/integrii/flaggy v1.5.2 h1:bWV20MQEngo4hWhno3i5Z9ISPxLPKj9NOGNwTWb/8IQ= github.com/integrii/flaggy v1.5.2/go.mod h1:dO13u7SYuhk910nayCJ+s1DeAAGC1THCMj1uSFmwtQ8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -42,22 +46,31 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/nokute78/go-bit/v2 v2.2.1 h1:+y0ZSHdkCSUVdQ7NWQ1mG6RXbj9dHo8yGUE20o2EurQ= github.com/nokute78/go-bit/v2 v2.2.1/go.mod h1:YdJ4k4TQ0z7Q9Xah9cVMZDUQbjyH1ghC00kKi0h+XpA= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/pdfcpu/pdfcpu v0.8.0 h1:SuEB4uVsPFz1nb802r38YpFpj9TtZh/oB0bGG34IRZw= +github.com/pdfcpu/pdfcpu v0.8.0/go.mod h1:jj03y/KKrwigt5xCi8t7px2mATcKuOzkIOoCX62yMho= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/skanehira/clipboard-image/v2 v2.0.0 h1:Kp+RNOgIlgzDkP3EskwuBnM0Fk4sc+HgcWE5RC+PnNI= github.com/skanehira/clipboard-image/v2 v2.0.0/go.mod h1:NXSYl4FJinIUFKJfeP1lGz8DIEUYjnEqwdMZ777S1E0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= +golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -72,9 +85,12 @@ golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 8bc3107dde63343cd3fe7def7221f18b131b357c Mon Sep 17 00:00:00 2001 From: devlights Date: Tue, 16 Jul 2024 06:51:40 +0000 Subject: [PATCH 03/22] Add examples/singleapp/pdf/02.search-text --- .../singleapp/pdf/02.search-text/.gitignore | 2 + .../singleapp/pdf/02.search-text/Taskfile.yml | 15 +++ .../pdf/02.search-text/helloworld.pdf | Bin 0 -> 68362 bytes examples/singleapp/pdf/02.search-text/main.go | 93 ++++++++++++++++++ go.mod | 1 + go.sum | 2 + 6 files changed, 113 insertions(+) create mode 100644 examples/singleapp/pdf/02.search-text/.gitignore create mode 100644 examples/singleapp/pdf/02.search-text/Taskfile.yml create mode 100644 examples/singleapp/pdf/02.search-text/helloworld.pdf create mode 100644 examples/singleapp/pdf/02.search-text/main.go diff --git a/examples/singleapp/pdf/02.search-text/.gitignore b/examples/singleapp/pdf/02.search-text/.gitignore new file mode 100644 index 0000000..46406bc --- /dev/null +++ b/examples/singleapp/pdf/02.search-text/.gitignore @@ -0,0 +1,2 @@ +app* +out/ diff --git a/examples/singleapp/pdf/02.search-text/Taskfile.yml b/examples/singleapp/pdf/02.search-text/Taskfile.yml new file mode 100644 index 0000000..74c9859 --- /dev/null +++ b/examples/singleapp/pdf/02.search-text/Taskfile.yml @@ -0,0 +1,15 @@ +# https://taskfile.dev + +version: '3' + +vars: + PDF_FILE: helloworld.pdf + SEARCH_WORD: へろーわーるど + +tasks: + build: + cmds: + - go build -o app{{.exeExt}} . + run: + cmds: + - ./app{{.exeExt}} -in {{.PDF_FILE}} -word "{{.SEARCH_WORD}}" diff --git a/examples/singleapp/pdf/02.search-text/helloworld.pdf b/examples/singleapp/pdf/02.search-text/helloworld.pdf new file mode 100644 index 0000000000000000000000000000000000000000..db155822dcc6ab9b6cc1b7e1082ced545fcf5ea7 GIT binary patch literal 68362 zcmdqHbzGED*C>i0AdMi>B_JR%3`h+yNQ0DsN(smi0}?}bBPAUY5~HLjAq~>qozgLM z_fW$fe82ZQ?|Z)QoOAE*-oNhtZJuYxT5GSpa_?tgdnGH+1LPGZ!e^^M7b1Kh6CV={ z@_`6nTpaM)-OdakW9(#X4TAz+8AHt+nfTGungA7JTPVi|V@@W3s+p6qDH?(aDEfEi zt)-c(nZqjwGjlTsGh35848FSwFqjD6%+~ZTFxz&61<}YkmqLt{$(Ew2FSTN zDQGzvJDH&Y6tsYROz3(CgKh(v(Dg6JfL9JM6D>0*eE?cWfY)YjP5>nvv=pTO@sjz+ zOX-eDv>Z$=jiq63`e;->CP7g_UIBh4k>@~OQGNp^^ww;h&`dfqJ^#ll4lrlCf675o=nZQiV04ip-P$vr}0YQN~Bu6I)Gh-Vfe7Cgr*Q&}`K+<~LBgVDw0rpQB%kUDU zt*WqL%K^BD-z7L--%2K{YS&6@CJ61e#F)BHogXp4gfzdlpbi_DU)VKsW;N?;O0{-| zKZ@2q;BBvqUp7~I@tscQ{F&TBPs>clJ_Dm)5GYNoI3&hV4}i3#yoB)$tB} zr!sb&w(kK+s`WqVnHg}^{Xm)J{lZb-*n+sGNAm~Ay|vsm7~Y4~9~cG#+Bq|o;RZ$1 zzXX2=cgqx&KHpmHxo9NZ2823KCV0GM)&~I z#*Suxhoxm?<>chJbe&Z#ZA~m-Jep=uXKP~zfSfH_ua>q@fRZWNkSv|tc@)tW;%I_i z#Msv94%LxK=&y0ThP|=1yfXqO;9tA{SF5>$_{)kulkgp|0n`8R%DaJoviW~x=bzlm zD9PTfeYXkze}s#_yFd@WhAAk?sv6tP{z4Od=wD|DhizCLSO^de_Ewie{Eji+@Z>xj?loP0=1IDkKU}HFo<)hoAqs zz~6<#V{8pDK}Yw0!}>2d;=jX^k@}yo z{!7^ZYbyV=q}LA4W`FhYSLpKm|K<|%|67;PwzQS9b+r6X7x|xz3HUda0OTzl9Gzq= zj2-TDregd*+J9y5$OQariT}3G|B`V2o$|lg$bZY?|1WIhUsDY_Bbqv!m^pBuZZT9b zEHO+l957%Qj_5yg3@3~t3?>Y1blU;L6x}la+hY1};FvH3FoZA!(cUS8PE2Tr|NoSn zCCpY9oe4Q)LHvCD&-sLbLO{XiKmi~ZpC~&YAN$>*1!nrchxj)u_}BRTze%jyP7kI0Fk(qHF{L2GjGxai+88vI+jTm0?XJF1%l_2E+%}o_ zl+QTq&Ha#2-sda80&6Zcd}jQfhA|kcw%Op>J}EzQjRD?**GBoen4_5b<6!yItfcim zU)T2TFDbhNkh35DKLx%=rGXx_V2p2{ zt5yVcaP}+{Ra>abeB-^AS8<$nce$EOa&mjoPYtwi%wh=x;#VN{c z_E7T^yX;T?T2eDvis6(8gW)}o^0N~@c~RuNQ&-e}Sz{Q=(Qc!7y5Om|=Sm$|=zeV+ zu}wRGFJx```Sq{Jc!twuy$nX{(o(7aHl_ZJWdDp?|7)EH0fC|d|8W)qGVu$D3JDAS zyOMU&alI1WOmqyMC}Do%p5h$l_*(jl?*Ub|k`}W>iYdQnl)>WMdRDT$u!c^`R-pJ(XLpEsP(Yh{PY%U&KZ z)+eaJ-vS*6+hsh%_j+i`VTrFJXat~_NPW5IoLfZw%^h7DlY+dIs>61%2S5A6D!=7G zBfNBpYWo;C)f# z0TbYpVR{)m--LAi5UsWHT!r<@%ov=!zis42b&Uq)?=83ChN{#q)#&@QTCq6ZD1ma< z`h}sdwS~ha%=Wb#MQ-sP++$QuR}cW0<#+f31+d`}Ugr#mgbc8I?sOX6HXAFv4EP*s zo|AzMh$*VD0*e?Dh8*7})EHVU89Az1Djf@f>gb#ePzVUZr!y0a#)>7>!~@xq5mp6N9G z1lWb|+6b(0=En`Y|Dl|u{U^rbzPYNB+fZ9k+(a0>>N0PAu93)_!pHnNu2FPLRpn_G3%nk{58jiTu3=HipUMej~nXN~Lba--)&;_3eOWZ{grXMJ8vG3_5uP7)gp?eo(0y;Z;6 z(~KEfNx>@q@I3^Bd#sH|u1hM45&z23yvi%%v}g_tJKZfqq}yy!29Ulua#!e z2QK!#mlL~^uTkK+%7$Kb>RU%+{e|Nhl)mpaeNg(%4TX>HDa{j(&X*F+8O=X%JV>icPsI1uLh3thx!g{4WdN- zB0>A;DKXDI3B;#@G4Ace#_2{e^L2?CvB?Fa?13|1Tx13p+G>@~7CoOk_0I0q-2Oz_ zvhV5lM>BGvQ}Gw8pz;G?s&xOn zel&3xA6;fJ%cwf`HeCNt_Kjp~MSTA0aw5iY&81=@Nbb9%b9~RiS-n1_M9+4Cd!hH` zD6NBudjE~GzsBu~?|zY`$)GpMDCM7pUYptM&05`g9>CeyEI$6N&5&G~FSOhzd_lF? z{q@*B`wsJtitk%1=*_X67|R$uOzS^*+4v-Jf;~4d83IET^QX?kL_dwj2ladm= z(=7!9d=!P|WrplEsiz*Qla0)2arx!yG4(mG*247b$YOrAv2rF^z=q}vyluYQZe+J8 z;{$l=N)NVLw()P@Atzh%@ZmgOB?qf5llTh^JXzjZT3PD!^%f^_!z2+twkNn*k~BAm z8<8epy5sib;?6zcv$RVCv5NG|f!K5bv2~|`UG7cp{c;z15T$d*jJp(+9meN$9B*(t z7+)cNvFz({6o0!E-?-&dYJMCKz3z=4+~3*pS~2qZ5?&|QFBdO+NqFs%wD03Ixy`?D zBOdF{zdr+K7xKP3M!Mg+q!E@`s)f=vc>r!w2)ZyL|55ViLWE%5! zC2Zt9XJcBkwYBA{ChZT|Yf%Q5mUCHWdtl+9x#!L9b96)oLqt#+m~gb8zincZop7&l zLF${hn=18Mi@+qOc&H_;%i+kjE43`G4)>^no1J8Nyj-`(Q_&!Cn$STrF{{UIE}Yqs z_=4bQggc}_)-Yu?Ml41fDr!n`^cy`Oj}q-=wuJEW|rg|dv! zFw#r3cd4RlvXstNp&@5fcqSfGF^aDx`F8qFYLzL>$6MsiZc+V_{6WntCI{0*(16xDp-B9Z2qKN!nLO69 zY>YmDyIWJ3LN_C4?^U*-vcY7vV&WGXG&6#`U5;ftmsj+l!4S$<;J44=I~6JX)-XhN zf5HtwZdzDNJ}ok>F@^s~qnq;3HGRORbaTeavDkX6p=>(n!hmg8H|^T>STI5PPyHv7 zBSG$YN79pZD-k$&AQ5KPAP=Ws6JEFa)r7iPO7>DcXGEP0_Dv@L4yU-Fada&K8pV$q zn3m4&LBx&XCk@iz#hc>>;$WlE+S+Onqxb~_)3WT`?V)-uHZE?*>=XK4D$Z0WXKZPb z@{jE6d%X`eQMqP-e2%idm>&eV^=#wvz4!Ca^jtoF$xm#}=@4=Y9(!k&!tRn}Rxl+q zx<|Pl$YwS&1hx%&o@Tbm6=|sKYx&NanmrPpm=s>y#;-qHtnU(^SQ+4*ZI*B5d$^;g z$vnTpGn)Md#+fvs&*Q1gXSvD#O#)~C$x=N}t>SajKiUvn6&l{d8v?y-oBd{7rRC-T z7Pg8peyx#s{HUZ8(_Wvr43j?wBO$tHu}=9pDkI~G3rf?*)XbL9X1q8T$~2BmxkPZB zp|z;&h%&xfVpM)2=BAEC%9E5giNpN20|BF}-_!p5M0~eQ+;nj2bMT|{R%os%ZF*1r zlt8kSFv-M)w(3=sQnY%n{o7ty(Qm%)L22)+UiWl+^I)wa%o3$VSHlBn5w9cJ)YZ~0 zs9EzQEK}IR`w|09yH(@mdp61OZR1B9Ijgl2)8FUEn89>%dql^v!x3p}y&0u-7Iun> zVm#xe*DC=q(~FJ(Rfj#hh`k`;y*Yi*74e+9nD-nqM2NP7MY3$nrT*n7Q64&f)Mv=j zM_odiC7bpDtE%hAkN_SZH!^W72#UL^wU*huB_M@H_`X^&ab$#*eDEU0!8132*F8u} zhxbzl(vXv{_YUl;A3=DDmtWGKeD6ZaM@GPc-c=mFt2q=mx!yi7=$blQcmTXlhh2k5 zUfn`oZAi}NPwqofLq^UABnL8*0}sjV$;knMRiSh$je+jPfhz}YZX^h0y6XseVjso} z*Vrd&t`Ao}RrknwRb(=?9Z9wu#W`&)E>1;NbR7(i&CYxQBcoP@5 zbwNtyin+Q%hOane@iDPG737HhnEt8ya2Eo{lmH>7zLu#D#&$SoKkmdA2_VVm#1Y&mh#CxwMRA05x4%X(i6h*=*umgzM?h(cz3TA$nqFOE8`K#3*rey`+L8=V|HMN z2k$r;@{*RHY-vSkiqk5&X^N|JwSRoj{wAViJG&aMo^p9Pe5E`mR)INMiXj@s+QBQA zA$NPMs_8{-Gy8ej>iaQKxTr}xR|=G3@ON}2?q+S`rPj$!s_rLU1>jy4l4b1zch@L2 zr!9?(4XZ-4v{wG*S-_5QH_Ta+Ur7CBH9OnraDS#x+Y3(1+?~LWui2QLX2arKIsnfV zyOrv*O{tHh>l5AuqCjh`PMjA6advqKp*4LOIF$Mp)5Hj<)D6144FvJleyr#CW09a) zulCaMDBCHCj+19dd6O?bfh;Q_YFKeoq^pLZ=OPh zBOc|sjbBnZ_j(@o*z~!wo??$hn~7KECwOZ84u$gM?LJv!CgiG5Jll4slx`UL98ntx za{YBuoKRwrL-NWuxj~)3({aO4y1_hgBszIrd8>Mz|0tC|OReYVz0uaqlAk!|%DaSJ ztPsm=!aRK!CbHVs9q9ntpPx$)aX3@s0A_3(z0AxXQYe%{wK}GIbo6z}M?Q0zrNx(4 zYxMAMh?JQTECR*PO*3ke-4mH>#LSYI0C|IN6s-;Z5SeqltxDT9X0w&SG{DQg-JhqkT0$$h!KmX?1qOKwT7CCyw_g{wQmhF>p`Tjb=6HL^8TEoYSZWDcQ1} zzmUwe`g5pINKy2>?Ao{|ntzRR3vd?e(9(HyDypegt<%uWM1hn38qosQ%SRI38*Vbx zEFoDnmd~fkNy3+I_=M-K>A#fEp#U=@%vX~Olz;XskRt6He#`Qw7g4WSH+@+zO@`7R zP-aQSgBrd=M4cO)+uIfQ%&^Z(mp@Dwt^Dy_)2-5cI##UHe*N*7g5(L@Z!qhY*2`Hq zf06h#S=O5`$Jq`fk*|qIl-ZUnSA9e^yDz@eDbL(Lk;BPPEBf4{TRtckLX?k4dkwN& zv3?D?eWuTGwLvM>v6=Mkb~wh-$X&DObw*?cU-=PaD=8&A?n>{1-OUk}Ul)zCvRvnW z-SBCTrzb6_hh*~#@04hxcHTKl>c`2iB*Py#7CHF0Miq_nKYR#$71FQt+OOVHY-WFW z=74j=hj^zWE!Ob$2aTnP_(CoIm1dCo&mM&0I9^|E@}*`+8WzAWNwaZ;_081hXVwN3 zsC;}Qqlzzw$jTof7QXi{M7&D`-T?SIxBJvDHQH;ww*cOFV+s$UBH#WvbRU13{`y=< zQLserlsDmA7P9^`#47uXPOitJn+}?s-w#Bw89w+EZB;e;-)LTXcxYkfC_zhg{s^&m??E>qx*RnSF2)?Mgai~0w ztlz5LR9AUj|5V|J((Mm;|K}}XH=MJ&OP0&RyjvVZ5^1CMoF(bcZjQGQLMzEa9o!FX zFP~Y>$*@l_yF(;i0VYZ|I%Ib8Pf1TkV+A&qBh1o!bu<;MBv>0tf2%-<_=Cl)+81<3 zPbBegq_^0a)q|j#Pg|-=8Md*_OAM9ZR{7+Y8JsO%WND^J(-u< z0x#JGA0uR)vTX%-^oc6J=ic{b198RGYPSCVP|YRCFs&ckW+Rvl6KqqvtDMtH^&g@# zC4p~=4vqT5!hee!N#Pdodk!A{ul_JvNxD*7r^sUoX7yM?IC{r@fcc zMLC1;SY(|ZBvfy{F|qbdEe*ZB;Vz9+TTw;yFiGm0@WG#}*W(R?Narz0|F-E0+V3Ww zR^2r=pvWmjDw}!^M;x14%>^t`DoCIW@&&D@xyhh)7KaJII=e~8I>;ti${OjS&)HV_ z=fGEJFNvtpw)N@E!M4!#@5nNX?H3M@ZL+T_wU#zxPN#qMRysOEYC}=8JTsqTjx9{0 zt=s&C1~PZwW;hCahizIHj8+EouMeMbuy#~ERG$e=vMJW|!3yIkHzu%|BBNa&k-vsq z;XABv$+9?`C*!*MrwxM!Ea-hoi~K-98~W|S*7eDUqhpc&X`>*AIM8wr$l)7k!cbvW zUznUhs^&G9Gjb4=Dz$Y0cWw)DP8$bZL+KB-4aA(SmFX*UY*8=r#RRmsrY3(&@~u6a zF6vJLSu4&NnCG|3Pe??d@YcM7FHkrO+1I=`BH_;4$;bOKZUw|wh9QyVRwoeQl=gXb zc9#iLcD3>{-?Mt=l0xrljh!scGS@RaQ3yPYHToB0RGZLr$)U^HprLY#7!+m--b+od zFAIsClJ}&cuZc_7>GPp^CvD_FEe0L)0orIMx1reGxV%M^Tz0;ui}Ve6>>wa#olN$> z(`P$S;;f7%WkxOz7+19s7hOzegE2et>E2J~9))PIM2VZiOpOXfaFW}a!J@&hpf$&j&*fyyuyFda4ObD?V!MQ`wq_9hlnSo>m#hp>WxG_}%KO47 zKGQ}zghbSHvw@$1wVUtfh`sy+1-3;3L1&}Q^v-q)^aTr2*DH%Vpe|A4TiwM7f05(he0djboPr}bZPpX>>l=B{!yM=Q`r=G zZ&}nDLIk26Bv~6~Yf{zHyhzv=TDxnUi9@^y))i0MmIv&+WMU8x)RraK4>QQ&8;Cy8 z1;c-vOli0MLlP~CZLc8St>=PiRiSU$Yo2L9ds8`M1MyBwbaLSIVBZdFMd(Y; zd@}oKBk<)-hDSc&s}F`5!D^tYrlbtZDFS+mY`Uz`%ZJjRBF`^Bq>oK%z`jODHyC%Y z4)+hndU#3SkU8~kbk2_(y=YWs@_g%SRy1}?vYN_#{>w-3$OlQ;@~*!rb}>n{}7G)T@Z`#GXz9%Q)zXD5=0X`3aQ>c?>i!5M(I>L_y0*zvIne@K=S ztIYZq$M3EYh~+JDYQ6z{iRD^+k8#rP#(I%kD5g~~#z=@;&R57}K&JD;YVlg|x|y2@ zK}b~fjU8ZH9a6(6rA|D1zVn@#z0!{ zBKDa3WJfO(5W@1euJH7=y29FQpBF)ju98YqzX()WzTYN-Tx!FRm0`&IyP8~w2cLDi&z)0`Q%^+i^Yiaa zWtiB|BUy#LiH{N%Eey|dR7Yg@MxFR~!#$KnFS^2q$hDuxDm=GePZhaRO}lw|w3++4 zuOIw;F3>BvL_IYJ&vWtw41%2Gst>`&lmu#I1%U4zjUu1NUp?Q)bj^xT|L`=|f+07_ zeBhM;^gFfDSOgKQqeGCAnZ4CA0xoyM7ymp-t4ONT+tx*(=rhR5;%T1k-d7dWgo@!9 z`iX`%RJkBT=yt7c@NTj9?x>NbQJ`ADpQWft}~>* zND7Acax5>?)p)Rkg}=M0Sf0k-lk?_dHFS*)`HeqJ6oS;IJp9-zopQDK#L(g4%ig~YZ`{b^@|@?>2ldFyPd;0%0g_eUWoExYJeI@aaT&l=)Z7M}Mn3Y5f)fjA4x%y~yKu5MjH659@K ztySmNBcVxDgEQJ~y%$GuSf03+?aFmq^yZKDIRf2E?B_GZ4+o^8)lZhm>nRku+Son1 zAJ)$@16;e5t+$APMzqH!U#o-`~fsxkCAP9PWRbHQ+)?Jv}6u47;rwQ*ga$F^EEz zOroeabmQS-`^6uptbFNDFN=(7vsA>l)=^hCd@se^1L2k$_|P0Cg)vdlAp5zsLUgm^}O_c zug}>~bo7xU>U!IfrQ?u%rJT&SlBRs*3)a;usJi~4Mj_&?@aol5a|;QKbKG%si5oA!WMyqft_^rd@g!=be z`nbWW(xk#R+j|a|7((KHL?kCdN`4ZA?-?-*0DdIIzZ#l+%IOtTZV2DAVB%(_79?Sa zzV@Sg_9}|uigYmz=R-;so|4L=_l#J`pBOcA7;uUvD7NN_WZaQ-*?l#cIPLrB41ytQ zym&rVY(7uB$Rm%pn2L#9Xu|3WS;~rN-op-sW2N;siPf_;xf41}26(XATkvUfHG6F# zj-@8Z5aKwvTI>u&%Ygxn0*WzWl-wiAq_mW*8N_aCLpb1@wXRVm}02+gOn4pCy()oKGyk$);}nr{3caH_GE#8{)HHnTegAnNdtlE zS2aV1FGcY~bnzcU>7~c@@W#J&!h@$mNQD58q&t{ANuQWMpjT=%iJ8qKy&~1a9L$cG zBjCwXsiSF;464>*KKea0o=|LJ=%uysw5Lj=p_k*^RX^F20pf?ykc^P2C{i%z$-O~# zLn3b+NrgdhP}gKDP2|TvTqERoj%zLT-_NB`^6X1#)Qinb$Q4JL{o4Hk7ZKI4m^$1_oAId&hwTm#(;VnwFcM20gL;zWX-{{q2w%6eTtIRTpkm2%t?_kz4B*L5cMas zRS$rWkM&W%CSwm{-m&uIb^9m~=ZMcRJ={TmE^)YhLac~-#HuTE8~c5LV^};=R#)E%V>X>1XqP}G0!rX7d7nTh0n!9$4A>^zM3iQ5 zcv7e5f8H<#g)P@+A#{eHZ6Sg*#LSN3EwI{(WDRh_93-ac4jNCyf(`rt_GxKgQZ*o2mbZOeG7f?YxvaAPRA$> zY2Khbuu>GK64+wx0C$8cLuMzb&ILQXBTJHiXZ*pt5fm*qo1Nf}sZOdZDw8?jj(R~C zcS%b5!{g3RDaCXK6wdllZQ^4!WxzdaZhX-mZEc@!!fo%a-LC186c z!w~yrlnClcRAZ<~)^gjm{c@>WxW;musr}K7TO5jj%9Y#s+9<7zrcnU0J~3a0Lb>ELx`+VfvF_-1?WX;Jl&64t4>y+d!957GD7 z=E|pAJUEsFG&w}IGcJ!zZEO%9Y&wq#my;{mK$c>-rInT88_ETLDg%TjMl0hEU77X+ z+InqvbZ4?6e91~Pgm%1xxSmO1G+AJ~O$ z7O?1D%e;RnO@~lt)6>rQyecX$%RSSr&#sRXniw`rW!dHJxU?WS|9loy&NzsSALcRN zsTn(@*!BIYR`ACM%W+QSf_Tj%=CU;b{bh@PO>WHtmwx>R{mgK~0LSiB)LCSLFg2TT zz*N-z{bZ^K-7MsuYswH-&~jHBRXXc|Ygm3gtN)y`T@=}y6XwL1@7c-PV)2%{J`%)T zvtssj&M6)2k|X_OaZMp6S(jS^%(9(jsj-1IDzibMWpZQuy#Q8w|Y zLeHCDlOt!mc3#&{Ef*)mi+uCYX!Vk{ zM?(A*S$*KVgF{Y8#iMiXpho3bK=uJa{;1o0%85h>Xo1O@d3AvWkmJKrqv8tgNZXL* zM6#N+!^HE8S2T@D;Gna1bo}#v3UX*Xx!BOrzr#<>uD~Fjbd+Ktrxgl2VK6rEHWR!jfu`$_i~A0bgIK#fb4W`REN{g zwnqWn)RzYdp#rTEeZSPHy>xIq^#ZQ-iMQf0J%k22`=kmN-6VD4o(II z)_4EP=sS(5j}?W<6-meKn@;daUd1<0nEn!^Uf$~anb1wmk04Bm<|qzmUwOL#oW}F)Z{huV%xJV^yBEQuxJo1@7kU`#M4&fljp|^ zVJt|{74LNAkpzO=cDXXOdiSYqEnKeQ#g(LP>eP}CL7jqRU7IR+`>9WLBjyx5m9F)M zWo78i`Mpb#aJ`d?2}Mnw>ui@rxtFTo`qaH-b24Hi8_oMz{4fQP0 zup(OEoO;5CQ=#6@L4jMSiTgc#F*BP00TDK&=V;5a&+T zA5nC5QM1Li&qnSozIL|z0jhSKlM@<`4WBe1TGL<`8tc!4G3(%mhB>n-S{K<0T1^fO z-i*i2Oc)b7@8t9PSu4Gz2WQ(dsWG_y!1dWnv5dzx+Np^+dZTp2Ez6s0i1CShRhOP+ zkfzClLF7kB-N;JLo`O(k@2INS`f~HWNAO0Y|5<+m44uz5nPF$7juHp22VFX1q3#*k z>Btr4J&!IK@q-5>vz=wBAmEhD-m3pkkAv=v=-As_wY}A5cFzVW6owCd-leHsf$HhO zfyZ7WiuHxz8($ozy)pH0t(%DZ%z zy@}qNj8~YPr1_z6yX}3gCa~S4y*(V{A>!_BRJR5Dy1S+`zAykfA94XWpXoQIyNg*s zeNT6a88TiE&Tkp5doF%IwHx!;srOlM6I}G9wLbjt0#3VVOQeA1@B`-v5zKkA4vl)*W{Iz?Kc*%zp( z0~)u$v-6Z&pbdQZmhEQY>G!3i=kDZj2#K+n^9Kk7mAm?<_$1GxjC2lwXeK2wqCT{e zE9Srkkk+K!ce3`Ro4me_5@0_{uzr>pK#`!$(haY(!`iPXIdU+X*PF1&j-=~R_E};J zIf69K^Rl|G?V8N;IV3csHWhl!2&LAk4-ID26~79`a$kBef2)*ut~`CvX=wdNnPDji z*L?}gaOcmJX9UgXAM({NSk5ODqsBz2-M2&pGn5%UKhzE7c5rbRrDw{Y6qbbY14|y# z+O*};Oloy@3VFmBZZ+r##loa;dQ8ei>no2kf8fDvWF6tv_Q1zmce|w8D@Fv|tA?VK(lbn zdGrkmKHFdkIgf3<>Js)k5M;bME|FaDvGY5E1CLC!ea_ZHiZ5zdBx~w?1DJ1P%Z*KZ z#2g&zt`P@5XKRvTYN%rlBUx(SrN*?<-lx9AI&mDnqR!WWjrdJi*R(oV-p5xPR(TOo z7g>rTUwjkz&)3)=U+!Z}#lY*4-4fT)B?F@;j=re$h#Pk2>d0H0p4n8m=kW^dwcS0* z-|GtN*LHNb#SvGnuP~y>L&M)-_>e1Ng}ef{5VfHV3piyh}G8hBF2773ys?Z zy?;P`&&$`34%kGGvp9RN+R{&qaJDt=iaNTHq-g~cLE~?*2#@ej#W^^>XU*eRh}|WO ziP*UZ@m;jqYMlOv$JJ#RXpe`V>z_r4-EA2-t4}IMfJ*1Dd3`|0N0B_%4GchDGr3aL z-CtA>(C&B^3czc@4j@RzEhbo|4Qwx8ISxGVXL6S(H6m+Ey5G$nh=^}i9b39D1=x;- zVh_(TT@jyQ?1?^bB|@VibennX@gZ=jYAaG&qGk5LDNE9NBJiMLmta6K2IR#7(dEzr z(K;xgU?c4DhHku*PMpUl92n@8d}^hLQ>-h1#{T)@zmzqP^nYCqhVd6&AJKn zUDPEXzR(xv_DVgq5nUO3ttN(Q%#U+NranEX44azxSZw{HB0o%I=%ay9^ZJ)X2i5vM zGb7avTXIp;QJY2L2`1v_HgaH$N)4a;;)w;hNjfV=1vf&wp2^`0u*=6aa6yz6$0PDA zQZMl~2I=muF_ECITN%VH^PYecchlg<#lmk|7A62@g*xf=;SNLTS)&ITG*3eCAJ)pW zRgj9l=757CE}w{QK6sIV`6!1JL>&+v{HvW5$n;Sn_*Wh`>}5{HOZN1fh`hM9j5^#WxLcrQ>b)C-38jDwwO?mYN#nsw z*6ZgHyFuM}tVoHDnlAus4dCq!%N$juaIh6=OvHdiCuFrWdy;EXOBV1Ci}NXb5y&Ic>nI&b@tpVv(JqClcr#}9!YGLpZWBi{&I|40%4MGYSz zZ2S-$^4tX0-?neQ_wxcX^$P%c{ibj5{z1W7ko|{&yuxJu^YOm3p1ng`7 zsMcoyBfISCzJz)9-;9Mo#+UCOEIt-d>t)0HV6QQl+rXs8Gi9&L>^xz^S(P7@JdFv5 zHM{5w@#hjNsn{H95f4Y-R61$yne;JPeOutEdYZoqo@U5Inf}mQ6yQPTKDI7jrC;;v z+V|?I9=vCti%mQ&U0`_;i@I6#Q~mg%qJ!pxYN(c#UV+|{XknWEHqdXjXnR60Ai;;Z2NNFa#oZ? zSBl8kgxP;sLCsX(Rso&z=P7{)4fV5X^WreM|Le)Amd@GAXHprpM8S?SqTWgkcSgUVkNpWRfj2P7w znMrrbOm%9dgkOER_eX@`^soL(?}Xv?${V~VW?Et;jdQ^&p>M=o{(z${zn##N7rPuG z&KlW&dh2CQ4=QVlT^G=&+YCl%U19bpb5LqBsAydo2vta;ulU1idm{tF700T(cI__J z-dD}OtZJ=ugGrY z`R9jii9}ZtaK=YFzl+U{3L2x-GW_%|_@kst)23M0sMwGEViO6Gw;{OH<@s5WH5=-< zhxvhCbt@iQRYTDzr`daZO0RIm8&>S6GvxQ))77})(v=2MjZ1lL`Gq^x$z3t{m;hG5 z_tG43*Ju4nc94l6clXZdzE+s*0qw(+r!A-_2)>7IZxOHTbn2e8Z9k}E4Tz4Wqs)2$ z6vGq_Yf^mzZR3>gi_$5N@0DGA`tTZp(44M`R(x!=HvMRc_sKz=BKFP3oBKwLy6Uv< zHuqVybFCyx-+>|Hc;hJPhK^JcW$pD>uy!(C` zPUS=YK-q?`yH?XanY-H4i@mXuM9#~!V)2l%l$RGVvd(0+pu8a*+|7@St{GC^dI6xr zko0wp20o>9?aq9Gq>|q6fU5kmxWmbz$}oQWAEP8+Hde00M7stU)>`SsU^rC)JSVL= zppq-Kod$Br@e9`DlH&n`g2QJvv)b(E<4S#7AH`fC3+d=Hkl>NnWml5exxiz!*>(fx zhtajwKY90l5Qy!AB3vN$lO-YF33$hyD^(2yVy9dt&Fr^+(}+f+E)v4(4KBup+ly8s zmJEL{UK$`Pc-^!n+#sI>oah^{w^6yy7JHtTlm*r@#MB+c+b^EHy`6u8Px^ zZ+kW(F`m1(neazl82t0f>jn2_L#SvH%evoBj0`$r4skkDM_)`H|#(q89n4SirE}?%Z%M=lo?yUk<(6m>45M z(}*r_UOLrdsjU9z3pS?7okH_@`Dt2=kEKt1K_&<2@m%cPvmKQ+ zrRGGkaKvmTqUpqVx_{A+H5L}`4aD0DtUb$l`eQ#-`(i%0dw+1N_Sid4$rmm=*}vaz$ezZZpTb{U<(I>y+&`pULZ`;m z)AmBF&f;-TO*(JdwtSXf-a=y3>yuop%Y2jhy|UnL!-MCi3rgNx$Benel6&hjm#%zg zay@OeK2Dj8wL9#%`?qnYjV9uC-x&>OZ}rn~AQ(R8On-)6{8q)88m(!9OA*U5^4}wIOdrjuRub4T$^gSzJptZ>11L@OQt4?yzf0YT18u@ zcBNmwE7h`#vm_JfX&Ev}tg` zN@S0cK^V#q^I^S*%OJbIg;T9$W~kCL3Y3R}uBe~gGqa~@kqDNlT;lEseNCOOno=^(a|{sI@=1TQK<0w>6J%Pi1;g zexTeE8E~Iyr8s0ANL(aJs7@P9OQ_BClS-RtaiZ1k*4XQq&&NXqLmC4vJR8OerFn`X zY$XVWLFebnm$E{ZMq6h#J;}t?z1jU>#El)7h^^L*KE8`ZK2KV6SgYN)CGS2cthEtC zgkevC1rNgr7$<*2D#L=PVL`S$gmiT|E4oc9##EYPEHN;zMW3{NxPL|4jFPv-sk(RK zhVVh0-H-g*%Cd3r03==-ez`r?U8QjLi(%IKqZs4G7iZsWVr}YXXr#kHR$Ke<32UU9 zta;mq1V{Q+6@_jkg}f1xa~io21!$X9LM=l*hgz1Sg{wdJ^yA^mN4hVse%z0Y3y&gO zP_Vj(axG66tiAV15Py)aK1k@q`2@Ho9*#&=So(}RV&ddCWp`JRUg-KBf0dj_hVyb8 zfJZnNT1Rb-E!iEa`@llrX;-KOMFBR^qBga?qv=#!)5W6UL2d-{aFO+(BI0Asq8xP? z-utI+I`WzzJ1j=3#MnBzx~D8=WK`HQrr8FV$hq=*{*g^}BO(ve2(B1=3&Lb~y~f^TJHlU0?Tfn9A%#&u;=J3?-X<*ms0duj9+543YI4^ukxL8e&b6LoC(xoR zJB9!D3wA0@VT=aLkr4i!QAh+~ZA64s^F8YLi`|u|IABmEr)#%}f0@XVB)^&-VP%&{ zjX?+Jj9HooXELox+Hc(s%bnx$6|=N~`GG~Tf$NtYVLg~Y@lG%x|;J(?t z_?SAW1hpEG>R1uMB|6IW)AXJ5$B3UK@k^hu3U(a=D8A};%rctx$%L%gC#7`y&ooOm zH=3E+=jv*AC;Q@9VC{Ex8T$+r@;h9tVQ(y9b^sRDC^K>0cO;@6dp!+0p6q!JcLF<} zG(Zo%`4bOrl!vl%X3fCctH(AMvyR~Pq+3EaS})$L_xL)PI$3^Kyhzm!{sH?xvG1v; z*t0_SxtFiPC;a>(APx34%vlMJ&)Us_JrZMt*i|(Z(9byZreftn`rx4M*G>|7a5&=XD9xp zyF*6L%QAYo|K9IpL??oIGWyWT0qka&dmi2+W8`pvevj~dBkXGg-5B|+{Rai`m|0XDY{UD?K6 zZM!zc*oIHr##-C>{%z>?Hgt9ycew3Na1X%WY}*O={%x-UbZ#4a*v{QnqJWA>j(mdoF&bGS5!`Oqs6K3za$F-lWV{SAjBn>|tfzd`Li< zcUnGWRXeUd_;%I-$M<7zXJvaF{mQ;Q?tNwNOgvH9d(v{1{lOvMXnwilSIxh3{Gpov zc~ZM_w#I*R@Qtmr$7d_|!nnQ4y(;-}@BXP_nmXAmhMk@QcHigPgj0#`jyJx=^U^857Hh`{%^MH zRM2{>Q5{bdyK z`l_^Xs?M`jsCw_=e~!IJR^uFJAA6MSn(>Kgy5{gB=IELej<{OaJa$Bt*4xc9wf>g$ zjDxS0&7AX?He8S}P8%+ZUvlutvj2On?Em*r+1Av(+VDx*WNkb$Eqd^^GEef2+W6v; z)3hlu-lt919JxrF?n=H%o3^LT)TS5G|E^8%A6X;!dE=g!yDt4ZxxEQ7V^5p8-?Rc_ z&xVaXZ5D>|{NMX#p0DDk$n#x%iW=4)wN4G5l=I|Wc+_q3b{@4&-pz5>$@{pYT#YBi zZIf@YZI^ssr{~G{jomN*`1HTYKP&xk`EO5LFaJGBb@J~|@+dHW;=#Ak0>7jbC>T3& zjeR6|6a~={ z!6((yQ=d}vX=%5QJ+9X5nS8%mHl*D@_RLz#zEqdmUUw~5`=cp8sQt;53bj8Iw_EMc zrr)OaPi;l&I5PPpbxcglP{(m`RqB}HoS=?#({5771*s3JV@V1fg~_jsJ<%39J=Lzr zl}Q&W@}BK&b;T#T)pbomsk#PIK38}4xJ32#C!Blm6}Pp={Gh1M_L`!7NxK!jEB%cB z=RLO{;~La&OW&vd)VNR8e@J3P{R`qBQ~%Rx4h>8^HcJC@&Ur_JTM}zE_-5ip4V@YH zu!geIuh($WvCnFFSz_YYTX51lxF+G5gku6OFdsliGkXBEKJ!lDk-$!HK)547Ih#}| zn>1-YY1n+m%>P_?AK`oeYvo=Dt^$8O4YFIf9Y9){NB^Reh075h2e96fWuQ`c8$kNF zloTt!7w|jz{6_w7!p(rkg?|Af!n=Sr;adRdTk%W)_bFZg_}=0j!l?i#_Hw>!`A5Q` zfLj6O(o(PvkgAj&39>=1@FTzvqQZ#))~E;rez)SU{|ZH_wSwPSN$R(f^IG|ca2(Rx(9$MTZ z({MD(m1y?MmF`+8*F@`4xlVAclIyH4ij_UXx>MQbyEZ6$ zwn@hv>tjvpR0v=uBL-es}5N;TDZmBqr77>9LhVtF-t*D@luYI8W8$ zR~;L*c+cN{*5c2d7i&qfHCIbgtiNkXy49j3M}pj(xCaF zmhLq7YUw}BYqaz=^CKE~q6`SI2*%AaIyQ2trwdgafuURC}@t}f-z zcb=*IV(T&GFSqw7zs7o8`E`zf@^5u9?Jjf6*t@g&yQXhd{>vF~-B&W4%Ky-QwDLc8 zPF4QTW`*+in|CVzfLW)4WDC}Ny7{pRraFF7!E{%z3NCTJqJnwnPF6vYt55|Mj(1eB z(psT{dPji@Zg53aaJO}b3Ldmps^FhimkQptUQ@w4*6S*G-_@sOe|L0h**wP}RC>}! zT2^9iKKKxB)ZVLQH=lc)mfdGQsAbPthiTc{=D$^#Wc{SVagHlgILrK0g_paERCtx+ zc@?_MGgMgQ>Q`aer2PjU(d}^Z$Ia%GD!k9JU4=iG=cw=(*PsgjFh5h#A=c?CI>*|l zqVugcR5aU)Q_*GCEEQdDe^y0T*h^GYZho$!wT{bFbg%V-ivHm=RrIp?g^FI8^s$Ow zb@Zs{KN(Y0wBHP?_$sqN#bxGmDlT_?qv8sCRK=C%sEQk{OH|zC_(jE?=DjMu!SSw& zZ*{z=;^&=~ihp$EX?eW8Ps_)dUupTVPKTDCs2zz z{8A-L&3!7#cip6tBC|#%>#YY>(r6!0NziqRNT#>N4`p) zb0(|ggZWRXWUp(BO4F@RRcfDXS80LyjY`X0cdE3)x>co>uDevae#QiqHaKn^dvLh4 z*IK61sN-^#KAkaBrSI4eSLu7!pDO*)Y*gt_&RHt`#j>gNH|NVL{jc*lmC1Fl$`Tz9 zs4U6)Rb?sGiz-XA9#+}m)>@SvW4)=eN!DtWWjLBtmhU`IWreQ$R90t3RkqnasIuG5 zZ&miJ>wcBJWG_?M>t>hAJ~O{l+4okN%3~&PgHq^t61feO`pmyGVfOT zQu76sZ?t|;d4n@W<*m-yDj&2Dt9;mbzRGX3AEWXYox4^3u6?E|(#%0soMrx?idn7) zRgv#{NEIv1?^WS7m#X4c^FOM1)Om?2o^}kWVwYp5D&Da^P{o&ywW|0dXR=mYZ2qVf zIXNe4MS&xv6*bN`wW7_e*NP7FC#@KAZP$uD@jq$hq)G2+C&&#iK;KF{2$)fJAHw7SxINUN{2 zGPJtMO4sU7Tu*BCZ&sZu6J1ZMa!SUzsyx%NOO=)OQB_vENb2g$f2nfV9;?b-j;~bt zhU-~X?r}Y*%C9qKsqzo=fU3ruzmB~dT{UIgv#L7J{7qGv*7d5I@3>D@i(SvFYPsu0 zRjqUFR8^nz3RQh;cc|*u8Bwh{#(9<2oM`1~&72tnTC>KnN^9=2^0oGganEUOo@24r z7CEmbHMF0swcU1)*4{s3tJc2aBzyeR{O{N+)zy~ysH)F#x>S9hYnN({b zwAZO7=uA*ev*RY!ykt*P&2IaRs`-%h`dn(uip!CLFg@B7d9 z^Gn`x&$;K`d+s^so_kL6`Mg*2BdmX)oek?h#&~o6H#JvagVcB*Y*4cVYzQ&lk2$DO zjyb6DSFoX)I|dsT*k6YY7rE2WqO`vSEs4f7Xqjznhn6P$+t9Mq{tmRPWl3n+!EJ_? zy~bnE@;vjr|MA)_Z`V@L@*bB8Egx}TK+AXBpP}V@ZZ))0oC#Wa`|qH2D)S(;Zngg& zTKj9KKCpNxa~HIJ#U6u=8Qe>-aVpmd8y9e4uyHxl1sk^*AApT-vr^djCHFpT z{Dz$cn*MfEwi{R*iyka!j?L| z3AQY)eHhbiV;gMgW1faB9^(nva?*&n?^q?YOSx~MJ;?qcv=p#4h@d-;mp0`1>0O@Swv8@R);HJ)#Vtyb<5Y-QPC|5MGk7V>w())m}m zuyq%|96F}iKY@-4eg$+idk$RZxC7w&5Bs0M^&$5%bjmpn zI+e_e&>3X^96FQjUqELS8v&iw>=<;eX5WHNH>-or->{L;ImSi>p7suN!eN`*{$=2~ z?*{ux(c}mp{vsVpU_pq zMnl(vIZL3c(f%ED?cheBtB3D|uGj2;hpuS*ki`gsCTR!I^^j5Jx=$*&h0lf>^8t83g%b<5P zmkhnF_8+152s;6Kf6vB2@As?``c%eqfk*34;K!iP%2Lpm!E*;$Wv(JJ1DQ*?GU*xG>$>=Urlz`h1M1 zIgQ^9JEt4Z!_Hd!W!O2FN8Eh-71*`R?t@(;b=k1%ZtgMI^#F4Yc0I^0fn6t<^|0#& z_6yi`iL=A5D@-r+%h&|}D+2n%SPS$wJ4onX&6Pm^I^F~Qt*jgR5AcJ~{|Do5q5lJR z2>SodJOsOgj8DOChTjXj%lNxscR%-^uzQeAg5CG96Jhr&%tjcHIHWKTVSE|}l9^L5 zkjCtRfh_JHFffB{^}mo{;7Rr!7`Vtygn{RCs$k$%)(Zn~u=m5j+uSoS@RboSUmGvL zz@NE8Fz{Ed9R|MP_rbuo9472PIFvB(5AI7CxXcg3z*TNNcz~+{55bj!N5VV;9yvPz zo=|oYc)~b0cr@G+@aQ-fcw)H?;E6LPfXB%12M@)~0*{F+2Tv+j4W4xNDtIzDGk943 zfd35#o@{O|c%~a`z*E2+0nbeKA@G!O*T7TG;*hhrXTf7LcZVWsRIzqtn5aR*QKiH!% zIEA&s;BD;pFgVK*3WK$53Jlh$*x6CszY<3pHaDwqg7|vs}V7SJ7Iq>oe zCw~Tp=X04bTyJ~{hF2Ib!SEWR35M6l{TB?s#kyel!`vw_{C9Ry;7u87HV5{HGcB-R z%bbDz5yo2BpJ03$_BXQ^VE;Nc7xq8P=E44txER>~DZ3N)|CxW(|3;1dSGm_<|1~ZO z4oLXN;6M<677nO*5)P>2K7a!e>@qlDcEtMMym6q2e;f{!^H0Em*SV!|a0<5*4i>S~ z;Nb22c{sS3|1BK+hJOl1qWPy`WHK`iMpBKhzzFL+1|zfBd>E;9SLBnB%u@Vj|`Dfv92|EK0FXvu|!%sOshQm)g65#MN4htN9jV*#B!_2F2 z?eg>a4j_J z%~l~H{2iuk+{Z%Nh6z^)rx)_CHJCZECxoQwYs`|EA22PlpNHj7G0QM5%9x315w{<6 z9_B|_dGG8>%x~<^VlKna6jGKKgukG^6OxF3V%A`P6{CFiZ6Pq8hrum-8behs8-r2% z2SRxGu@Ls%fe|0S45K!-9^*3mrx=&<>o6qar5FZrf5NbZv-w{hv+X>y0;3LU5_IJ; z&-&kJ)AJ@Z12=EJ58Ns)33o{Dc3}_vT-fFQDeP!xg)Qt$+`=3LZei@}xSu#=xQjUC zxNSHT==!-n@WeBV0`I#i;L!iqu;qf2m7tS#1flcf?-QKo5y5Z1iY}A=7Cjle0R4^m zTl6xHNc1v%2)Y$^so)wIbPa4ax(3RE9)P_Y_J89@!WGLj3rqAI9GJu2gO<*Rp&9ef z3)UJW808T(Arj?<3t4<2QWzSHeI42gvqZ3qPE@~r5OvG0^uMDBHJXEZ4LbbcY^?a~QBYId*5R$L`olp_5et*{=k$y9Kgnq#&>o#25Bp{c559 zm{5O@$QMEn2++Ob(1Qp$)M7J)j*k}}8ZVp}FFZV6`1N?F(OGeOsri zV{7}C&25`Dwzh0ozi#cC)vH#nSbpcSrFS$hS=`jPsG#&-26(0jUk6KWsxBR`rcGX`aJ!pEL1IC?%`i%c1zF)vC(gu4dly-0GhMeB zX-AcyHdogdVo5z-B1|)}N7GpiEW)#K4t$H(`M|8go06;=&c;J5xrG& z>mJttn0l-0PLTvzSYO~AO~AUk$4vk>5laeK0Vx0`0f2G>HFJtoiu8uZZ2&H@Rw^Py zxDjU|;*{e!0vgYfew@ZXP@*`H4Q;gXtkhp)8>f~cPU*+FM4b3RIiT!qDw$1b3$m%n z5E7*=piUv?903qSz-cuRLKsG|)oc-cmT-***$jRP7gE^#9QM}yG<40}y3=aFX5tkG zDiA)CQ;J4OyOsXQ9xLlm>_wx5-C8f&q{LEWLTmKes_F#FdIMVIjL9j2MVRX7#Rl3r zs?)hw7hwZ^fcXQ|vAl zbk`tIL)0iKv5XQ@3o#9*;oRkFuZmt=;0>k=uGi#4zQ0B;)F|izFA?RJToGMlieBn& zq!*!`*edFp4NII2*tge4H+ZFVfnih%1!&dL1Wux86zo=ye_!DH7v)L1Yo#U}{2<;&f3~RWugo z&K25J&#iN-o9HGQ1!}Xo8*thNQ=`-1b~cIv#`ee>Oiq#gmzwrT7T9h zIzFNrhbAq;biA$#Q@ztvUyoQ^DrSSpE5o~KNrPZqf^)3!&!+-CG~OEARoE7sIHMd=8=8H#AL6G=#mC`%L^dZR_crO}Pn=v{!TO=byqYu%=7cilNyfNoKm z*jQVS&fBCh6`Mp=H=rd8LMRm=CwAl~46+D>*j_vmy(_Gv3lx^0FygVw>L*r;y&`9` z>%0}?Bnt7s!WyfW)MsI(FnMA&?g3I!QG)PfmQob24Xw%`v^IIk>bih>#P+2^Q^UBz z{LK&}x=vy9GLQ2c?B~}%s9ZeM;t^!=DlMpJuM~OkS1W|+{A2`JMyCC3BqF>131AtA zG6ibHiPQ%Gsb#S^C;z5p61*jD=MA)Q8qWHjuE1Tho)%80Qy5+;4kWY?yLS6K7Q`hN zDsLrDcp!wiHAbuS*Y_*N%nKW2c-A7?`iN$&K&p%HY3ckC$K65>u#~Z zdxz87Eo(0d8@3rXNYs_@k_PL?;QlIB#LP$ zMjHwgAPT%dmk`1QaB0ycUJ}9UCHfQzgp$q@Zb5X`C`l;L+Y8P}6QV{(?{2Jb@^7ao zWymt*3IU859X7VGu;R$)yl#wDo~>fF~WWny=& ze%nY4TwAQlTefm5|968a1KRWkiFJZEN>u*)p(K6RH z5Gt%tbz(T;wa8jFGMOFV5@oXmS*Z|)R*D!A#O0l)?F*bosN&~nK2yMPQV2UVdrxKM~+guN+9Fo0Cl zZ~Mi7&k@6k8w4Ywgr#^RHd>IqV%#OHvW~YMm)jC?Ne9~AgsrY?N30;Ji^5LgCGajw zGz+Ie5S=)hVB@Q-fnc>=(C#*|yKPpJX(`58g#<=hxKS<@wknfAtxOc1oErn4r40?D z9}<&|XpE(13lT2H>9oc~IO^oPJkD;wF!0wcBLU zgkzQ4q{Vc=+a-!OP)Cb6+{NXI0V-hzUAQ+=l1)7@(?=bf*-ZVacrSH-v5&g1*hSr2f*PLYqlWUDseO4q>aJWLwKsQ+ z+LPm>2D6NmC(B0-WQ|d~r~0V=>}G0LwvXD$`zSZ(qx#r|R4+S5^{_swn{`oLnPb$B zOdqwK@lo5DF{(4&N4YY5R7YAKwROq~s(p%&+LGp@HmBxMZK=)Frc@ubG4%x1no3hG zsS(tM$v$fRwViYU>!a%Gyk=oHRzQnB=3DPg+RbIfXB%h#~lYP{Zi9Txa#D!E-l8gmdr*60SsD&0AwSZPp^Ajx8 zyaXRLmv&H2+DFyJ+o(D5V^nRtkE)4prmEv7Q&lD(HQPK!RhoTNh0#YjC?92y+e^)g z^HI0OjZx)g;nd7xD>b8_j4CV`qY7+e)O1@Um77yWP0ebiva=E?j?JUkd_&B9CeuY_ z5?IJcKS8C(hEP+|PEcv7@lF~l{|5bni%Dyk`nVM+k(X4 z=&1P?y_8CzBPm*rR>}~N#Y=0>6rZl4P7|-6COS?N z6{m^Q#HkuMMbw`nP7%@?^{c*awewY{bj;T+b&fg1#?rIfqelUL_8hp+G3qpazUb>Foi93%zDP)1E*bGS z;el#v`B{Z;cDYwsG0#i%dM#DL6%!q=yw?jgbLZ8K62xw2SARdm6_k53s_ITj>g(eQ zoaNpop=`5>WtULaXs|qrnRsR0s8q7sxelygwTc(vBNjy5jaWpj-*5wJ-FoY~b$Gen z!b;rmy`d)&ApBsU=s(~(cAS2^)h|B8zpuW50&Yh9vO%JEL))Die0vg~!I05@0ipU`f zVLH@96AXa|ieVZI!o5(1?S|kX+?edxPZ{h)Y(4CPemDppKrU1xMgp^80P8BC7W;ny zo`ef|smSjk zyjLKH#W-FgwBr~8-zSjsOqhx?C`0}?!4AYqka9N6h3#102V+;>^L-EhtB>pl$dQ*o z&b7I+-$9OmfH7aDB2)ee_9=%TP(v6{wvZ4qOr{`}GL-~m5=cwS48Q)Jk{)3WHxp)p z2qy@0kYr50>^*d+I}@#CcWBml_k5bZkB)Y<7~x@D_>k0lxN^|pG1E( zTVjyJ0dWIM@=>zVIwgII@RR3TU?wie!yy7_&^{)WhUz8+g-Rele@vU5HYJ_V>2-8G z%dw;+k!3P7B6SKA6pdiPr zv))c@CUpJDt5zlVU%PxYIWayx18d{0*>s%1!GILV1IR%L+GWU@Sak$WKR@s%^Dy-rswnKt!_7d{WFOv;*KP0&Z~+o~h`!Yl8n z-FCRysea=Pb$K?+(8i`t{neKv=QP*${kEk!JWt(Fv*M#Uq0f<&(owSFv01{;(q&Mf zXhgqo2PE5c$xRGX1oKF#lPsK0#Tkl}sY+CNrtrzfFHSfct&WJw%-}P`Ng(Hu5mEZU zH&RC@((#ITapD{+p$WO5lO!^Upd~t-WGMe8H%~v(o}Mlyx}Dh7JfTBa(~^7o@27OJ7)k@}Cx5Cho+6^7-t?QhcJHtk&zrS+t0O6?R?<$a=rtuv zbrWP!xuMtIJ%3gISd>vhMny|h`iQmqS(7Y#IxhXScU}J0)n}es?rcu4Ane8LhQM4U zcS$}43$CL{wrG_~8=H^_ZOaoAwXst+E{|1cG%3!53IP9sxZO?zSd-H~-Jz*-9yqHuPR@$;=72!IV3gqN~ zv&BrGUQ$p%mH=dsC4_d0PLiP_&F#xcg}}Z()32oK8uGKQ@SFEdOF-0~pp@`i)Q;C* z*RDL0sBgXKwwFr6LY8QCo6BzN(COxfX(BT_wpUoy>g8H(hi&$DjV50g9;DTTC(jIz zS$il-B}sasqTKaS=b1QzN)i<%l}1HL6h^a`$SX;1UXy?OwabqheyWix6&mW4WP3+) zvNSeI7Ckle%GW4?WGEmmqXZHl#uhBvYMh!d#HrBf=8w-c;wFB>Z#AtqG@2>6(}wTs&H**X<==V)@#8E0Tv~#&i zQ2&@!kcK`xE$t`G2RIScd@CdPrJ9Mp?yZc;kYtLBv{*DL**T%%OEsF!6}6kS+Pp|j zuudBlUm6iJ&>k(7DBg_-k4jHT&_>*5U-;L@VvP!kPLP*QB2y~D6RR2kR+sZcA6|Uu0Ge8s|=D&PTHPjj4jt{cT6vJX>`*g!qRWo#VOUX;j<@)$3@4L zXf-=>W^UGKr$=Zq=SLF@=ln3Wg&eH5vr4actS?p+zDvcCVBC$zZY z&m+z_)$nR!{r$8_Mn*@9RFV*tA$j+;zhp1gnG3A%tVy01sh5v;AqfeNwd}d}V+A<_ z?UU&9y+gLj^Fa?up!tnj4bdjRxNOYt3`B#Fkdfo@5hD==5pk2rlH|0Q$jL@Iub0P3 z4ce7i<~WNfJuBXrXqM-j3{zvTt-SX4w@atd`kWcvL}TWg{fQec??^PK^JXMTLqgPa z0Y)yPH$^V@-zsvs|Nk~}nfU)Da?wG7ui-h#gTY|+~2QCpmk6J|IkKo9|<$0ye>d?wirJPiS zIzrX=QWJKl)Fok|(y$g=962FcqRSc#B{j;(h*Y&Yze>MVrJ5NWDpM)dv(%vrZ>z`( zj;f0e*T$4b%l;-6Cl=9 zO|S_g6O$quBa`TV8JP(C)%9qEzC|>mzrpQEei4~0(y2m2ShGemGACM|T3T5A(wh42 z4WsTRb+|PrLO*o1t8`jz>58^;v)Lh^7XHN#S0lXC1YFoLVY-OvCFPTnhF#Bm?rvL5 z+}RzUERT+rnXVq_S@ZDuJLfJOFwQAx0h z-0;b(8}I09J^4s;sZ6B`Klegc+SFy;ExO>0O#7okO!D-aIUc1dNF|q!4Rt>Aet*aA zrVSDPn1pJYW((N&Urk+QL^G#PF6f2jKw_^7ID{j<+|&YU@O<~-+_$-FX2 zCX-2KGMP-ClP4jB00BaXfQWz~FA*^)q9P(9P!$#ZYcI9xMeVPpEww`H>)IE!YHe#R zwY|!})mFu}x3#_2T5`DOF*BJ-g3{uxze@xTnUk5b*Is+=Z>?|bPnO-(+P{@$=Q8Rq zUxpQSZ?bD>Wd4k;hikVV_WB8gcc7?4fJu+{2uSuvFWJ;Fl7%A$uOK_NM?$z;!aPa- z)SuPW4P*Vj z#fE3z(Ejg?06M15{~{HQ)az&@T2&QQ(MaOF(a0n$^3EhIvP{Jy(+5;6GRO<86l~`m zyQW4WuxKC=qC~?XI|4ZzvQ>M26!IdcRUEQRU3X#&KCi9GhYxvi6Fcm|`>Ly9R>L7` zOxDs$1CX?-NaPCuR3>)>>-OHVg4t~Y@U*70% zx#*8em%8W+?f}Ox^SM=Uq2dRJ1Y?ZF&5kH1yB0()eP|@IMdUCwh^a4$2wp4BQ{EUF z{4(IC$*m+J8s8=>0;9_8wVD;1;5(3)k#$fhM1GaVA$_9#SU${ZQ?5Ch@ntwb0RG^o z%9zb7a?xazvj|lQ@AZrJZS>hnWYL#SrQs7{#A@zqjRm}|6hVgLD5p7tW>KxsVgp_6<+Ybq|a5aIJp2PAiC?FkN_iv;#DkZEwNGJ%C103 zmH({|D`>OC34Y(}-;Z;wYbN~dTCuCS+AD@VyB0>m%AddI6L_~ru=#!osIKTvb^TR9 z2a#W5o1iLari!*&(oG(3lTiiJ3K8{uy-|B23O1f3lG~WG>p{($1yRVY)7;H@a30Ry z4);C%5M`CfttV-l#chv-C^O8njdXiOcPq`}$`#4}E>1$k&eRGOp_2*ciiRyAmv{x&qzVrDz zSk}V)+v|6|N70c6yC9lOUM&Oah2B7JK~Jb-u2-WU6_7=TDP~SO%-Mmf|LIj2b*jUD zLefVLBgHVTK2$%xcM&k)`1%yb*9CC+FH3udkNgnOls%1DI7DQtI2%m`8seUdfiq#V z+q|h-pJ0h9I7#k%-61eX!K-v_81?i!`C)JuXy^_&e2keSFrPbMaifAGR^bu_%Pi$I zSfXrFPTM442df!e^{2rzCy@KGLr_v1M^$;H+bOUNSE-Fd`(;d`5u*G?{*jwEIhZOM zfC0zU;c>h^3=oEKw5gHCI9nARcGp$<0r>Y4S+aPV>s)@UZ2#VGu@-@T{>qgS_f1r} z|HyUh$jI+s?Du&~NDJ$C`5Xc!FtrhvotJ8qyOl?jW8YypGY1548E6B8458&x$IrZn z{1M*)#h?~-9~O@G^|m%+^{rU04y!%BAo4=a^-}e=94ah$c-&U7KKN{~G6s!g|2BRG zJc6e}F2PIz9CisQK~3>z_qR(Nf*#(yhiAB8)#%SFyGgONvnA?^&hE~HWp`qbM0S0! zTrqdeYK#g_$+-<2ga;ZuqHNNTNIX*RkSv|U%7^~;{-tH2we>-`YC#olW=u`>)ltw! z)KpbR!ZV_{iP7Q>3pOFYM^3A`jXGmxFypt|Nr)kHLBJTYzT}O^HkP~bH8C`R+uQ5L zz8h)@_5Z(@D!iU(U4~#Sn9UgrxLDf6$)s!EtQ2y(O?hFDqpGL>04Phh&%By0bx@({ zjp?MjDX?x~ySg4Wo%suLCyqjc&{8Ozu?fNxJ7BbWB-N&Z|qvr)4Z@h8d}mhH@0TM@^38Y z=!&nj?U7j4R#^@n20z1t)5X7ctZq&DUEapBa&OCo zY*|BfHJK?JpIF0i`ma2eU@>jQ1#RpEd(@{OZF4RD?pf@N6TtDnv7HNMjNLCgz#GqA zc16n^f6!9G*jO*^1+}|yhN>885E!1Rt`4~<+Fxn+&YCY+Xx5);U}b8?fo;9;fp@pA zxohmrfVw&Mffqn@Tl;nCc8^{5#Qk&vjDZd-N7<7hD<^f}29X@8Bn(=^n&?Pk`t zNjdYg%Tzz|op}*?9v^@%f!3**ik&lSZt&8zo$2&kSd#p6{RM86h{tUOb}(wK27EHS zLoa6MQ)3OSmq*Z2g=YqMIoZ_a>Mxfq+rWf#qe;2`PPVk=WCax7n$Y2sqgeRc-xgne*f^^w9Jwh-?Quc4=fsbt1o!`R7Y)fCQ~u6vipL*q-14SZwPESb*L{W z*2j_wx*r$Y-cNUm0&g;#NitDgC3Cbdvzy|q92Xkt8hbgl4m`VGjgp5T3OR{~plQ&2 z=wi*XnGTv+)G@@&>lk3_I+zaCvbKb+h`9n~TI`r?lpJzS<-l9+6;u=o(=pY=r8bRZ z`lxVvq|74Vu)sI6Zf9w2O9M|K2#Nd5)}fhf1?7n~)>K^o8Rb`}cMjU+fZxlqRX46v zc3<2HPE_=eLfeEW%O!4m0+0dL$|4pk!$d2~83*IqG;`~URa8Se!}B#1!L}yDAuc`i z*dJaA(N4Rw)XJJT&~xX_i{V5;)Xk_-Hx>!^8&MZVcAa?z-JGo{aYyx<5(nAF*|u}6 zDxuJMSCs(t0eqFZY&SzCD&7(h#AG#P7lyXi1wy5hz-KU&ofiV{QGTo3rugT& z>cH;(S1@pha`4uC)l0}U^_`u8gOy+B>Rx>d=ltno88`quPyqk6&cOLI>;(()kion` zeSHS`rWd^udfDq=$-Q9_gL!LZr)1vjC1i9;=8fx|$h`Hj2J^;t2paQNK)WI06tr9K zJn7nVr`?RV5Rp9X1|i@igc5sjhYE>&Dt1>hnU%{|RkLu7a}`%Zt%7PsR@JPU05TK# zT(xlPSM5S%zmrFaIV9>YM53bZ&vJYUEQ%Ty^-Vyd+8y{dv)JFW$Y!zm{q>iVcQg3n zrs0GyP<<&q_V@rzQ;4%NPL;Y`ee)~S>4Eu3jG%VSqm?7bWC&0HzM zaIB@r@8dk8v#)2@?wN?CW12&7N6ZX2*c9-~8`7Klmu-4ALc3&tsg*VfT?2>zt|E{x zg2Ti{vd$f9%5`3!To#B|`6@Wtnus`SLK`nYK5Xy(dS>JjDN#}$SbgDLH@2h)ukhD} z10@x8RSqugx6kj^xYvVc-oSgY_n>*uG8HA-8>%bI+;+)%(VT?~o$Vy)tn&M(*Ey#b zCbfl$t+Ct+GW=}(g1|Xuvp}A5mn4cR1L%<*b2_h>f7OTYHqEn@x1`Pqh=$koU3_78Q>i_euBg=F)S@%b;Sb?qXb7svaC2wHoGd;k zluplKU^ptxi56K=HC{aNk#&`eI^yp{YtL^(n|$SjP7eGALJ-XK2by z(ZTBaYx_3))iFBk!*L;2D~>%{je%;={MEg;C@(8-DmT|wfR(`X(&*A1KYVt>oxWbd zqb9szdj%-p_0%<_K=C8bOv8LqWZIx)W9-8rA#9d7x;iCz{SKRb?7=GX^ko|kDW~qf zHNYdTL)(9O+uV*V-TOTAU3RIY)4^4M*j+#Q3S(h$*K7|2L$91UuEM7Q=rZUkEx#QZ zUR1VuOJ63l2)5gUi-J>C4uaVV3XU0d%V443iM(7?J1DA0pT!G5ri7qD_C!3%;|K+s zPXFYltCaVjRul&tZ~^b5Us$(f_q~U&y%(~?( z1#fv}k|X)*suF)}`UM`;A!WD{r#m@&z~R9uJdJXq!_(HN9QGUxQ4IPpGWgc@mp`hU z`udIvRB~cHpZomJZ(lTfqkrR`h z@qpYyS)E?$shtUtXHm&aQHfMliRh^8Un$Q=__;;Z@sG z_-p%LmN+q7(Yj^DWoXLfin2BwCdGxaz*^@l7!H{c9KWg{cw<&k3*OVz;61Dd?=P^8 z^H!C~wpdSJbIAwG757l6t<~rD4Lg-A8rtoO%8FO#Ze~SJknBK85;mkgZ))5pTs-r z8kNVDffc1C@qtY~!5(Rvn__Xf0dcsjmrjcYqRRVE@q)|mmpI?kAkY!*-R>(1_s44O zOjzSD4naGJU04$ogXTc4jJdCe#3`w)te5J|Efj5;s1G{H*cwx#RTMy$)&YgIPW|Nj zi3w{5`2%eo;sj2vUpyf3G)3}YJy^q$F6ten#LiotCH1wG30CfM1br?m!*yRc+aWPc zdv`x8&<^IoE4Ne%Xwy<(C_tDQ+MKGcbjV_za`}5K`8g0}95ki;NqL*`xSGCh|hKlQ^xrr;q1l@b#LUsgjdgu(`n8eq^H-J%4*5EF;R>r%$Ub9c#7 z4rPJzo!Sg)=P^!*2{Ctb3VyNKi87(TDzzs56?C-3220*>(jiMi;xo#2l4D!}67_`W z*-OA*f6-d%FJUN$*EQA%HooRl13+XX97*icW%yoeEEF*{Ws zDrTS%I2QMeH zW6vOFyvc2oIZT#nWQ*C{kF79^F3c@O8~qMWYEZT+Z!0^WWd+vuS8xr8f#oKeLX(51 zZjlBBSLEFvwgv-UtBE8D2!kFvGo82$zYp4`pC{N0-3~3tRII+_!o@93=}M2yw)mDC z;My+O?_a!caQn?SZ3kfS`sE|n-!?LTerj(%e!!j7&IWxs=_6Fqoa+-8m~0v=`C+)i%RLa+m-_Xiw3AcmNBm6djZ)^>*N@Fns7 zlycn62i6?f|HZYdIynNq@QTGdb{!e;`+OGb!zX90lT)Cbp2@tt+-5d$4)^o_ z)vK{gZpZT-NiV~dFIV13MmB23aDF+ zS&N~YwH%|bx4*HW?xOn5{qyP<_1o*A{`%tc7lk=SHfPXXUc1H$BNrR4Gp>mIa>y=* z`dpKOdX>%Ew3#RJ`&B{$MLSeo?yU-ZD8G!*lck9o(t`i(brsrEcPg*2BrDp3ZWMU~6kz(~-pxKxRWQx>3cfA&7a*j5kZyugU3k zR`>bTSh4-gw~6JSvaf*i_Z4_oXdsj!49a-A{;JNorM=d9h9s) zi$ir5(^;J5N!3|+R(F;svd+RtskH_~4-F__k=t7D`9q8}O(^B2hSXkuUh__aUL7PygYYa`VJ zO8*-|p*@g~Sf8yVuZ6Zi^E0)jP|zqJ&sevqbNZIGZ42jicCMa#(M78lZ(F-MICs;Q zwR5q#7_C*8-9a-AY2Bz1E}f3WBDO>%OJ1lWv8B^mNj81nwdO*&lqyTYyy0T3>OxXc zjThEC5$bs^n}5Mb`@|~sO*_t7rH0MvIvQ0?PA#ZHku?`wxncSJJ8x0Wz{yBv?=pf zP)?{b7CjRoUdG>nWEF=lhSo!=jH9}$yv*;E7>Y#UAZ=ecZyvp9$r2i(wc62mtw2pB z61hM0K39Q&Y%IukJlI%X#a~*I%X2oC$aSV@_h=c$dCuWuG_Je~LZq4t|NEL{%P)O| zKtFHBAH8(>vNeY&Gfjdr<>$DvU7s&uG(TUvZkRk@{Tuc9!r!3@N?9=W*4SIhLbLkD zM*;pjPz59a1Jf}aKc@UuQIu24%kL^59;Il~3?7CZume0w5%lRhize=;$BHIygX?S) z2Thm(jTvsscqYt1eMbj9tjng8P2EO}xg3dob&trUfglP3^TWb137SVo*+>G+&E;}$-D%YJf<3oM?a z$v-IOWv&%9UPh=hc$qc)WL{>|eG+wEwr@Q@PDfGRoH#S{G^|iKGt-;ZxzXoEo0CsA z@|>j~`kbsiw%=fouDoAkkXCTx4AS{n^uz0r?c2i@sKbug)2zlm`HxOupNgYK8#HT* zxZT^(K-Xk4pLE>*7*6XP4fo70hl` zFuK8D&5Av2)l_T0we^!<`~SqLw{tV#(^D~Xqw_{aCoyy9Wm40xcvffixW0w6-_uz= zUL&4(1T*0ptLMG8Jc8Oq(v#w^oM`0-Ca&W-ZJ*>i)>|@)Nx^KYpwWW)nnAX9d=AXu z)SdEy@z>80b^L*l8Ov}4XNFkz->jvzt!9?(@p#g^2b)L=fqiz@fZt~3InzjUNt4Nh zw20f&E>|zhK7n7ngk|TM(AZ*%WeL7=cHHE4$kSMM@j~XyEIUYH@ewn}o>z2H#Ga~h zfN!nhX*Yq04jk5->3zY^Dtq4d()jA>v))*p^u}V2ckf&1rN7q>Ha`?p@04X6*KQO^ zYuW9}JKlJ`m{@n>M(22HHO?1V%z_Jhiwy{VYSL&;dbYW7A$9pQ17gkgKBJzECS zCR|?ys+of!ecrU{YiI)eK;~ve5Uv6IXUcUEgujhd7K$KXpCcMsl&G<9SnsHg6zC_Y zPk_FUZX|GgtFDf~JSK|($=2W0PtSj7Nb3pC}z)md8Q~K1`0D3 zU*3ZgdYaM(`wTP|`;BQZ+g)|wS{~lb4r<+1D@V*f{;@gRU3I-(>#kZg|CXmWud=n8 zm(5%M`U2~BV6SPQciqte^w^XQT?aPKcFLaW%EYy`Kk924T~*M~rSW2^GmqfE!Jmaz zYq4}>cxZa}G?z@`XqaK9%}%8p(;Ni@j^}E720Lc7=o!>#0K*GP)OtQ{5M_x_5|nAv zkqV|jGUOkx%NO3Ieqr(4Aq$<4#tC5L@Ib;(X8WhguRP!WDGRYG-$1o~Y-PTI3Ji2# zGJLft+~9DKfWU36uXI2Zzp!%o=d!(DAeHO=0^PFS`!z!l?(1H(o6q-txps2gXER#w zm-3d;`=$Ifp|2qLKZrWjtF(ODlcAjwRMOaJv)Rkz_5#*fkDeOQp3E9W2m}K@&05*2 zhqlOysyyMk0xDMfNpw>|0%KKPeKOlpr6w?xtYw}PTB=sYwFD-)8F@?1u=<#SjCkjb zdWJRarOhjE-SYSy`*sfWEXrnB`iPKG^ylh`wEin^#!|{MbO{7km6S=aUh5w(1Zmx` zxo4c1l^9u~`ft?{Qo1)KvfLjs5chw5iasjFT+l~_y@#JIF)>p={?;vt=CymaiP_F9 z-PhqKi3I+d(I4K^QC}DDVre&ycR|f%WlR^7t8E*up7(R(xx+aYy~w$JS-@mW)Fh`) z6whZ_0CgAO>|FndXA;iNwuKNx0nV0Dy>|-xf}R_|jFuaW4$R&v6z2x~)m=l^P09_l z(PONxxD$lfuR}JQOv>ZEt`i>9H`Qq1B?h3?+o{+ml$W#ZRJms@DZ|q$ke+56Z^atz z*B(U$(uU8}=su%$S}~8gQCdLrQG8;LL7`)7e*N>aVnX!ovtUqd#3+Nlf`1cg(72nJ zuQpY|^LQ051wkGCr>4Eda_tS4pbSfQr>H`tx_p|E4IDp+ zsSePCeuFTpQCT>ePNqZ~pW^kNpZqZ*Oe%_&**L83d)a+PM?m?e;86YKd(~lLdW}>z z&Vo$&I{4j0nE@3$X#Gz6cCGhN6|cQ{o27g9@9rD+Q1`3{n;#68Vu)SHD+y@*PL0d; zey7VS7ELKLa9S+ODkNOem%fDKdVTiRJ++}`(uB}`gVmVJv$V;p0L!k7*^x$f9QSHQ8qLfTzr-qlys~RXq296IHx%wl;AcRZP()u18wL zhrflt4_%;*w!gilO|;>tkEYvtVllprp8zRrlko&LHIfJgjRA+$%c*e$R*WHZ562|@ z4MSTX>P?;AIkmRHS7mvpp)K%ge6qGcXURlufwyl(*9|oGt}@gQ5Xv%(p&u;CsUI+- z88_mVQ6aToQ$LWn7)^J~maogJAN14A;+eBkS@nZ{*@%!H6(>BO!wC%K=NcO^jCRNA zi8w*qOY+ztIR!Q#3c^)rB2FOc#w7-1yH(&iCQ1wt4kzXvyLVh-U{-(4X5^8ajKODz zK32v+AI}ao;_uh>2tIj~fDF_Io|!^ffHUWn1+Y_7=@fiL(k$hGu9d@4DNQoi>ZdWa@;P!eMKtbuu~_-#w<>Gd>y|Oa%@8F)4x4uNF!P z{Qi&FiA%q+v%gc9FWAsGbAv8lz(q$j`2x!ltr2$Cs3BiqE!E@;E_YD+sL?o)!2a^T zhzqcJDlW*dQYCOTPHe;ev^(0&lLFw^`E`7{bg?Zdt#3^FvRK zuG@3v{iB_2b26(&J2SH~`aFMG#RY@LiQ}j*mJF-7Aofq;f^$FxuwbA9T{ysdLm-C< zMls(_*Cq^15DeL>8Vogp(V2sz6VwQ_SrQN{dW;~TW!f_@8XoaDTmvJnk!&My_L=|D zt$(VG-*_#HFD9W25OZ)V*Zt=Xf3tD^f8!BTnQbBV^zXo+Xcx#|Bt5nd> zuvI0pd%2p=17tUnLYLt$K^}-YLQ^iyue4SyBp)irB^0vrokU(V6a%UQ-WJNG%LSCg zQ0}Jyv3Vt1R%IaW-LCA+X$(LB-h%|N2>u>au6nS;Wg=X851#Nr(s);O&bN$~QRG-& z9^jhgk+AZY<2iYN{{*J4=uSK#GjcGI6B$_2uZax&_H?->GQbCXCy&Q%Hs^r0p6)D<~$}&Wp9VS zwGUh%X{rDZzHX=jaIBXsRs|3%l_%bv-pIhG@~Qye&8h;Nyz5V9bCsqFK#^Yb*=Ht5 z6HvM|K}UIa8_f~`?5*qXoAYcY1|pK5d#!cK`RzdmccJsYQxx6(f~oGP#WM2xIo#Y{GAh37{8jqQF&?4 z@K;}&C_)fS#XT#Ox5q^Ys=(h#(_USK00Pj9$Qt~!_&1k>m8p$Z4^c& zb-XWG6mX(QpCTMI0F&0tj_G5-{$i*DocfWb4nQz$L)piQ17L3=INF@1F`kXmVaMV! zW$Z!K^_eNu2ac&|_btRlY*BM+Lq|ZxF?K;}tP8RT(jj%^+sCqA=nr7|qX@F(%b~Zz zzExkrTEVix${2a5pf@ZLN4I^jBBu->J9K4$Cii4zfQ+sT(DD!*Ig2s?cCju@KpVmY z4O0peRP;;|CQzfmD#U~S3I9;tNvR_)2cC^K`f@iO(^%@^$uR-_(*$9FSvggJH5asF zSLLJy?)i}+El^RYD=>Fta6wsLS&_#S_n+nuNaidZ zni_janC2kLBj-GRAhw(bAi{3&z?W-c3S?lI3WbO%nqMGjn5 zq&uLlttXL<1cyHZ^=p=Lx|v{C7w*Q3ES2p?MYN^E`AR2@UDBG36Y=8jp2enRVPwy{ z*Ib%C&_5l#2%^_?Og_->NQ4<)>P%I2x%y~-ty$z7YCQP^{n&fDtN^@Jb|@ZQRv-|_ z$qFbh>9PXDjfJuTj*@|)Vp##zN4||@h%Wq;t_k4FF!AadZd!8fqP0#ZUQ>vE;u8>1 z9_$!ipqFsRo6k}OJ|WAK&5Ac!J;f$jT%_w-G3#`Oij=*68%`4lQHT6Ja@ zSl zQh0G!+Q;>0z+QmdT)m;U=1a<3V~L8#60u8qnO(RnYvS9ZDXzwl-X2ZyF->?Ifriec z(IoyXlvMY`ZZ*$pZL4o_8~u3+{WyQBFubUqz~}M%{}A`(@lDiu|8r$>O(t_>GPx&{ zJ5AFxNz=4V@B5;ZQhMLCw52VSf)pqShysFwAR-~LgW4DyyFG4)lQGdnW{AjNR1mp{E6MPlPFaBJ%rKzC~DJsaz$@I8g zoL;L`qY!|oCn>D49<`V+B> z<&0!yw9OyI^Vc+QA`w`z#bnT5r#Bkv>D?_{1hdGWok?$!Wl~JFx~{eI&KaB=2sN;1gM9hv-^%z`Y2KiOCxzNatHxQ9a+DC z{vBQc_C!!#2k^*YG&{1wEsoYzXE%=- zIkmPzA{C1z=w>_Lo0$E6XZ>LifBv4FB~{z@9{cQ16? z{M*WxNAEQW#cy=g-vWwXJn_Jl?MM=C~iP1=*pZe423(yTL z)!VyGdQPDfF+?l))$Z`;3JM$r4TTo|02)CF6>Ukjn~lj;FM*dAyX`!U%A?-c1n`2L z5sYf0S1QlX_nMH3ijX%ny@s7A-_bLdG!yiZIV^H@&>Z!lx!n25gaA$aH#5#aN=IvP zX1R~oc{iu}E4w=CyUP)J6S;SZogiJ61N~*o?3gRTY;hU%gWU%Y51g{2KY#RS`Z~8W zV?-k2VdH@=r627Sx|PM@TtNfW|aO zOL>k0&6Jw*`SFte85}Dsh9R6@M$QI)(_H!5K;+}9^3>WFUC_4idCOC#^>Df>3 za#~d?@eK0HnP{v3GlIb@u8nR-AgEvecA) z{jsZ0FSP~om-TQOjVW`PSu2$$SyVP=b;(81{p7i&52yAnGx>_mwHpR+EKD!oZ1uPX zeTix+Xrx-R=knEe1BZd7xz;(D9vU0NcJ1GftxrqCT54*r?(*_;dFwwS))%8y5c&B& zwSp-X!}H_)^=_`r8C*L2`F|GV%gpM?E)r}98&NST>Hei%!bN7C07a0A$@bFHC$tJu zWeet+?dhv-ebI`%{laG>%O5@T{OO+B3}5N)l?5wQOY$@O3rn_mFUFqV>~xH@bv;<0 z`^)@RhNd;fL~s}QYq0=@P1U4CTU_GhwOIs_E>aV&!~~OA8d~$*XD;Z*Yx=JJ@bbRm zP(x*sZJ@NPr7)u@&F-8NO}ppmRHz>qz_NWlta#_n|C3IIA5c|5Bip~Zx(f43RnC%T zJkJ39gI?{hWXYsbnb6`$C~3Z2$1r+EQ|u?)E(-3|kN~+8V_U+14}Tke++zpR ze(`>P?eLQiuDmkYOKKQWZYCYzQ-2l7MO4o%#TR4Qa1!e*Tgs3!wt>+liE|ejSMU)Me+0KupO% zoTu$S1$F;*W<&2^PJKoY9Q*Z=BQ4eIue^C}BZP=1lp+MS<*k^4Mzx#*mzn#A2UC#b zVY7-+nH(NMiu(+#sptTtVloK5T9vw_P)iG?h+9ffYP~lUeoL2;s5jskvj3tQF?v7Q zHhgFJZx3(vAgo%Df8zK%2bz{P<}`+K!(Y9k3dp)#9k#dQj!Dxy$W(|ygs7|q~wR-RuFV4vXt@F&Q z$&tLDHaGA82;B$si#Awi1^9IT|9Khr+vOTA&^9bjuq76OJHgdSB*#)pcWU^u@JF>) zCfRVnD5nxUH7rFC0)_9QOjMmKL+P zNQ9DafU7W!6@3|gUL_?MU6NCZhM!j$EGkM)W!03jj4aqWbge>4NwzdDb6gY|e!Q}c zGucEU9Fqo;90W(DhR41jL_=UX#!98(mw!XCTvm{iQ?djIurnG`DvNBbvI8C!%X&X} z;FYx)K}s%r{-Gyw=31>4SUtDLq`$i=b@u+^qVr}jes2v;m-`k_!-xq=P^{%V^Ii{l z#k+pJnXr3u^#<{BW132>$FjmB;m_Tfh!zu&RHDMAPWMCm-Bt+WKM(iP0&wX?S!6el zD>-|LN=38D;l2AL@(H;Otre?kfxL$^Io>E2stwxlG7tk(2}XiC!{QOuoQ$-3?#`|_ z?Z@ssS*&cwWTc!Y?ltSb`Dkg9nk5XGm3oVO^~pEG-!PP#0l|llE`xCG?(tV)F`B8t zX-d3|kxC>Nx0qNfWoV&5%epfSYD(=7UmiK|_|K!FAZNh=&_Msh`b4*@-*M|i-ES-sz2IZIVzHfQ4~M1dG*OB zHmq!|9wkL0BppJv&HlvP3>aJ-l<+i?8YEbd5y1tqE%miU@ z`Zo2vpU!pZMWea7{rE^;CWJ|AF#NbkcsoHIRr)sxSQ#0@xp9Hwr^@G^qHex$(_ACZe^|Ab{-X{hQDH#c?Kv4xNRH+VrQODIZrBuIrP!<0!^l>+57HAbP>BH{$ z6ZHEFMcN8v0V|?+#?(G6yWD5X_RZ*gER+S5lMm{cUO+4w$6sPtqMxAFj!`Hkug3A) z%$XHp42uBgT?AalIViO@8zN^1=L(h@B`kO~r9q3K>=LMU4LxF-|^CECT zuG}(s%VX=i#|CeHY(tNyr{#u6n<{#mZ+yJ59NKfCelnTa6puGR7#5$!b%1~7$wSCHiX|wEb*JPSkvZbEBys&Kke$) zV$$Z24-9NI>R>e$Jr0tJ8T}=nXcH1B%4gL*;Hj*TE2qu@NkvMoToX)Rsn6Y>gP#oFgM`ncOcD=p?V3?4nBs9;A5WAm%{?HAD3z#}Pa+X_44i??}V8E{B zgZpk;^=`H+F>k-!s!*9y(yWwJV&@n`LVYh*_1R+P3_idnwIs9^D&1N;SI}Q@kJr1? zm88*@d%b2NgEeHAi38B{i-T@vHm#jl&mE3x9PjBYD;rzZ*f^Fa5{)GojblEQYVFFg zwR2a(6ay9Tl8deQ0e*vg!=mf}@Ee<3|hu2GQ$2d01th)8|3IRVuw-A)fq z$P*JRi6?SYDn@Pz1@u;T!_`N<$aA;7&{uuiW%u1sU*S(ITGNnK!4!r99u1wB)0Jde zgvmZLG*&enE=zkVy^JE|49|fT;C`_v*~!4HKbYoKm0}4>AuD&;bQ~=9w4Zt)71}e} zvi+Ii#*n|N&}yvDYFrZX=@`A2H=@c5j*1n)5O76w&$C5lGOel1&0SNQn%Y&jrfa@E zPn@dqv{eN5S>^v(qF=y_q;h;cdA6+=ZM;)ec0#L@h3iL=FF${JUHiXY3BM5F%wWQ+ z&(u|H{YUsOi7An9$z@Ir2j20BD6*VKU4xkp3ukcY{SuK-Ca@&gwk%Cnu>?yWSWG_K z&wFT6BbCU*6&plv4z}$0Y^+BDX-SyexaOIyg_+^+oH-mzYm$t#3B2c9X=DzC~xzOcuA*njs5V z$eCJyRGl!s*#AR<&p#~pOa;)zPEBz6cfWdgsPny>-q(rL40yJ2$-1rkR#idKW*m(J zhMdJks$5F%){pcLn<0CPS*0P3Ha9MjI<1s?xK_Y2UWHakC*>E?DkR$AuaGmW*A@Oc zYYbfpb}nW;S@p{B${XH2xXOW040;5t*uJc|G*FRNl=0%gieR!gE3>`GQqMTmww-%# zE^yY$5(%1e2V8a{6E#~;HY76&u|O^ni(D?JMy}T6mtmNkl4~-ThRZTq!Aqr=AcrnE zMiYTTpd~tUErZPFB9U61?k-B7J987c_55 zMwKMWGk1wwf1h0a^aKsC?@?1(aOO49o;k?HlV%lccV_daC&9*}{UNwH^Z>OwM@ zlds`(RV-&$;};tQpV&+Da0*353|I&XF^rMC9NwZraaQfMB4P+9atIakQ3FfU>ZIlQ zYEqohwc{=kMiYBG8tu_0kVPagwJXu2kSn>c&#D(muKX{IkqZC#0nVtri6#lD;=r0) z3QW8b#iU|!_%pX&D3(biUbmH05zZ$LJlcU!a;*Q(1IKe=_<}Q-3&;R!fYp)RXnRnr zEeS0znYA0W&Rqb+7u(TTu|4X?VCrNE7!fL?JgUXcBhU+yA4i0U zpCuRy%cmo*Rt@f7461M1V2Ht-W}YUggz#%$gnxSr#>nKaf!4o)P8vlKZs68cbTP%a zUO(Q(i$$nd2>$E>G5r`I00+<*#ni8_BoRGE>Stj(w;yLAHw5F>t3jb6j@K9YGC9$~ zI=S5sM#*fE6Cvxl?B?DKUtUH-W4?a<0sviFH}u5Xj*UGxZfb@M2;8-k=Q(#&E!lo@ zId2WZ5QRy=dn?S<9m_8}*}AMLA%skCp+22F$)_VmIx!PdLYi@WPlYYkD`aG+)%!Qy_sZz1dl^hFml5lG8n$xL=RZ&R z1PiPJ@H2i)AG_5R8R|lVi+IKy%aT(}MSm2VsUD@kv;)O>jFDB`tj~iJa3H|^Lq8z0 z-yr3@( zKmFU6xGb^2k_;niUH7=?fPzM0n_Vc3%vmT&ANrumQ&*|0`PVfHxhVENtYEL+dFPJe z>}jk%ieQx;!76Fyw&228fj{KVVZ>sI(+%rb-6ru~E1xX=og$tKCIBp~@u!d8G7=qPO`AV@s zjMv&}S%Q{dpY9(u>(eP!(mF{o2H6ZP~s44KKw`3zp!xVNs3=R0t@ z1U4#4d2>TkQv=V{5^CgAV!wpt@KM*hD1|ra^}YRThRl4soJDZD&TL-3{CiT+wOu>M zzmoa_McHGJy=_qFwZKxPqTMyV>lQbMzz!FRx*Ra9OS%m@IsTL@d>_YwN$VkgJnxWB zBZz&Ds`&?@_1Dolfzu-dX2p6@1l=^O@Q2ZzsZ7T>x$)%B*=@!PM|kRn9Xb-D2!VvP z1~LLJt$}mx3Oen9m$w`{m}#?WmHE#ddwHy(uaZp-lfr5T~(fN!;fW{KrC`_HVv3 z!&ft4zW(-my6a0*PpmJpiDk)Vubm}CHWij`C2+c^I7^EXmgMk@;j0oXypq;; z=}#{ySlwEgH!EuUB7Rki^`76%z5sBk!Ku%t-?L2D7AN1E;TF$u&=;IsmT@TMPt$hk ztvb1el*`QSJd=qHDog6UqfeLpL96qy3ay4qae&CT+e-`HzAyZjEGK6GM}PIorR(p% z`Cjl^k=|NS;N!n1UQeqa6eomyiB-j@(?gY!sdlZ>o@e`aepcU; z>zcJF=YS!}72DoE(bL=po)qD<-Q)4b?=TQR2V4>L-5xSU0F#h_oO7=cwk^E6Or76P zr)QRF(BmMF;XU!|L|jjNF{}F%bOr+gr+VuHE=Y zvs;UShEpdlAHL;v@SVDj@ViR{{sq^l*I}V@o-xn_B=K-GOR$y%uivYIF@{N!{Kn0Q zy!v#1hF`%-9Kx1O2UX9z_>i_zmtC8YQUpV}!MfF3|M~3llD>yGb(Tmt9tvE&=jqc! zEwgiHUc|>uSkigq&eSQ{g}5vkd&=2t6D;Js*RRaeE7&s75Bh?h2rj%P`G3MWd2W~c zip^?*v>2q?l%jkOrTU(AyQw!%@Big<=E%2GRFrZxD7BmW8z`Q#XC@T$mUzEofdZfd zpdPDi%ES_8NPFKC#gpZHL_h^&l1sK&e=n_=9o66jku}!SHshER2Q35uLK0S)B0L^G zgFqNvS?b{f+JFp)BJ-QqZXre7`#Xlu<`7-q0j!x;yf9pwCnJ>QwL!C&tNtELZXgMs z`2BwHrH~d=>O5W-q@`3+g+@~n#IekGhMegWr1_4!3`1+qKXdWNEYwJr6Ijc%> z2RS7r)y2&i3BcRCpw7GU`76 zml4jw9J_|qD)%g$zQ@CrYJ!ro8nySt^T}E*TyGxUThBw|JHjIo%M(Yy?VN zAVI7;K#3$+s(~biHseS_L3-%HmGzr@uOC}Kn3GYF-LkUC%$J_!g!ZrB3!+cLwV-dU z&K!M)0pr8|e&_hULuwTaMFq|jL>rT5<~9%f8!i8v4Y0EW@C@PjoB|}d= zG|;xC|M0%1swms>uf1!Xo~Eu%gvjs8uE_9@i(-Q)7~rp|ATmE22@rOfq)wSJ2J#jNAe^fW!&bpdE82IIK>``LPD$ z2rARVdJV&p0t9vG1`5US6*zueir<6dm2%?jsi}(xuZ8~A$D0wY0@5VmPkcIl-L)!> z5SqMVNTAUOPE23pjNe5Wd}hENjWerCB(eYmVK!RKi)8RkU*>oB4YrT=UH_AT)-C;q z`ZEFrX{`g9sfFohCJuK{QiMRLV-}GQw}F-)FFac8_HUX<3SR4)<~on3afCeP^7@bI$E8L zVQT}q0~nS@%3KvvT>kBbDI_7TF6aG~R!)k+lRC&KXCDo}mX@2T)nj{WpC{5SY)aWH zyUO(#o6wd8X6-QP;Hk&QOC?Ifra$XlE(*=HaHkciMy489PMrsmidkmohkRlJ(mRhg zH34lvSJVPbE7IQ4*4*AUyQ+8|l(M+K_U|W@#pq;{Y_b^4Lv5*Tr3A53Ng|QZ>?erM zv2`61$tr~cr9Zn#jIttBvF9HQqNO@=qBV!tztf=2c{$-* z!xWZ+E>y1+Sae6nuRdevM38bqtyf?&ABDagKNDWhP*gHl0}YP*A8?t3lOHP~p(S_{ z+NQ&L)tm$-Idnt$_c^^UbwUp4BQ~b(Ck-*I8E9yR5OX zH%}z$O)wgJeJa(emA$L}|MIM+Q`F(!{EYv{-kFEBaa|36W;7ZJNl2s7EZRmZ+7JRH zA%qZG*g?jCvCU>1@P_ejgBQHSj)P-6v9qtu9w&90)OEAENt&h3(zHpMW~rMdZQ6cG zou+Bu_HEiX$!o*-n~@MmLN?GQ{r>nuo+mai@^jC*=bm%!J-<1(w_)|^mz^=Wn!->$ zSPwd2q4J8&1&BuJa=KAeR+w)sJg`JVu^*`N>us)%o30DNFMRjMYug?;@bI18b4y(H zgNq__$@&VvTZLCgR~C=XAJ^f#hDEL2H#Y^IcXksPN|^QF3h+vy(BUTeq%TnJR>mYI zy^um(b}cQ)DeC>+12xd$oxLNcwk!$x=G9q^-Qh*eA+MIyl^6~DKV-9;`9KG-h|6la za!sbrSUB9-R$AJzptIvE;hrX6dcF|#WJ#*>Xp0@y&{C#s0RG~$7q%=LeU*8_uQ!9G zufN#UeCZhTk-vZ-Ihsjh0FOV<(Mg^LpSkjtr-Dd~QPL?Xjw>WT$SMackoSUdpF&1S_8c0c0gyk8MyFcb=v zN>_fNYg#gB>YKa?CG*BL2d;FHxaqR}Hk%^?{^VRSrKz(7n4dFGw=0$TI}42>xwWLR z2<7o}K1(W~*h2NLGTNBGZY1RjXUP2YZv&Q{9-CBO*og+ zw&&9Hf_V!UqyRdpHMOsf&`BD|F-Jpiw8W9XIr?JjKWm1OET>dd#2GRnZHwR)lGnvW&8SoFymiBjdw zw~FK{1GxD9dZUF%P&L0R)(XVAB9XViE?1(?XKwsKKSD?)t4|zxFbe%KOD61$XPQ-9 zA2EN(6ETGHBhhd$5>CI-cj}$(7e{CON!~+|q7mpt&E=T0Sc;aBED3Z>1YSLWu_N}k)!KJcyK<5`=i9(17>1}td#Tqb`)`t0L3oGTg2@rlda$lcsaIWCC65bz7!wh%?}R_>{)l`$<52BpcKtt zzQ-?0gC^4S6Xb4shsrbb^Dhz-357j69S(sz#&HN%fAG;+fDdUSA7n>f3CS}?eqqW% z27Tp>LtI|?W=PYN0yL|9Ch`;dn8R&vMx4Pc_y;6=`_>?0Tc+fbxpyJ2{ z?eiSD@T@>?A=Um<71fP$jX4mFYC-M2WmH?;)+mfqoT9}kR-EAOR@~hsP&5$ST?)nB zy%cwMDA3~W?#12Z(&yOop7W0HyXPI_-uvh5v6IX-*Yq_rGH0^0*UK>$7}AWq*n3{5 z%CU{n=*lt(OGRB)T^jPGfjKA;Rd5ok4S6#^IE)nmX)z*LmddDI7a=Q#WJGDdU@`p! z5zC&+2&JFm^5;j*Fnd`MfYX(SNizezh3uR8Zk{r>I9%2G_dBsN<4 z*|CvKlPPy{#ySw_tEj(SAQzhoz>Cf}i!WbxgwG zn)P*ATDN5SfhZdWM$)+MgumPKo&A2q8t|l@qxz^SufNM9u(qse#457?eFFxD_Lm48 z${d8?R2qK@D`Gc?anMzK+fdF|>uC=3;)rrDTbT+tW-#m{-F2JKs?ezNscR(GAQQcP z;T$sZ8^7W7;ZvAsqs(X!x_sGce@*ayjIH`M2!^c&+`Z1eN`MXGhfSk@~9N6LsdMjw{^n)zAEC~V<2xQDV1#o-WOx% z9NMw_HLsB1_9r;kVj%xT4Tr$@k)KHu3;5(lirI>h{l0OCYMEtIyK3(-Fqm*Uc5?%5 zy(%fT$Z3@HZAZ(~z$;FvqL+kT;u>yR{Ak6rCv%laZdLsC*IUQf5oCFI*Lp5nQz`@= zlcj^b?&vi6Bd4US?&%G+I``EVw}IST*+XKXI^yp{iTn}CZ(U%*@rUkJv%2v4$Dj;93=$lorx50u z8^_larxcDjry{Lqh7bB#i!-pK-_czFkheF68DPJ%G^-9w|IpJqz3_dikj+=~ON|-AejNEv~PzfA>i{5^tPU!(R|>97Dw5&|a8LLh55(eGKF$*kEi| zXdL7=&t+ppAq@eio4U5fZu;e`HZQ@dLALygxu~CZy0V3zgdjp86k`eKwFT0N@Xpy({D*idi0Ln-y=F?L+uwwb{213Nrm=`R%%j1Yj$O2ftj1kf{|jb(@Td| z+Rk;dz6qGzkfS<^cI&6d0mhZWF$T+RzL*(9+BdxeCCB9vq}lRqxd`4{H{KmKc6OAk zr{TyxDj#aDH>_!*>vo?uxeWpDq$@0ayxGc%+djJG6korKdNNPLPusB;e0WaW(X>W= z`JrWI@|d+PO3;&|$fXvgTh~IY`Q53m_|#=Y98fx$nKWC($XJfxI3vrApQx}D#Gb37PiEG*|Df&scZLXqb+Oq z`NTmNUGm^y6@6vu>>wvZgEa#|t!-UIGqUmXYsvGds^<=uB>a*)pL}}h`krrQov@G1 zJT;)~5_cU=0=q_2vfwP?dwJf+yIl2;v}F~Vs##7%!}xT`MIAUtO9t8R&3uXIlf83> zus-e)=>d?4Y+%bFj<;rdGl?4T7)RTVQlVRHd83;cpI65aSyfp`#xUf9kyDMLNkh4Y z*QPWsu#Mm6SUZ)_x{5@ak#e-K*{A0C=iv=(umy;9XJzBDHPU_`M~->LN>RjR9=z^a zvXS1yaxlal(zY`XMwQ*BH>)R@gV608K0MEC`;PB=l33^EF>5w*IQvm}$nk#W>Yhv5 z7>{ySltNPKvX|y_!eJ)l!9GJ&1nFFd^$mOJjqOK= zYKz^ylARADM;UU+v@pfK&Lc<<{1*h)Z2TmO)MS(w993bP?DdcuP+i~5 zY+kySWe5n+Mh^CQG-1w2l28@KO z5EXt^CUVO8{foO2@6nR%Hh*G32veU2VM!a{M2Q`#gOx-R_Hd*6sh6ndz(MZox+WLj zlDc+tu9a&qZ1q!xA8d+!sKCNuXbssjmO&^ep;ucdnw)#q+iGDr@$jO;^^( z^>l)g|5XjP8yL%IU^DNgxnUX!R8iMqUB~L<2xs4g5b5M&tajBMo{oOql2es-Fg$gz zMl2C8j*c}0%`PZhIaxx2QKbGBKWqz~j8D*Oe^i*s>q&y(qCrk8C#fn`YmUFayA&dr zyUmedPJ0!1u9+(7Yf?Q(FEzL)|Hz}Ahs^Bjj_1&dBDvakkLg-}G(-!&R9Z>>BA;<1i(7OyDUq!_H9$kTO_K^&OOZz)dU@t~%S4Vys zb89{`Yt~B=LT1YT>3aYiKAQxY)a}wevIB?kt?tVAw*sRqOkMtt-I6?Q*I&(j>Q^$l zp3~_vgN_wRqlW2=KFP=A_ywY1OxW2|QHOJwb-kf{n zt8RJ2(5j0ueg+AVWXMdxCo)_Blv6sDCnGF<%oyT5*_I*)`%rlWvLr@^JZ46Q&)#5s zCX49cO=$(-CshT@j+DMTq3OQ)Ai2C1eo>X8T) zWPnI<5%kx`nUxQ3Lu1=#+lR+gm~gBYZUtdIr+Kb$wxT4kI@2ACCw|+|7dh#qqzug! zNv*VAwlMJ@c73wvSqReT7hE;*b>c&iqWddaaLJHN<_)m-d?MfA-#m$@6j+Psl?o2+ z{gfr&UiRsl0pwjH8?Bk(5gAck@rO(|$l#<&tiF&POvU|DbuBd9We+#+<_9jkD@`SW zW~W(yLuZsW#1#>UYnI!dIKsrAGKsJ%IDQV)`Rt)sL90;jDIEASk!jIOyk*F-$+LPp z+*;mj5I6Q?y{A^}iFV$s>jr}XOBuob4u0DjHHo~{<-}U%r%Pk8LJoIk{`91oy?x-G>uCf`4$k8<84-%Z4u0hdfA~i0M=GV(o7VhAMNL;F2}TY3#VfrSKQ+IY zid~Cn)^z%E#hxR68tX}jpg}(~sBr;{y7Dfo{l0IphtOW_DbK@Tx#gR47=|lT-Bk>s zmzur~yOe=mgJW!ab8P|CkI>tI^j-Q=rBG68@{PhtjrqtrdIRo=pu!2w!LOxL-`ZN5 z$c4=^nruf4(%Rcj_8nQQT%8b8fa;>DBhyMvfy7mptIL7% z3I(%cJ7=RH@LO{7fCF%N>{-P#sUa5{-!OY96!FP6{Ytvls4D?s1}UMdWFbK; z_G+Sp{+2NEYD2KAN?%x>j<}{mC=^%2?pX&?Seol_lm{ z(vJ)TZz=BtNbjTew{BU`9jSHeBSNH*-Zn$1-UV9Lp>>)W^gj6E8O#VAlt_@04<(me z^DrZ@NdB9ub1wjaNW_*xpLE0vcJU=dGFBwN6)l~jo2Tm(iud)9s$BFfyZLX8fc z>48CYfGqisA^pu(8i95cqL8263%ZXYfE3S{X3A`#B*-`m1cRzoAqvgv{BjsyxNjSd z+u4py=s{b`T3Xde)*j~Fi5c8|d^sO0fihpew_KGhVy34c+m?K^Gs_^;ie;@?N$gIE zc%o))u$2}uH&4MlSo}nY8X~q9&5e+;t|;H^G+Q&HM@C*aC~2;cBNwr0vy4C{M;nAK zUBKLTCI3@Czv#P4dPzRFRH0j@C%t^3R&e@o^GM|k}L0M7rTf(O}NP)LoZNyO@>@^H|R-uM7m1Xisx8_gZ zt>h^O+Bh#$-!M8BI7I10!w@oqaaN|Y!p&N2=ycJV9Yt>h$E0KC=7K!TpN=mK_T`Iwl!Xt65y~YYBba-=#>`}Rsr>@&p){E93B&9%2w$w+ z!9%u#%b&NF8!p0GHk~R^-)aV)uO+1=1@|U&xVRX-k*L&#p-fq|L={gounYF^4T-Vj zM+ltG{^Oym@ulhwr~sT|T81et$mOl&uS?shn4-ZG@af!|CNpk>k683Hvn4kI=Qa__ zxl98eY_*Cwwec)cQg-@2&CGup%bfyo$a&#^9+P%he;8UEiaBq>DV|3vhr|UPt-4?P zMm%AapsFb0-OT^&xNtFhfjN-uT!pM$1LPWO_{J;?^5lg*V?zf~tCkXXhKWN9+207A z2|cz2#H-x@l>V9jJ$(pjRE(15ng8Zl0^?b#DTZ_1mOqZNODyB_6H$6-Z6DT39PiC; z=IceBm~u|x+fCrOB1c8na4ap1!%O_(AS()!4{4MbZxu35-r}*P&WXU&1br9zkd{9l z;=)7z4Je-`IMB**YySXexB5a{WhHZnQ^o@B#oO7Wvz4TVVTx2Q8Q1jzF_87#h)B4I za%oPob4toa*w_;`!K$hnzFw6f>Tn<{@r7!tsyRSoXnR|Iy2P$bg}!&e-wd;k88B6A zy~kfDCYplGB893y>A67&0oC7y=|60TP7R}~^!D{0B&j1op-Z3rmtee{-;a=AvFrs7 zWb>*!58=W5EW63P;JyrQcByz;<8_KD?t8v+CkL{7AbvrWCA;96?oAvHcQvOY$P9I^ zAZz1kadSG6dl2=jXZVVdrnO5=qi6&f2R348usq>;c{|bhLO-H+n>$e5?OCEORh;x% z<|}I;2JJ(|6;+8XCzsigyfl;AFc*kqWi&vTi|BMlMGlp$RNM8>3&P|6K*5J{@kI;p z_Iva5ZbT_fH7W^~+jHfpiqq*?v8-FQUNM8A0}3c~JEYLDG=J571mbI{r&FB(PcH=9 z9z8Y>fKx547j_S-K)-a(K51<87Ff}U;{VtrsT=wTHA2h{J3L4zP|ynR%Nd3Z}OHZr}i+kjQ1 zWSU8dp8O$*6qlQ+EF7XxNWtG}L>{0>qbjDq^fTLY?j2K~&R6S}I1Okyebn!mJ4&$E z-^3_zq|Om#Zob#2YT~I4$fN0RQS}kiZv_My_L57Mo30o=cM^hmJG}wByNeGJD_nJF z5+=~{ap0-1j=t9cqsKTKWa2j$SDxg*N12e&PGBoy;0LIH zJP^rTm*+EK&o{*yxGBNgvHMIqTiz;jZWwauCBp#NJ3UeDHf^Cvf&MP9q=eIwU|pE< zhTR81PHv@;IjyCxSPv~r*sm#V1FM=a39*k5eQ&UdXw2ouT(rcLZz1&;NtlQ{qwg+1 zzlE1AzH@R}eJDA=X>itX4#^wJTGi81Km5ipU&}q3@S)muxO`FGv!kISkp4ZOTjPjX z<$a8787{v^Q<7pffClGt>oXKl&H!k?hZ0;jq&O>hT@HpXgZH`PIml@bbgopdPC)V4 z!{mxeA|J%l;L$*5)j@ug&DhrJd#ZsbG7&H<2g+Ws$FnN#N^HC48%=Mn(PdXNMsZm3 z4`z>s1#&<}mKVF=u@7V5QzqSE~4LR@B~~uQHvy;sp8M4x+l%| zdOnvz%_hrIn0cbIX*A(q<2luTC2LT&+;mp$_kG(X?2S$hwPTO$R4N}D`mv-=cnVXI-))`8{Ty z3azQ7UXe~bG&5(>`4{{Ytdb)ewU~*u7&`fNjD*W}o1Qx^!b4W=A*d=kfOnbrZTh(f*LVrFwPC*u^}&)x1^!X%;;u3E-DppxA}BJiOLa`xYvI}=j~e5i zrXU{Ecw=dng&uCeqo6}k#=nMp5`sdNp_)Ho)i=;JO!7{vaFfskRcccEJbDyGZ{bU2)68es@11~Sb9aDPZgUl!97XAy-?&1TdYbS3ey3xv52 zWLp>dnFle|)o4c($uR8j-r#6`Y7_e*55N7LnWn6yRadSHFxo}9(&T8+BB)z5u5v*F zhEJXgdp{Hbsb=_10ya*n z;bh~udu&6c{8lakNjJ%hz#S$ruQ_B|Ioww6>+4eWtIq zD*evUhS&9R7T&3zrvcgmbGNuz2i`b=oju2>DxKxm#o|NiemReaDrz}QL1A&Z{qm)w z@ttO2cHXm2J@wHzfpHnzA?7S^_8x`zW zb>SPeI`RXLoRv*URURi`>=R=LPX7<$2lRi)n6`x%&>v9mApwu zUi){23k;dpgYIg!d7~usG2ONPv&9-QIIH|s&AS01X($EGlr*AkbxHcp6uNae8rXK? z(s|P10eT5uyFQVQf?qM`f|%w z9lZC;WEtHGZ*zO*!nkUa@rs|qORXKV5y-`N6|$wm%SuaTvXY=+asT#hk*b;+F?eq} z(OISmvVwMME#G59(IH@2S{~melhLmuvW4XA#8qNx`2el;>2n8`M~5`BFe zuPZa{`kMX@=R#-42TYpQr5zZ008QlNhM%VGhtJgJt%2R@UZojRc$rr6h4wu$)m3{U zkQx+_)7IvI%7B}Vlgu*i_>B;*EqiZtR{wl-(&TH`deCgOR-xyb9Oc)E$dg9FRirk- ze&9*6kEy6zc*Ltk7dI+Cb`SCpL9F0Io-Cm^2u7L| zQ&@`bbr$>Q(m20ufHl?6eXkD7Qu6qeyUx6IcHfoHDh!65X zOwnm>ljmFE?syn%M8rV-hi!HdPRK;SDo#s?=KY3H~-PkM& zr55rn?qw%A3m6K}q-jF8BYbOLZ-w+as#V{5pAhncK*?0YsBO>RMGYOOp`jA1d8V$D5f>zAx*eh_rnKW^OB-0h?7o+-lX4=dWlq{)t?Dh>N+d) zKs+{5g&~D)l=3|*9Bn|try?%mZmv{qu{^Q6-1b@jK&rE>l8E%iFl1v4AC6i7yp07; z<A2%V#;DU7awLJGMz%DV88Qc%}EG5bfQU=-(r6@3_X@hnpC%{d5Zeu9?tY ze7E+}Hx{u}ChXT4ulmAs%Ck5EvldDPeKkmkaAp?3td?S}iux;QoMq~A%{k)UFjf(5 z2!qEm>U>97Fa_L%Qd(Et=%Wk)4FRF=VFO8zfz-L~U6JsTaiby=3q5>eg?&g*<<((` zpU<3ey86J=^WarH_vuroW?ShBrq#NsnF9_QCq;3Z_HGS##M!fKQW7@`Z~t{?duIqd zSK$KUgZ1FI#iCxYMBX*r^SKfEXwO!w+JUpy`fRLYd5>xBf-%u&d-X>CR?&umY6@Oq zsA!Uz5<{FZ1!}qRk*LatdU>=*j>`9jrBQXe@e0)T3mb@LiERpUImC2VeUvSf5n8|k zFq0L4Ayqy7s7xbmy2^cyDaLgq%M@;2d(H0&gX{ITFyL9WVonZo=?aGPM;f$ac}B~< zE+Ryg;dk6BmYy*SVw3WcRG`{({nKYK>Ou^6#L zc33Y7TUdnS-Y}}2ue+==yQip@!HYhJXQ^s-5a?lJ;v^0fp?JXtmv%10K_mY10#H2t z_`z5@UT)5?)2Sm-Um($-k8dS$lalB2o_C-f0)CG&8!-y2x@J2uEKJPJc+Q3T5NAiL zJL;k4`2z#@uygl)qZ6((FmBe zly`2F;SOGGC9^lz-|2fcZ*y89stG5wm(rr*C@anZkyWEWIAN!NY|U0$v)FE>V7 z;y@Z{s44^^jzKMI%84iV8&XNA2m%Y=e?FvHm!_vB-85%7~ONOTi*?uLcl{sKWVVk&1h@!Jp&jX~|A zD}`TF#ViZPa-#j@$uu*DXbC^LiQs7esB(?+vETl$&8-=11RP0yVQWJTq6LmUNG-+| z_^klTDKoG%8;wLBV~ZH>^`!BVh{K~>7X~vGg1Gzo!geL}hFkYc0PjxbQn-&^=THG$ zL$5oYQ>nT!O{B%c`60wm5_`FPkur7sp>O|utp5E$Fdi@U@B#cFmArP-`ntj@FW6Yk zENm;`PD)D+Ai9*g%uz0oHr1B?p=l#bieGX z5YXcDvUE8hbfj3Ik&4}}1o?s22=f>s>LBHu>*X@D1p7FstYuIly+vEdi;@v9Rf736 zXQn8fjG;E#MSny`6YaY^=@*iZ@Vc|AO>Q#T+W0i_pZbmeI9#&4V!_wM+%XniOxlGj z8h(&DMoHHt0vVL4(rinAc9B;bcQx>5C?Th0>L@U|Ypg0QqM@=IU{L)&z+Xv*`UBdW zcqwTneS=;r&v@5VTiCOH&N-%ncqWm=>KeZrts zyxJ?ALC=4ZaIh7)HYmRsCml3hZLGbV)l^fW^k5KW<&9VFMr4;u*Naz|f}k%G?n8Uf zs5n`@v=+)WrS3BiaPU||s}SJvxu+WNd_0Sliqo)h-&&77Bq4d+#tcdsGD+M2z}Is0 zBS7Ut>+LBTm3;XPt}7-TJT7~qYpqMHwfTyP4+M)*IBV}W*A;9`9_vV*bj1MKO6i^l zn@U|-*;4>YyAigRyWX0D1oX55r79(NLnR+w$KtLO_?D_ocv&N3-M+7q=htB>29=p_ zOX0^sTza!@c{5Ak`kwVl>hSa7YAS|X%Q!u!y@SyL{gi|zZAcfEtEQyL-lugJP6R7MoEogBKBk}8&6$Kr%e^kV$j7+4x7#9-O7w6`amP|y zZP->&AZvO0c88S}T$;Ssl{g*J6F~FnC!*tARy$HI>~+&az&1&BA$H3>DSx6I_DdpW za*vkQ!8uu>W{WP|QBC@C!@F4ne-7Tq-&FvWCv@h{0me5!R#<@ud_1bD7}$R%BzC&6 z*({H@ul79mBejGj=6gt9QEzJ}5MIB{=l-I8%~#SnJ28MZX-x8dG~#|fErd}y zK7nS02v@%Vo(23t4)GC3PXozA3w{ssdXKXiCy4(Zr9wO>45BBq9d-mqMzEQE6h}~; zpZoxSy{6Yg;@O(n_3rVc010$m(;IsOim2(WWK*ad8n&-bwrwkVrS*B{de~+F*C#(8 z8k|^H1s3!9NZH7&q*W|waErI+wK)nt@xcS=rh zRva~H?;l?AYan@hJu6Jyl&`;zhYvi;6QS^8*`)leAyo4mR1!?QQhpUl1SHlkHdS@K z_-x=3-+y$uycTQ9YS=wE*%?-tA7i1-QZMc+X$m2pDIR3EEHjyDCDbn}RkGqdQ7P&F zR%a>aS-(>0nHrOzzM>QF(!Y5X0GBsponyhq@>%ObKC{goY}OlhgCC#*gd4PU|3xp! zXTuCYh)h0tev_R=4*nu}kM&7t)nM}Ll74bliS$L^q9cCL0F|yA`E^R~HT8<*JIWRC zIDep$7jS$}@7pGBvq$B-IBZ*_bfzT)(;p!lasj_OzM1s*saZ~!Bz~%!R~NNZNhg;n zh}~C_;HA_qC}j!1pi`T8rxB3EdRw;uUvE)I>>$EkSa>NdUL|K9TID{ye??HYubMz> zVO_dakiU>*xuib_nQIZCX3Jg&_pHA7X*!Y7qgrV_j8(uXYP4I;S!sbW070_)-TKO$ z=dQvNo~(Q8ul3?7&kSK&Z_*?JCnSTCAj%|isl4mX`j|J!l6PF;Y9;ky3`9hqzPJ*c zhwnc{YsbB@ss!oN6Mm1{Yz!gRD3RfgRGQGMIXbIV`%uSg(ta_}RAVKJyFU$Q8%&q~ zL#=s>Ru7!O*d(2#Tkycp_WD9DQyxP(`ycbJy_0h~0B6%kNq&3Et%2qCtvIP0vQ=DJaKaEQy$K}6X0 z^a%%zLz?>@lKDQU1a(IX{Ek!gK+xQ`qhkvyoSoQ$m(Jt3qQIAul#|hEtNdo&3_B{p z53U+sk3j*kbUh8|Z{>d>v8zbrxpcYH3SD{F%O)G8*wyP3I_cfhIP6(TN-EGRHg6b< ziMOQLWpHM(JNXP} zkBDt$H+r)_PHKxu_}xuS+9M$|k2`@dYQwlk!hT!bS39Vdpgt^WEi~K%a_eGRJCJ_8#RhE^+kMACn@!2;7+AuEp z?$yMUsqnw+izeqstBA2pXdbS|^zG=y6qbr` zG<#yGv5M)w>RzgVO~r}sZ9?-oL7K3hK6 zy+g`z`Ert6uS;iUqAJ$|?(^(p!FCTKedGU+GZd7h`KRHZr^-W};Dx^=t8fM%tvOvE zZ-4iCQO8;x_+aRRMS)Cq?RwZo+RyaLU`r)m;{bKJ^HJuog^c7wM7KWH6SVzZRhh7@ z;9E74>${IKE3V?t`$fGg82KNol&xK&Id_9C@A@($>Dh@E67P5E;_CN!xX`uSX)cu| zChbg>zoT$))R6G7PE-@OU1fr0Jw8p^X8knDOz|q0_Dg-$XDzFBo}UXXH^vjWnoP* zYF~v&)XS*K#p=r4$yr9;Yezl3Ez)|&w&H`A^`&)zCPr>dDC9t0uTD^sEg1zFg_5!>$yH|?N}G^q@jUS;Lm$zFv;dx1 zrp>J%I_WR$@=OBD++%9))5KAwE$HsH!;0`%Tk~je@>-fTAo%?MkaeWO5AjRz?Ol?L#a95!U&`P?OZbTzOOJ5HBbei^*_lR8&t;x zMH(=n$$r@%U!RMIu?cP`vo%Z8;b^cnsyx@}PPH;B5iEA6o(MK$6AvR54nvhc)L@A*;w-}j=G;`u>^8SPdENgILm@} zGr@AZ-4kEY3gplx1tbT;j1Vg)B$#DGdX0R!+4SHZCtAK&6535*F_*qUaxfZvJEI2K zEX4T^fnND$-x8t`OXi`G=S_~G3;g+Jpe@(qQS4~bQE&mu#_qqL3BGC8ti*N zwj^`bVs^WLoHP%gr8J~vh?g$#wr?K>$*`4?Ssf{T1rpy-7K{Ax;>-Iih5kVuL=(p@ zF4W|D*<_xM#;qa%{4xMeT8H3MAoDmM^r;ttyb^R|z*mkg&G56rBRg$e`nx^u!>%GB znP0s$LU;CSj=6XEYuW^cT$sCUxa|b6)!E+knDqY4@P>%2YYWYW&CP4Iu(xh+zoZ2@ zv_de}Au*B^z$QE^zw02__sv4E(h0p-3ZG;}3Ra3#B367(T#t3`RM6>dg)_;s_?C{l zrpmc?S=e(U$EDB7I19-KyA4rRNYDUfv;w=KoZ5SX;ySX*t*>=myra>+buPrDo z2|w~Sl`fglD6*ij)`Kyn8W10HIrgwtO_m_f>AecGs|B%IxOtADom#naIp!X`BlNAt zTUY*Dgg9f3H*=wg%%Sgr1;*lO0WfOkS7#2^yHz9urA14uLCT4VAU4m*>bA;Ds@8m* zDzDu7`2dG$I$M$$FuLwT!7o}=D`@HuBKq!U_s#Ye9BbQ1ZZ`fZ_x2+#r`K3zN9?*& z#i{mfj-N+G$^%bXT94>^9CD}NtXLZfv1*|ELT4m`o|FnTS#cAImqZr6D@z;|VxLeh zd^I!<{mRWyO9Qavv6xK0AEgb9)Mw>vPQBzH9k)kyqSc!E`6J%H90n) zc>K-cz`}Qw|ETR(#xY>;1zlM2ymnBEk8_h zJuDKzx&cT>#X&=1c0;~XU42##HUeo)S=b6mm-drQkPK|ZksV%k6*NO0`+lo8ALxB% z1N!Je|Hb`TYtX39CDz+hM=Wp`Ae9*HfD)%Y zZ-faFtA(VU);^PZE|zAV`1XGK1$s0k!wCfuXlv@=2nHJ2`~iZDEm07eIY|Mee?U5< z03A|h005vzO3JE3%EIv*;AGYzW#?cfW#j&1#QuB4@f*+mn}X{V;$nHlv9kY$UT0ak ze&e`bC2_Ja>yhe_{z((pKQ#Rz{7+Ndf1BdtV^Vdq12V}09gR$l9F3S%oQxfRBQ)h? znPh>s=8m68Spm%K0s<(Ae{+RT(ACb!#0uz0Y78{Du;nK^Y3U#%wJ_x;(_oha$k~Yk zKUsWq2Ln~y}+1ukh2-pMnUR(0x1d*;M-dD%bus~h1>`JDz#s>ZnPYc3sRjsaN@@lIll~n^ z%F4mc_nY}2417$#75~YQzdH9P%ztZ|smb3xwsQho|KYEx2@}v7Xalr$ba=In`48*< zhvHusMs{wLy|KDM;vH4qM zr&M7R$3J_-HWEcCx z&Hu{#+tF8yl&yoKk*x{veWdGikiGH>7N& zEPA9&${>*A>i|Hi%p_%N1|nr<`wJ|l!zU^MU}526e=V3rm_;SnSVUe6r9an60{{OM zuL>kAtQ~=1CJF1;(ozg)0x|{ut$X2O{d4c)nr>nU;s5f2=a)|k4IN7Br)brQwTTMo zO-IgI@uR_Ed{YN0@&uz&`qGJ&h7dRarE~#`Rnn!9sGTe+WsBK%*^qxI8K&- z!LhNuuGK&Ba&i2Nyw?u%U*s_ZSYH?5zw$D(yjt-uI8N4o!Lk20yzE@B&E`MJ<6!$2 zo0++O=huIwV*zme3mpq9>%Yij;rthQ9BcrVfA*JyjhXeIZGOdZ{IgyTP8Rlm*1^Ha z3iuPRBiP8o8VE)~d~K5dlG7~z#}oN4xoQM<{7V9HaI$l8pdeCGiYrK04Rw6 kFKlB{1OuH(|1gQ^_ZwZs(dKpZ8nS;jnv0o>^{+<%FX|wCuK)l5 literal 0 HcmV?d00001 diff --git a/examples/singleapp/pdf/02.search-text/main.go b/examples/singleapp/pdf/02.search-text/main.go new file mode 100644 index 0000000..35acf14 --- /dev/null +++ b/examples/singleapp/pdf/02.search-text/main.go @@ -0,0 +1,93 @@ +package main + +import ( + "bytes" + "flag" + "io" + "log" + "os" + + "github.com/ledongthuc/pdf" +) + +type ( + Args struct { + inFile string + word string + } +) + +var ( + args Args +) + +func init() { + log.SetFlags(log.Lmicroseconds) + + flag.StringVar(&args.inFile, "in", "", "input file") + flag.StringVar(&args.word, "word", "", "search word") +} + +func main() { + flag.Parse() + + if args.inFile == "" || args.word == "" { + flag.PrintDefaults() + os.Exit(1) + } + + if err := run(); err != nil { + log.Fatal(err) + } +} + +func run() error { + var ( + file *os.File + pdfR *pdf.Reader + err error + ) + + // + // 暗号化されているPDFを開こうとすると + // malformed PDF: 256-bit encryption key + // というエラーが出る + // + // 01.split-pages で利用した IPA の「安全なウェブサイトの作り方」のPDFは + // ページ分割は出来るが、テキストを抽出しようとすると + // malformed PDF: 256-bit encryption key + // と出て無理だった. + // + // サンプルなので、自前で適当に作成したPDFファイルで試す + // + file, pdfR, err = pdf.Open(args.inFile) + if err != nil { + return err + } + defer file.Close() + + var ( + buf bytes.Buffer + r io.Reader + ) + r, err = pdfR.GetPlainText() + if err != nil { + return err + } + io.Copy(&buf, r) + + var ( + data = buf.Bytes() + sep = []byte(args.word) + idx = bytes.Index(data, sep) + ) + + if idx < 0 { + log.Println("no hit.") + return nil + } + + log.Printf("hit: %d,%s", idx, data[idx:idx+len(sep)]) + + return nil +} diff --git a/go.mod b/go.mod index 316e49b..8326933 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( github.com/integrii/flaggy v1.5.2 github.com/joho/godotenv v1.5.1 github.com/k0kubun/pp/v3 v3.2.0 + github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06 golang.org/x/sys v0.21.0 // indirect golang.org/x/text v0.16.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect diff --git a/go.sum b/go.sum index c481703..98a27e6 100644 --- a/go.sum +++ b/go.sum @@ -40,6 +40,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs= github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= +github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06 h1:kacRlPN7EN++tVpGUorNGPn/4DnB7/DfTY82AOn6ccU= +github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= From 1c0bdcd0a152a9e5fa013ded070dea1bfd773af6 Mon Sep 17 00:00:00 2001 From: devlights Date: Sun, 21 Jul 2024 15:41:28 +0000 Subject: [PATCH 04/22] Add examples/singleapp/7zip/read-sevenzip --- .gitpod.Dockerfile | 2 +- .../singleapp/7zip/read-sevenzip/.gitignore | 2 + .../singleapp/7zip/read-sevenzip/Taskfile.yml | 23 ++ examples/singleapp/7zip/read-sevenzip/main.go | 79 ++++++ go.mod | 11 + go.sum | 248 +++++++++++++++++- 6 files changed, 361 insertions(+), 4 deletions(-) create mode 100644 examples/singleapp/7zip/read-sevenzip/.gitignore create mode 100644 examples/singleapp/7zip/read-sevenzip/Taskfile.yml create mode 100644 examples/singleapp/7zip/read-sevenzip/main.go diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 492c39f..07f08e8 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -21,4 +21,4 @@ RUN curl -fsSL https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz | tar printf '%s\n' 'export GOPATH=/workspace/go' \ 'export PATH=$GOPATH/bin:$PATH' > $HOME/.bashrc.d/300-go -RUN sudo apt update && sudo apt install -y universal-ctags tree nkf wamerican +RUN sudo apt update && sudo apt install -y universal-ctags tree nkf wamerican p7zip-full libarchive-zip-perl diff --git a/examples/singleapp/7zip/read-sevenzip/.gitignore b/examples/singleapp/7zip/read-sevenzip/.gitignore new file mode 100644 index 0000000..048bc3e --- /dev/null +++ b/examples/singleapp/7zip/read-sevenzip/.gitignore @@ -0,0 +1,2 @@ +*.7z +app \ No newline at end of file diff --git a/examples/singleapp/7zip/read-sevenzip/Taskfile.yml b/examples/singleapp/7zip/read-sevenzip/Taskfile.yml new file mode 100644 index 0000000..d5166f4 --- /dev/null +++ b/examples/singleapp/7zip/read-sevenzip/Taskfile.yml @@ -0,0 +1,23 @@ +# https://taskfile.dev + +version: '3' + +vars: + APP: app + ARCHIVE_FILE: test.7z + +tasks: + default: + cmds: + - task: run + run: + cmds: + - 7z a {{.ARCHIVE_FILE}} main.go -bso0 -bsp0 + - defer: rm -f {{.ARCHIVE_FILE}} + - go build -o {{.APP}}{{.exeExt}} . + - ./{{.APP}}{{.exeExt}} -in {{.ARCHIVE_FILE}} + # crc32 コマンドは libarchive-zip-perl パッケージでインストールできる + - crc32 main.go + # crc32 コマンドが存在しない場合は gzip コマンドの出力からCRC32を得ることも出来る + #- gzip -1 -c main.go | tail -c 8 | head -c 4 | hexdump -e '"%04x"'; echo '' + - wc --bytes main.go diff --git a/examples/singleapp/7zip/read-sevenzip/main.go b/examples/singleapp/7zip/read-sevenzip/main.go new file mode 100644 index 0000000..a8f1102 --- /dev/null +++ b/examples/singleapp/7zip/read-sevenzip/main.go @@ -0,0 +1,79 @@ +package main + +import ( + "bytes" + "flag" + "io" + "log" + "os" + + "github.com/bodgit/sevenzip" +) + +type ( + Args struct { + inFile string + } +) + +var ( + args Args +) + +func init() { + log.SetFlags(0) + + flag.StringVar(&args.inFile, "in", "", "input file") + flag.Parse() +} + +func main() { + if args.inFile == "" { + flag.PrintDefaults() + os.Exit(1) + } + + if err := run(); err != nil { + log.Fatal(err) + } +} + +func run() error { + var ( + reader *sevenzip.ReadCloser + err error + ) + if reader, err = sevenzip.OpenReader(args.inFile); err != nil { + return err + } + defer reader.Close() + + for _, file := range reader.File { + err = func(file *sevenzip.File) error { + var ( + in io.ReadCloser + out bytes.Buffer + ) + if in, err = file.Open(); err != nil { + return err + } + defer in.Close() + + if _, err = io.Copy(&out, in); err != nil { + return err + } + + log.Printf("[FILE ] %s", file.Name) + log.Printf("[CRC32 ] %x", file.CRC32) + log.Printf("[CONTENT] %d byte(s)", len(out.Bytes())) + + return nil + }(file) + + if err != nil { + return err + } + } + + return nil +} diff --git a/go.mod b/go.mod index 8326933..9a37eb4 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.22 require ( github.com/adrg/xdg v0.4.0 + github.com/bodgit/sevenzip v1.5.1 github.com/briandowns/spinner v1.23.1 github.com/caarlos0/env/v11 v11.1.0 github.com/cheekybits/genny v1.0.0 @@ -20,14 +21,24 @@ require ( ) require ( + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/bodgit/plumbing v1.3.0 // indirect + github.com/bodgit/windows v1.0.1 // indirect github.com/fatih/color v1.17.0 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hhrutter/lzw v1.0.0 // indirect github.com/hhrutter/tiff v1.0.1 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/ulikunitz/xz v0.5.12 // indirect + go4.org v0.0.0-20200411211856-f5505b9728dd // indirect golang.org/x/image v0.15.0 // indirect golang.org/x/term v0.21.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 98a27e6..e5bd337 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,43 @@ +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.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +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/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +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/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= +github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= +github.com/bodgit/sevenzip v1.5.1 h1:rVj0baZsooZFy64DJN0zQogPzhPrT8BQ8TTRd1H4WHw= +github.com/bodgit/sevenzip v1.5.1/go.mod h1:Q3YMySuVWq6pyGEolyIE98828lOfEoeWg5zeH6x22rc= +github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4= +github.com/bodgit/windows v1.0.1/go.mod h1:a6JLwrB4KrTR5hBpp8FI9/9W9jJfeQ2h4XDXU74ZCdM= github.com/briandowns/spinner v1.23.1 h1:t5fDPmScwUjozhDj4FA46p5acZWIPXYE30qW2Ptu650= github.com/briandowns/spinner v1.23.1/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM= github.com/caarlos0/env/v11 v11.1.0 h1:a5qZqieE9ZfzdvbbdhTalRrHT5vu/4V1/ad1Ka6frhI= github.com/caarlos0/env/v11 v11.1.0/go.mod h1:LwgkYk1kDvfGpHthrWWLof3Ny7PezzFwS4QrsJdHTMo= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +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/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= @@ -15,6 +47,8 @@ github.com/devlights/gomy v0.6.0 h1:7BT8bSxr+ZeNkgEYNufuM2rSc6kIoN6g2FSZvrcT9zw= github.com/devlights/gomy v0.6.0/go.mod h1:d28qyQ+/s7JravMlss2kIFxWxhY2KLlpe7rIBZ5YKeA= github.com/devlights/try-golang v0.5.23 h1:D1W9MVEJwHD7d/KCbbFmGE0shwQnipNX0gUh52HHqlo= github.com/devlights/try-golang v0.5.23/go.mod h1:B0udvQBJuWjXhH1W8993hn/1zCxrhboEXlVYVpiMzLM= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= @@ -24,22 +58,68 @@ github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRt github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +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/goccy/go-reflect v1.1.0/go.mod h1:n0oYZn8VcV2CkWTxi8B9QjkCoq6GTtCEdfmR66YhFtE= github.com/goccy/go-reflect v1.2.0 h1:O0T8rZCuNmGXewnATuKYnkL0xm6o8UNOJZd/gOkb9ms= github.com/goccy/go-reflect v1.2.0/go.mod h1:n0oYZn8VcV2CkWTxi8B9QjkCoq6GTtCEdfmR66YhFtE= +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/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/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/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.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +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-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +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/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +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/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0= github.com/hhrutter/lzw v1.0.0/go.mod h1:2HC6DJSn/n6iAZfgM3Pg+cP1KxeWc3ezG8bBqW5+WEo= github.com/hhrutter/tiff v1.0.1 h1:MIus8caHU5U6823gx7C6jrfoEvfSTGtEFRiM8/LOzC0= github.com/hhrutter/tiff v1.0.1/go.mod h1:zU/dNgDm0cMIa8y8YwcYBeuEEveI4B0owqHyiPpJPHc= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/integrii/flaggy v1.5.2 h1:bWV20MQEngo4hWhno3i5Z9ISPxLPKj9NOGNwTWb/8IQ= github.com/integrii/flaggy v1.5.2/go.mod h1:dO13u7SYuhk910nayCJ+s1DeAAGC1THCMj1uSFmwtQ8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +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/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs= github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06 h1:kacRlPN7EN++tVpGUorNGPn/4DnB7/DfTY82AOn6ccU= github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -56,26 +136,112 @@ github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/pdfcpu/pdfcpu v0.8.0 h1:SuEB4uVsPFz1nb802r38YpFpj9TtZh/oB0bGG34IRZw= github.com/pdfcpu/pdfcpu v0.8.0/go.mod h1:jj03y/KKrwigt5xCi8t7px2mATcKuOzkIOoCX62yMho= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/skanehira/clipboard-image/v2 v2.0.0 h1:Kp+RNOgIlgzDkP3EskwuBnM0Fk4sc+HgcWE5RC+PnNI= github.com/skanehira/clipboard-image/v2 v2.0.0/go.mod h1:NXSYl4FJinIUFKJfeP1lGz8DIEUYjnEqwdMZ777S1E0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= +github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +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= +go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= +go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= +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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-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-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +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.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +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/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/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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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-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-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-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/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/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.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190222072716-a9d3bda3a223/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-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-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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -84,15 +250,91 @@ golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +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.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +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/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-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-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-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-20200130002326-2f3ba24bd6e7/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/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= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +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/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/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-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +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.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= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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.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= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From 8621d7b476a178b12af40eb649677e8225f4edca Mon Sep 17 00:00:00 2001 From: devlights Date: Mon, 22 Jul 2024 02:35:07 +0000 Subject: [PATCH 05/22] Update --- examples/singleapp/7zip/read-sevenzip/Taskfile.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/singleapp/7zip/read-sevenzip/Taskfile.yml b/examples/singleapp/7zip/read-sevenzip/Taskfile.yml index d5166f4..3fe3834 100644 --- a/examples/singleapp/7zip/read-sevenzip/Taskfile.yml +++ b/examples/singleapp/7zip/read-sevenzip/Taskfile.yml @@ -19,5 +19,5 @@ tasks: # crc32 コマンドは libarchive-zip-perl パッケージでインストールできる - crc32 main.go # crc32 コマンドが存在しない場合は gzip コマンドの出力からCRC32を得ることも出来る - #- gzip -1 -c main.go | tail -c 8 | head -c 4 | hexdump -e '"%04x"'; echo '' + #- gzip -1 -c main.go | tail -c 8 | head -c 4 | hexdump -e '"%08x"'; echo '' - wc --bytes main.go From 2e31d05919fdd9cff0253b695d5042fdf5fe1bfd Mon Sep 17 00:00:00 2001 From: devlights Date: Thu, 8 Aug 2024 08:06:00 +0000 Subject: [PATCH 06/22] Update .gitpod.Dockerfile --- .gitpod.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 07f08e8..218ccc5 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,6 +1,6 @@ FROM gitpod/workspace-base:latest -ENV GO_VERSION=1.22.5 +ENV GO_VERSION=1.22.6 # For ref, see: https://github.com/gitpod-io/workspace-images/blob/61df77aad71689504112e1087bb7e26d45a43d10/chunks/lang-go/Dockerfile#L10 ENV GOPATH=$HOME/go-packages From 30c2ee07f46d8b4f265c6d9522ceb14951033468 Mon Sep 17 00:00:00 2001 From: devlights Date: Wed, 14 Aug 2024 08:10:58 +0000 Subject: [PATCH 07/22] Update .gitpod.Dockerfile and go.mod --- .gitpod.Dockerfile | 29 +++++++++++++++-------------- go.mod | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 218ccc5..04574f6 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,24 +1,25 @@ FROM gitpod/workspace-base:latest -ENV GO_VERSION=1.22.6 +USER gitpod +ENV GO_VERSION=1.23.0 # For ref, see: https://github.com/gitpod-io/workspace-images/blob/61df77aad71689504112e1087bb7e26d45a43d10/chunks/lang-go/Dockerfile#L10 ENV GOPATH=$HOME/go-packages ENV GOROOT=$HOME/go ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH -RUN curl -fsSL https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz | tar xzs && \ - go install -v github.com/uudashr/gopkgs/cmd/gopkgs@v2 && \ - go install -v github.com/ramya-rao-a/go-outline@latest && \ - go install -v github.com/cweill/gotests/gotests@latest && \ - go install -v github.com/fatih/gomodifytags@latest && \ - go install -v github.com/josharian/impl@latest && \ - go install -v github.com/haya14busa/goplay/cmd/goplay@latest && \ - go install -v github.com/go-delve/delve/cmd/dlv@latest && \ - go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@latest && \ - go install -v honnef.co/go/tools/cmd/staticcheck@latest && \ - go install -v golang.org/x/tools/gopls@latest && \ - printf '%s\n' 'export GOPATH=/workspace/go' \ +RUN curl -fsSL https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz | tar xzs +RUN go install -v github.com/uudashr/gopkgs/cmd/gopkgs@v2 +RUN go install -v github.com/ramya-rao-a/go-outline@latest +RUN go install -v github.com/cweill/gotests/gotests@latest +RUN go install -v github.com/fatih/gomodifytags@latest +RUN go install -v github.com/josharian/impl@latest +RUN go install -v github.com/haya14busa/goplay/cmd/goplay@latest +RUN go install -v github.com/go-delve/delve/cmd/dlv@latest +RUN go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@latest +RUN go install -v honnef.co/go/tools/cmd/staticcheck@latest +RUN go install -v golang.org/x/tools/gopls@latest +RUN printf '%s\n' 'export GOPATH=/workspace/go' \ 'export PATH=$GOPATH/bin:$PATH' > $HOME/.bashrc.d/300-go -RUN sudo apt update && sudo apt install -y universal-ctags tree nkf wamerican p7zip-full libarchive-zip-perl +RUN sudo apt update && sudo apt install -y universal-ctags tree nkf wamerican \ No newline at end of file diff --git a/go.mod b/go.mod index 9a37eb4..d25e847 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/devlights/try-golang-extlib -go 1.22 +go 1.23 require ( github.com/adrg/xdg v0.4.0 From ba2c607ae8547ac0ccdcb2a5c0be1c116bb5d624 Mon Sep 17 00:00:00 2001 From: devlights Date: Wed, 14 Aug 2024 08:19:08 +0000 Subject: [PATCH 08/22] go mod tidy --- go.mod | 24 ++++++++++---------- go.sum | 70 ++++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index d25e847..0f5eaa7 100644 --- a/go.mod +++ b/go.mod @@ -3,21 +3,21 @@ module github.com/devlights/try-golang-extlib go 1.23 require ( - github.com/adrg/xdg v0.4.0 + github.com/adrg/xdg v0.5.0 github.com/bodgit/sevenzip v1.5.1 github.com/briandowns/spinner v1.23.1 - github.com/caarlos0/env/v11 v11.1.0 + github.com/caarlos0/env/v11 v11.2.2 github.com/cheekybits/genny v1.0.0 github.com/deckarep/golang-set v1.8.0 github.com/devlights/gomy v0.6.0 - github.com/devlights/try-golang v0.5.23 + github.com/devlights/try-golang v0.5.25 github.com/getsentry/sentry-go v0.28.1 github.com/google/go-cmp v0.6.0 github.com/nokute78/go-bit/v2 v2.2.1 github.com/nxadm/tail v1.4.11 github.com/pdfcpu/pdfcpu v0.8.0 github.com/skanehira/clipboard-image/v2 v2.0.0 - golang.org/x/sync v0.7.0 + golang.org/x/sync v0.8.0 ) require ( @@ -25,22 +25,22 @@ require ( github.com/bodgit/plumbing v1.3.0 // indirect github.com/bodgit/windows v1.0.1 // indirect github.com/fatih/color v1.17.0 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hhrutter/lzw v1.0.0 // indirect github.com/hhrutter/tiff v1.0.1 // indirect - github.com/klauspost/compress v1.17.7 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/ulikunitz/xz v0.5.12 // indirect - go4.org v0.0.0-20200411211856-f5505b9728dd // indirect - golang.org/x/image v0.15.0 // indirect - golang.org/x/term v0.21.0 // indirect + go4.org v0.0.0-20230225012048-214862532bf5 // indirect + golang.org/x/image v0.19.0 // indirect + golang.org/x/term v0.23.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) @@ -51,7 +51,7 @@ require ( github.com/joho/godotenv v1.5.1 github.com/k0kubun/pp/v3 v3.2.0 github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06 - golang.org/x/sys v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/text v0.17.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect ) diff --git a/go.sum b/go.sum index e5bd337..2c618f9 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY= +github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= @@ -29,8 +29,8 @@ github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4= github.com/bodgit/windows v1.0.1/go.mod h1:a6JLwrB4KrTR5hBpp8FI9/9W9jJfeQ2h4XDXU74ZCdM= github.com/briandowns/spinner v1.23.1 h1:t5fDPmScwUjozhDj4FA46p5acZWIPXYE30qW2Ptu650= github.com/briandowns/spinner v1.23.1/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM= -github.com/caarlos0/env/v11 v11.1.0 h1:a5qZqieE9ZfzdvbbdhTalRrHT5vu/4V1/ad1Ka6frhI= -github.com/caarlos0/env/v11 v11.1.0/go.mod h1:LwgkYk1kDvfGpHthrWWLof3Ny7PezzFwS4QrsJdHTMo= +github.com/caarlos0/env/v11 v11.2.2 h1:95fApNrUyueipoZN/EhA8mMxiNxrBwDa+oAZrMWl3Kg= +github.com/caarlos0/env/v11 v11.2.2/go.mod h1:JBfcdeQiBoI3Zh1QRAWfe+tpiNTmDtcCj/hHHHMx0vc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= @@ -45,8 +45,8 @@ github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsP github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/devlights/gomy v0.6.0 h1:7BT8bSxr+ZeNkgEYNufuM2rSc6kIoN6g2FSZvrcT9zw= github.com/devlights/gomy v0.6.0/go.mod h1:d28qyQ+/s7JravMlss2kIFxWxhY2KLlpe7rIBZ5YKeA= -github.com/devlights/try-golang v0.5.23 h1:D1W9MVEJwHD7d/KCbbFmGE0shwQnipNX0gUh52HHqlo= -github.com/devlights/try-golang v0.5.23/go.mod h1:B0udvQBJuWjXhH1W8993hn/1zCxrhboEXlVYVpiMzLM= +github.com/devlights/try-golang v0.5.25 h1:7SZGl4Q7TEF2P9nHe1xwIB31BIfxjiSkI7Iz0syu4gs= +github.com/devlights/try-golang v0.5.25/go.mod h1:uXw0mbQCBeyexcI+OppigeHdqHvwsVkytog5J73ZB1Q= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= @@ -91,8 +91,9 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= 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-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -113,8 +114,8 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs= github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -128,8 +129,8 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/nokute78/go-bit/v2 v2.2.1 h1:+y0ZSHdkCSUVdQ7NWQ1mG6RXbj9dHo8yGUE20o2EurQ= github.com/nokute78/go-bit/v2 v2.2.1/go.mod h1:YdJ4k4TQ0z7Q9Xah9cVMZDUQbjyH1ghC00kKi0h+XpA= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= @@ -156,7 +157,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ 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/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -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= @@ -164,16 +164,18 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 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= -go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= -go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= +go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc= +go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU= 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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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= @@ -184,8 +186,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 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.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= -golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/image v0.19.0 h1:D9FX4QWkLfkeqaC62SonffIIuYdOk/UE2XKUBgRIBIQ= +golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys= 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= @@ -201,6 +203,7 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG 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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -214,7 +217,9 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL 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-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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 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= @@ -226,8 +231,9 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ 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.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -241,21 +247,30 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w 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-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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/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.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.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.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= 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.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -282,6 +297,7 @@ golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/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.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 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= From 03770629472af92a26c3b7f9309fb3ca01d749be Mon Sep 17 00:00:00 2001 From: devlights Date: Sat, 7 Sep 2024 23:55:05 +0900 Subject: [PATCH 09/22] Update go.mod --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 0f5eaa7..ad0b2ce 100644 --- a/go.mod +++ b/go.mod @@ -4,18 +4,18 @@ go 1.23 require ( github.com/adrg/xdg v0.5.0 - github.com/bodgit/sevenzip v1.5.1 + github.com/bodgit/sevenzip v1.5.2 github.com/briandowns/spinner v1.23.1 github.com/caarlos0/env/v11 v11.2.2 github.com/cheekybits/genny v1.0.0 github.com/deckarep/golang-set v1.8.0 github.com/devlights/gomy v0.6.0 - github.com/devlights/try-golang v0.5.25 + github.com/devlights/try-golang v0.5.26 github.com/getsentry/sentry-go v0.28.1 github.com/google/go-cmp v0.6.0 github.com/nokute78/go-bit/v2 v2.2.1 github.com/nxadm/tail v1.4.11 - github.com/pdfcpu/pdfcpu v0.8.0 + github.com/pdfcpu/pdfcpu v0.8.1 github.com/skanehira/clipboard-image/v2 v2.0.0 golang.org/x/sync v0.8.0 ) @@ -39,8 +39,8 @@ require ( github.com/rivo/uniseg v0.4.7 // indirect github.com/ulikunitz/xz v0.5.12 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/image v0.19.0 // indirect - golang.org/x/term v0.23.0 // indirect + golang.org/x/image v0.20.0 // indirect + golang.org/x/term v0.24.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) @@ -51,7 +51,7 @@ require ( github.com/joho/godotenv v1.5.1 github.com/k0kubun/pp/v3 v3.2.0 github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06 - golang.org/x/sys v0.24.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect ) diff --git a/go.sum b/go.sum index 2c618f9..60b447a 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1 github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= -github.com/bodgit/sevenzip v1.5.1 h1:rVj0baZsooZFy64DJN0zQogPzhPrT8BQ8TTRd1H4WHw= -github.com/bodgit/sevenzip v1.5.1/go.mod h1:Q3YMySuVWq6pyGEolyIE98828lOfEoeWg5zeH6x22rc= +github.com/bodgit/sevenzip v1.5.2 h1:acMIYRaqoHAdeu9LhEGGjL9UzBD4RNf9z7+kWDNignI= +github.com/bodgit/sevenzip v1.5.2/go.mod h1:gTGzXA67Yko6/HLSD0iK4kWaWzPlPmLfDO73jTjSRqc= github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4= github.com/bodgit/windows v1.0.1/go.mod h1:a6JLwrB4KrTR5hBpp8FI9/9W9jJfeQ2h4XDXU74ZCdM= github.com/briandowns/spinner v1.23.1 h1:t5fDPmScwUjozhDj4FA46p5acZWIPXYE30qW2Ptu650= @@ -45,8 +45,8 @@ github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsP github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/devlights/gomy v0.6.0 h1:7BT8bSxr+ZeNkgEYNufuM2rSc6kIoN6g2FSZvrcT9zw= github.com/devlights/gomy v0.6.0/go.mod h1:d28qyQ+/s7JravMlss2kIFxWxhY2KLlpe7rIBZ5YKeA= -github.com/devlights/try-golang v0.5.25 h1:7SZGl4Q7TEF2P9nHe1xwIB31BIfxjiSkI7Iz0syu4gs= -github.com/devlights/try-golang v0.5.25/go.mod h1:uXw0mbQCBeyexcI+OppigeHdqHvwsVkytog5J73ZB1Q= +github.com/devlights/try-golang v0.5.26 h1:zvqx3L96oFMfoQa1BAI7g2dT/thHODoXcwC/hYObhf4= +github.com/devlights/try-golang v0.5.26/go.mod h1:Q6Vm/0ME/MIJlkagv2ooYzTb2fIbIlQF0hhnJbGVxVY= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= @@ -135,8 +135,8 @@ github.com/nokute78/go-bit/v2 v2.2.1 h1:+y0ZSHdkCSUVdQ7NWQ1mG6RXbj9dHo8yGUE20o2E github.com/nokute78/go-bit/v2 v2.2.1/go.mod h1:YdJ4k4TQ0z7Q9Xah9cVMZDUQbjyH1ghC00kKi0h+XpA= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/pdfcpu/pdfcpu v0.8.0 h1:SuEB4uVsPFz1nb802r38YpFpj9TtZh/oB0bGG34IRZw= -github.com/pdfcpu/pdfcpu v0.8.0/go.mod h1:jj03y/KKrwigt5xCi8t7px2mATcKuOzkIOoCX62yMho= +github.com/pdfcpu/pdfcpu v0.8.1 h1:AiWUb8uXlrXqJ73OmiYXBjDF0Qxt4OuM281eAfkAOMA= +github.com/pdfcpu/pdfcpu v0.8.1/go.mod h1:M5SFotxdaw0fedxthpjbA/PADytAo6wJnGH0SSBWJ7s= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= @@ -186,8 +186,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 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.19.0 h1:D9FX4QWkLfkeqaC62SonffIIuYdOk/UE2XKUBgRIBIQ= -golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys= +golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw= +golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM= 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= @@ -255,13 +255,13 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/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.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.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.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= 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= @@ -269,8 +269,8 @@ 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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 8266ce81f948fe991ac2ea12b6f9207ea1236373 Mon Sep 17 00:00:00 2001 From: devlights Date: Sat, 7 Sep 2024 23:55:34 +0900 Subject: [PATCH 10/22] Update .gitpod.Dockerfile --- .gitpod.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 04574f6..a9c7cf8 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,7 +1,7 @@ FROM gitpod/workspace-base:latest USER gitpod -ENV GO_VERSION=1.23.0 +ENV GO_VERSION=1.23.1 # For ref, see: https://github.com/gitpod-io/workspace-images/blob/61df77aad71689504112e1087bb7e26d45a43d10/chunks/lang-go/Dockerfile#L10 ENV GOPATH=$HOME/go-packages From ee3cefdf70fae15d2634b6cdfd899ec485553ceb Mon Sep 17 00:00:00 2001 From: devlights Date: Fri, 13 Sep 2024 07:15:46 +0000 Subject: [PATCH 11/22] Add examples/singleapp/basic --- examples/singleapp/semver/basic/Taskfile.yml | 8 +++ examples/singleapp/semver/basic/main.go | 59 ++++++++++++++++++++ go.mod | 1 + go.sum | 2 + 4 files changed, 70 insertions(+) create mode 100644 examples/singleapp/semver/basic/Taskfile.yml create mode 100644 examples/singleapp/semver/basic/main.go diff --git a/examples/singleapp/semver/basic/Taskfile.yml b/examples/singleapp/semver/basic/Taskfile.yml new file mode 100644 index 0000000..6210a5f --- /dev/null +++ b/examples/singleapp/semver/basic/Taskfile.yml @@ -0,0 +1,8 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - go run . diff --git a/examples/singleapp/semver/basic/main.go b/examples/singleapp/semver/basic/main.go new file mode 100644 index 0000000..16e8094 --- /dev/null +++ b/examples/singleapp/semver/basic/main.go @@ -0,0 +1,59 @@ +package main + +import ( + "log" + + "github.com/Masterminds/semver/v3" +) + +func main() { + log.SetFlags(0) + + if err := run(); err != nil { + panic(err) + } +} + +func run() error { + // + // semverパッケージは、Goでセマンティックバージョンを扱う機能を提供する。 + // + // 基本的な機能は以下。 + // + // - セマンティックバージョンの解析 + // - セマンティック・バージョンが一連の制約の範囲内に収まるかどうかをチェック + // - セマンティックバージョンのソート + // - v接頭辞についての挙動 + // + var ( + version *semver.Version + err error + ) + + // + // セマンティックバージョンの解析 + // + if version, err = semver.NewVersion("v1.2.3"); err != nil { + return err + } + log.Printf("%#v", version) + + // + // セマンティック・バージョンが一連の制約の範囲内に収まるかどうかをチェック + // + var ( + c1 *semver.Constraints + c2 *semver.Constraints + ) + if c1, err = semver.NewConstraint(">= v1.1.0"); err != nil { + return err + } + if c2, err = semver.NewConstraint("<= v1.1.0"); err != nil { + return err + } + + log.Println(c1, c1.Check(version)) + log.Println(c2, c2.Check(version)) + + return nil +} diff --git a/go.mod b/go.mod index ad0b2ce..b27bcf8 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/devlights/try-golang-extlib go 1.23 require ( + github.com/Masterminds/semver/v3 v3.3.0 github.com/adrg/xdg v0.5.0 github.com/bodgit/sevenzip v1.5.2 github.com/briandowns/spinner v1.23.1 diff --git a/go.sum b/go.sum index 60b447a..19dc40b 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY= github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= From 21200eddf928b598419afdb9565ab9af8f99b132 Mon Sep 17 00:00:00 2001 From: devlights Date: Fri, 13 Sep 2024 08:35:21 +0000 Subject: [PATCH 12/22] Add examples/singleapp/semver/parse --- examples/singleapp/semver/parse/Taskfile.yml | 8 +++ examples/singleapp/semver/parse/main.go | 53 ++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 examples/singleapp/semver/parse/Taskfile.yml create mode 100644 examples/singleapp/semver/parse/main.go diff --git a/examples/singleapp/semver/parse/Taskfile.yml b/examples/singleapp/semver/parse/Taskfile.yml new file mode 100644 index 0000000..6210a5f --- /dev/null +++ b/examples/singleapp/semver/parse/Taskfile.yml @@ -0,0 +1,8 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - go run . diff --git a/examples/singleapp/semver/parse/main.go b/examples/singleapp/semver/parse/main.go new file mode 100644 index 0000000..6624aa4 --- /dev/null +++ b/examples/singleapp/semver/parse/main.go @@ -0,0 +1,53 @@ +package main + +import ( + "encoding/json" + "encoding/xml" + "log" + "os" + + "github.com/Masterminds/semver/v3" +) + +func main() { + log.SetFlags(0) + log.SetOutput(os.Stdout) + + if err := run(); err != nil { + panic(err) + } +} + +func run() error { + var ( + version *semver.Version + err error + ) + + if version, err = semver.NewVersion("v1.2.3-beta-10+build456"); err != nil { + return err + } + log.Printf("%#v", version) + + var ( + b []byte + ) + + if b, err = json.Marshal(version); err != nil { + return err + } + log.Println(string(b)) + + if b, err = xml.Marshal(version); err != nil { + return err + } + log.Println(string(b)) + + log.Printf("Major: %v", version.Major()) + log.Printf("Mivor: %v", version.Minor()) + log.Printf("Patch: %v", version.Patch()) + log.Printf("Pre : %v", version.Prerelease()) + log.Printf("Meta : %v", version.Metadata()) + + return nil +} From 48fa65673d0e526cd97aeb781bbc3d005e50354b Mon Sep 17 00:00:00 2001 From: devlights Date: Fri, 13 Sep 2024 08:55:45 +0000 Subject: [PATCH 13/22] Add examples/singleapp/semver/sort --- examples/singleapp/semver/sort/Taskfile.yml | 8 +++ examples/singleapp/semver/sort/main.go | 66 +++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 examples/singleapp/semver/sort/Taskfile.yml create mode 100644 examples/singleapp/semver/sort/main.go diff --git a/examples/singleapp/semver/sort/Taskfile.yml b/examples/singleapp/semver/sort/Taskfile.yml new file mode 100644 index 0000000..6210a5f --- /dev/null +++ b/examples/singleapp/semver/sort/Taskfile.yml @@ -0,0 +1,8 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - go run . diff --git a/examples/singleapp/semver/sort/main.go b/examples/singleapp/semver/sort/main.go new file mode 100644 index 0000000..c68afb7 --- /dev/null +++ b/examples/singleapp/semver/sort/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "log" + "os" + "sort" + + "github.com/Masterminds/semver/v3" +) + +func main() { + log.SetFlags(0) + log.SetOutput(os.Stdin) + + if err := run(); err != nil { + panic(err) + } +} + +func run() error { + var ( + rawVersions = []string{ + "v1.0.0", + "1.0.3", + "1.0.4-beta.1", + "v1.2.3", + "v1.2.3-rc.3+build65536", + "v1.1.4-alpha.3", + "v0.9.2", + "v0.8.4", + "0.2.3-beta.4+build10", + } + + versions = make([]*semver.Version, len(rawVersions)) + ) + + for i, v := range rawVersions { + var ( + ver *semver.Version + err error + ) + + if ver, err = semver.NewVersion(v); err != nil { + return err + } + + versions[i] = ver + } + + printVers(versions) + hr() + sort.Sort(semver.Collection(versions)) + printVers(versions) + + return nil +} + +func printVers(versions []*semver.Version) { + for _, v := range versions { + log.Println(v) + } +} + +func hr() { + log.Println("------------------------------") +} From 2281b9c705391859f36d5efb4730921ef2cbec2f Mon Sep 17 00:00:00 2001 From: devlights Date: Fri, 13 Sep 2024 09:23:24 +0000 Subject: [PATCH 14/22] Add examples/singleapp/semver/check --- examples/singleapp/semver/check/Taskfile.yml | 8 ++++ examples/singleapp/semver/check/main.go | 48 ++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 examples/singleapp/semver/check/Taskfile.yml create mode 100644 examples/singleapp/semver/check/main.go diff --git a/examples/singleapp/semver/check/Taskfile.yml b/examples/singleapp/semver/check/Taskfile.yml new file mode 100644 index 0000000..6210a5f --- /dev/null +++ b/examples/singleapp/semver/check/Taskfile.yml @@ -0,0 +1,8 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - go run . diff --git a/examples/singleapp/semver/check/main.go b/examples/singleapp/semver/check/main.go new file mode 100644 index 0000000..728134a --- /dev/null +++ b/examples/singleapp/semver/check/main.go @@ -0,0 +1,48 @@ +package main + +import ( + "log" + "os" + + "github.com/Masterminds/semver/v3" +) + +func main() { + log.SetFlags(0) + log.SetOutput(os.Stdout) + + if err := run(); err != nil { + panic(err) + } +} + +func run() error { + var ( + ver *semver.Version + c1 *semver.Constraints + c2 *semver.Constraints + c3 *semver.Constraints + err error + ) + if ver, err = semver.NewVersion("v1.2.3"); err != nil { + return err + } + if c1, err = semver.NewConstraint(">= v1.2.2"); err != nil { + return err + } + if c2, err = semver.NewConstraint(">= v1.2.4"); err != nil { + return err + } + if c3, err = semver.NewConstraint("<= v1.2.4"); err != nil { + return err + } + + var ( + constraints = []*semver.Constraints{c1, c2, c3} + ) + for _, c := range constraints { + log.Printf("%s compare %s ==> %v", ver, c, c.Check(ver)) + } + + return nil +} From 2558c9233b806b6a144e7fa1e31759822ca4a9db Mon Sep 17 00:00:00 2001 From: devlights Date: Thu, 26 Sep 2024 09:35:53 +0000 Subject: [PATCH 15/22] Add examples/etree/{read,write} --- examples/etree/README.md | 7 +++ examples/etree/read/Taskfile.yml | 17 +++++++ examples/etree/read/main.go | 78 +++++++++++++++++++++++++++++++ examples/etree/write/Taskfile.yml | 8 ++++ examples/etree/write/main.go | 61 ++++++++++++++++++++++++ go.mod | 1 + go.sum | 2 + 7 files changed, 174 insertions(+) create mode 100644 examples/etree/README.md create mode 100644 examples/etree/read/Taskfile.yml create mode 100644 examples/etree/read/main.go create mode 100644 examples/etree/write/Taskfile.yml create mode 100644 examples/etree/write/main.go diff --git a/examples/etree/README.md b/examples/etree/README.md new file mode 100644 index 0000000..422c234 --- /dev/null +++ b/examples/etree/README.md @@ -0,0 +1,7 @@ +# これは何? + +XMLを扱うライブラリ [etree](https://github.com/beevik/etree) のサンプルを置いています。 + +## 参考情報 + +- [etree](https://github.com/beevik/etree) diff --git a/examples/etree/read/Taskfile.yml b/examples/etree/read/Taskfile.yml new file mode 100644 index 0000000..93cdb47 --- /dev/null +++ b/examples/etree/read/Taskfile.yml @@ -0,0 +1,17 @@ +# https://taskfile.dev + +version: '3' + +vars: + XML_FILE: langs.xml + +tasks: + default: + cmds: + - task: gen + - defer: rm -f {{.XML_FILE}} + - go run . + gen: + dir: ../write + cmds: + - go run . > ../read/{{.XML_FILE}} \ No newline at end of file diff --git a/examples/etree/read/main.go b/examples/etree/read/main.go new file mode 100644 index 0000000..c0d4d22 --- /dev/null +++ b/examples/etree/read/main.go @@ -0,0 +1,78 @@ +package main + +import ( + "context" + "log/slog" + "os" + + "github.com/beevik/etree" +) + +var ( + logger *slog.Logger +) + +func init() { + logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { + switch { + case a.Key == slog.LevelKey: + return slog.Attr{} + case a.Key == slog.TimeKey: + return slog.Attr{} + case a.Key == slog.MessageKey: + return slog.Attr{Key: "tag", Value: a.Value} + default: + return a + } + }})) +} + +func main() { + var ( + rootCtx = context.Background() + ctx, cxl = context.WithCancel(rootCtx) + ) + defer cxl() + + if err := run(ctx); err != nil { + panic(err) + } +} + +func run(_ context.Context) error { + // + // etreeライブラリは、PythonのElementTreeライブラリに + // インスパイアされて作成されているXML処理ライブラリ。 + // + // 使いやすいAPIが備わっているので直感的に作業できる。 + // + + var ( + doc *etree.Document + err error + ) + doc = etree.NewDocument() + if err = doc.ReadFromFile("langs.xml"); err != nil { + return err + } + + var ( + root = doc.SelectElement("languages") + languages = root.SelectElements("language") + ) + for _, lang := range languages { + var ( + attrs = make([]any, 0) + ) + + for _, a := range lang.Attr { + attrs = append(attrs, slog.Attr{Key: a.Key, Value: slog.StringValue(a.Value)}) + } + + attrs = append(attrs, slog.Attr{Key: "text", Value: slog.StringValue(lang.Text())}) + + logger.Info(lang.Tag, attrs...) + } + + return nil +} diff --git a/examples/etree/write/Taskfile.yml b/examples/etree/write/Taskfile.yml new file mode 100644 index 0000000..6210a5f --- /dev/null +++ b/examples/etree/write/Taskfile.yml @@ -0,0 +1,8 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - go run . diff --git a/examples/etree/write/main.go b/examples/etree/write/main.go new file mode 100644 index 0000000..dc3195e --- /dev/null +++ b/examples/etree/write/main.go @@ -0,0 +1,61 @@ +package main + +import ( + "context" + "os" + + "github.com/beevik/etree" +) + +var ( + langs = map[string]string{ + "golang": "https://go.dev/", + "csharp": "https://learn.microsoft.com/ja-jp/dotnet/csharp/", + "java": "https://docs.oracle.com/javase/jp/21/index.html", + "python": "https://docs.python.org/ja/3/", + "rust": "https://www.rust-lang.org/ja/learn", + } +) + +func main() { + var ( + rootCtx = context.Background() + ctx, cxl = context.WithCancel(rootCtx) + ) + defer cxl() + + if err := run(ctx); err != nil { + panic(err) + } +} + +func run(_ context.Context) error { + // + // etreeライブラリは、PythonのElementTreeライブラリに + // インスパイアされて作成されているXML処理ライブラリ。 + // + // 使いやすいAPIが備わっているので直感的に作業できる。 + // + + var ( + doc *etree.Document + languages *etree.Element + language *etree.Element + ) + doc = etree.NewDocument() + doc.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`) + + languages = doc.CreateElement("languages") + for lang, url := range langs { + language = languages.CreateElement("language") + language.CreateAttr("name", lang) + language.SetText(url) + } + + doc.Indent(4) + if _, err := doc.WriteTo(os.Stdout); err != nil { + return err + } + + return nil +} diff --git a/go.mod b/go.mod index b27bcf8..1ced819 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.23 require ( github.com/Masterminds/semver/v3 v3.3.0 github.com/adrg/xdg v0.5.0 + github.com/beevik/etree v1.4.1 github.com/bodgit/sevenzip v1.5.2 github.com/briandowns/spinner v1.23.1 github.com/caarlos0/env/v11 v11.2.2 diff --git a/go.sum b/go.sum index 19dc40b..8fd99eb 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY= github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/beevik/etree v1.4.1 h1:PmQJDDYahBGNKDcpdX8uPy1xRCwoCGVUiW669MEirVI= +github.com/beevik/etree v1.4.1/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= github.com/bodgit/sevenzip v1.5.2 h1:acMIYRaqoHAdeu9LhEGGjL9UzBD4RNf9z7+kWDNignI= From f10f55fa50fded8d433014332023226867661947 Mon Sep 17 00:00:00 2001 From: devlights Date: Sun, 29 Sep 2024 13:49:51 +0000 Subject: [PATCH 16/22] Update --- examples/etree/read/main.go | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/examples/etree/read/main.go b/examples/etree/read/main.go index c0d4d22..54306d9 100644 --- a/examples/etree/read/main.go +++ b/examples/etree/read/main.go @@ -13,18 +13,25 @@ var ( ) func init() { - logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { - switch { - case a.Key == slog.LevelKey: - return slog.Attr{} - case a.Key == slog.TimeKey: - return slog.Attr{} - case a.Key == slog.MessageKey: - return slog.Attr{Key: "tag", Value: a.Value} - default: - return a + var ( + opt = &slog.HandlerOptions{ + ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { + switch { + case a.Key == slog.LevelKey: + return slog.Attr{} + case a.Key == slog.TimeKey: + return slog.Attr{} + case a.Key == slog.MessageKey: + return slog.Attr{Key: "tag", Value: a.Value} + default: + return a + } + }, } - }})) + handler = slog.NewJSONHandler(os.Stdout, opt) + ) + + logger = slog.New(handler) } func main() { From 512073f80180fb38029b077a43791284669c90b0 Mon Sep 17 00:00:00 2001 From: devlights Date: Wed, 2 Oct 2024 05:20:08 +0000 Subject: [PATCH 17/22] Update Go version --- .gitpod.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index a9c7cf8..1f45c14 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,7 +1,7 @@ FROM gitpod/workspace-base:latest USER gitpod -ENV GO_VERSION=1.23.1 +ENV GO_VERSION=1.23.2 # For ref, see: https://github.com/gitpod-io/workspace-images/blob/61df77aad71689504112e1087bb7e26d45a43d10/chunks/lang-go/Dockerfile#L10 ENV GOPATH=$HOME/go-packages From 2c5895d44810a1b133bcdcf17f5629b3ff1e0003 Mon Sep 17 00:00:00 2001 From: devlights Date: Wed, 2 Oct 2024 10:07:08 +0000 Subject: [PATCH 18/22] Add examples/singleapp/jstream --- examples/singleapp/jstream/README.md | 7 +++ examples/singleapp/jstream/depth/Taskfile.yml | 9 +++ examples/singleapp/jstream/depth/data.json | 12 ++++ examples/singleapp/jstream/depth/main.go | 63 +++++++++++++++++++ go.mod | 1 + go.sum | 2 + 6 files changed, 94 insertions(+) create mode 100644 examples/singleapp/jstream/README.md create mode 100644 examples/singleapp/jstream/depth/Taskfile.yml create mode 100644 examples/singleapp/jstream/depth/data.json create mode 100644 examples/singleapp/jstream/depth/main.go diff --git a/examples/singleapp/jstream/README.md b/examples/singleapp/jstream/README.md new file mode 100644 index 0000000..70de58b --- /dev/null +++ b/examples/singleapp/jstream/README.md @@ -0,0 +1,7 @@ +# これは何? + +[jstream](https://github.com/bcicen/jstream) という JSON を扱う便利なライブラリのサンプルが置かれています。 + +## 参考情報 + +- [jstream](https://github.com/bcicen/jstream) diff --git a/examples/singleapp/jstream/depth/Taskfile.yml b/examples/singleapp/jstream/depth/Taskfile.yml new file mode 100644 index 0000000..a708093 --- /dev/null +++ b/examples/singleapp/jstream/depth/Taskfile.yml @@ -0,0 +1,9 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - for: ['0', '1', '2', '3'] + cmd: go run main.go -depth {{.ITEM}} diff --git a/examples/singleapp/jstream/depth/data.json b/examples/singleapp/jstream/depth/data.json new file mode 100644 index 0000000..1257ed7 --- /dev/null +++ b/examples/singleapp/jstream/depth/data.json @@ -0,0 +1,12 @@ +[ + { + "id": 1, + "name": "Item 1", + "items": [ "item-1", "item-2", "item-3" ] + }, + { + "id": 2, + "name": "Item 2", + "items": [ "item-4", "item-5", "item-6" ] + } + ] \ No newline at end of file diff --git a/examples/singleapp/jstream/depth/main.go b/examples/singleapp/jstream/depth/main.go new file mode 100644 index 0000000..d2a88e0 --- /dev/null +++ b/examples/singleapp/jstream/depth/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "context" + "flag" + "fmt" + "os" + + "github.com/bcicen/jstream" + "github.com/k0kubun/pp/v3" +) + +type ( + Args struct { + depth int + } +) + +var ( + args Args +) + +func init() { + flag.IntVar(&args.depth, "depth", 0, "depth") +} + +func main() { + flag.Parse() + + if args.depth < 0 { + args.depth = 0 + } + + var ( + rootCtx = context.Background() + ctx, cxl = context.WithCancel(rootCtx) + ) + defer cxl() + + if err := run(ctx); err != nil { + pp.Fatal(err) + } +} + +func run(_ context.Context) error { + var ( + file *os.File + decoder *jstream.Decoder + err error + ) + file, err = os.Open("data.json") + if err != nil { + return fmt.Errorf("os.Open() failed: %w", err) + } + defer file.Close() + + decoder = jstream.NewDecoder(file, args.depth) + for v := range decoder.Stream() { + pp.Println(v.Value) + } + + return nil +} diff --git a/go.mod b/go.mod index 1ced819..7820814 100644 --- a/go.mod +++ b/go.mod @@ -47,6 +47,7 @@ require ( ) require ( + github.com/bcicen/jstream v1.0.1 github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/goccy/go-reflect v1.2.0 // indirect github.com/integrii/flaggy v1.5.2 diff --git a/go.sum b/go.sum index 8fd99eb..0e86acf 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY= github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/bcicen/jstream v1.0.1 h1:BXY7Cu4rdmc0rhyTVyT3UkxAiX3bnLpKLas9btbH5ck= +github.com/bcicen/jstream v1.0.1/go.mod h1:9ielPxqFry7Y4Tg3j4BfjPocfJ3TbsRtXOAYXYmRuAQ= github.com/beevik/etree v1.4.1 h1:PmQJDDYahBGNKDcpdX8uPy1xRCwoCGVUiW669MEirVI= github.com/beevik/etree v1.4.1/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= From ab1acc88c4953264157f910b58d7b268fdd36279 Mon Sep 17 00:00:00 2001 From: devlights Date: Fri, 11 Oct 2024 09:12:28 +0000 Subject: [PATCH 19/22] Add examples/singleapp/currency/01.basic --- .../singleapp/currency/01.basic/Taskfile.yml | 11 +++ examples/singleapp/currency/01.basic/main.go | 81 +++++++++++++++++++ examples/singleapp/currency/README.md | 3 + go.mod | 2 + go.sum | 6 ++ 5 files changed, 103 insertions(+) create mode 100644 examples/singleapp/currency/01.basic/Taskfile.yml create mode 100644 examples/singleapp/currency/01.basic/main.go create mode 100644 examples/singleapp/currency/README.md diff --git a/examples/singleapp/currency/01.basic/Taskfile.yml b/examples/singleapp/currency/01.basic/Taskfile.yml new file mode 100644 index 0000000..d7bba50 --- /dev/null +++ b/examples/singleapp/currency/01.basic/Taskfile.yml @@ -0,0 +1,11 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - task: run + run: + cmds: + - go run main.go diff --git a/examples/singleapp/currency/01.basic/main.go b/examples/singleapp/currency/01.basic/main.go new file mode 100644 index 0000000..732ffa0 --- /dev/null +++ b/examples/singleapp/currency/01.basic/main.go @@ -0,0 +1,81 @@ +package main + +import ( + "context" + "errors" + "fmt" + "log" + "time" + + "github.com/bojanz/currency" +) + +func init() { + log.SetFlags(log.Lmicroseconds) +} + +func main() { + var ( + rootCtx = context.Background() + mainCtx, mainCxl = context.WithTimeoutCause(rootCtx, time.Second, errors.New("too slow")) + procCtx = run(mainCtx) + err error + ) + defer mainCxl() + + select { + case <-mainCtx.Done(): + err = context.Cause(mainCtx) + case <-procCtx.Done(): + if err = context.Cause(procCtx); errors.Is(err, context.Canceled) { + err = nil + } + } + + if err != nil { + log.Fatal(err) + } +} + +func run(ctx context.Context) context.Context { + ctx, cxl := context.WithCancelCause(ctx) + + go func() { + cxl(proc(ctx)) + }() + + return ctx +} + +func proc(_ context.Context) error { + type data struct { + v string + c string + l string + } + + items := []data{ + {"129", "JPY", "ja"}, + {"129", "USD", "en"}, + {"129", "EUR", "fr"}, + } + for _, item := range items { + var ( + amount currency.Amount + locale currency.Locale + formatter *currency.Formatter + err error + ) + locale = currency.NewLocale(item.l) + formatter = currency.NewFormatter(locale) + + amount, err = currency.NewAmount(item.v, item.c) + if err != nil { + return err + } + + fmt.Println(formatter.Format(amount)) + } + + return nil +} diff --git a/examples/singleapp/currency/README.md b/examples/singleapp/currency/README.md new file mode 100644 index 0000000..0e9edd6 --- /dev/null +++ b/examples/singleapp/currency/README.md @@ -0,0 +1,3 @@ +# これは何? + +[bojanz](https://github.com/bojanz/currency) についてのサンプルがあります。 diff --git a/go.mod b/go.mod index 7820814..12eab3d 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/adrg/xdg v0.5.0 github.com/beevik/etree v1.4.1 github.com/bodgit/sevenzip v1.5.2 + github.com/bojanz/currency v1.2.3 github.com/briandowns/spinner v1.23.1 github.com/caarlos0/env/v11 v11.2.2 github.com/cheekybits/genny v1.0.0 @@ -26,6 +27,7 @@ require ( github.com/andybalholm/brotli v1.1.0 // indirect github.com/bodgit/plumbing v1.3.0 // indirect github.com/bodgit/windows v1.0.1 // indirect + github.com/cockroachdb/apd/v3 v3.2.1 // indirect github.com/fatih/color v1.17.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect diff --git a/go.sum b/go.sum index 0e86acf..e455547 100644 --- a/go.sum +++ b/go.sum @@ -33,6 +33,8 @@ github.com/bodgit/sevenzip v1.5.2 h1:acMIYRaqoHAdeu9LhEGGjL9UzBD4RNf9z7+kWDNignI github.com/bodgit/sevenzip v1.5.2/go.mod h1:gTGzXA67Yko6/HLSD0iK4kWaWzPlPmLfDO73jTjSRqc= github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4= github.com/bodgit/windows v1.0.1/go.mod h1:a6JLwrB4KrTR5hBpp8FI9/9W9jJfeQ2h4XDXU74ZCdM= +github.com/bojanz/currency v1.2.3 h1:t2c380KCJx+fiLqIB+qiwUpYrKbV9Fidj0MylzjgbmE= +github.com/bojanz/currency v1.2.3/go.mod h1:jNoZiJyRTqoU5DFoa+n+9lputxPUDa8Fz8BdDrW06Go= github.com/briandowns/spinner v1.23.1 h1:t5fDPmScwUjozhDj4FA46p5acZWIPXYE30qW2Ptu650= github.com/briandowns/spinner v1.23.1/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM= github.com/caarlos0/env/v11 v11.2.2 h1:95fApNrUyueipoZN/EhA8mMxiNxrBwDa+oAZrMWl3Kg= @@ -44,6 +46,8 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR 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/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= +github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= 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= @@ -129,6 +133,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06 h1:kacRlPN7EN++tVpGUorNGPn/4DnB7/DfTY82AOn6ccU= github.com/ledongthuc/pdf v0.0.0-20240201131950-da5b75280b06/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= From 5146afb935470b48630fd0b105bf5195d3ff97c0 Mon Sep 17 00:00:00 2001 From: devlights Date: Fri, 17 Jan 2025 05:33:11 +0000 Subject: [PATCH 20/22] Update go version to 1.23.5 --- .gitpod.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 1f45c14..331b6f8 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,7 +1,7 @@ FROM gitpod/workspace-base:latest USER gitpod -ENV GO_VERSION=1.23.2 +ENV GO_VERSION=1.23.5 # For ref, see: https://github.com/gitpod-io/workspace-images/blob/61df77aad71689504112e1087bb7e26d45a43d10/chunks/lang-go/Dockerfile#L10 ENV GOPATH=$HOME/go-packages From e24851b6360194aa43e131456ea9f4454c429362 Mon Sep 17 00:00:00 2001 From: devlights Date: Fri, 7 Mar 2025 14:24:08 +0900 Subject: [PATCH 21/22] Update .gitpod.Dockerfile --- .gitpod.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 331b6f8..551b33a 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,7 +1,7 @@ FROM gitpod/workspace-base:latest USER gitpod -ENV GO_VERSION=1.23.5 +ENV GO_VERSION=1.24.1 # For ref, see: https://github.com/gitpod-io/workspace-images/blob/61df77aad71689504112e1087bb7e26d45a43d10/chunks/lang-go/Dockerfile#L10 ENV GOPATH=$HOME/go-packages @@ -22,4 +22,4 @@ RUN go install -v golang.org/x/tools/gopls@latest RUN printf '%s\n' 'export GOPATH=/workspace/go' \ 'export PATH=$GOPATH/bin:$PATH' > $HOME/.bashrc.d/300-go -RUN sudo apt update && sudo apt install -y universal-ctags tree nkf wamerican \ No newline at end of file +RUN sudo apt update && sudo apt install -y universal-ctags tree nkf wamerican tcpdump From d96952a5af53349746864a38ace878134ba46b2f Mon Sep 17 00:00:00 2001 From: devlights Date: Fri, 7 Mar 2025 06:33:14 +0000 Subject: [PATCH 22/22] Add examples/singleapp/panicparse --- .gitpod.Dockerfile | 1 + README.md | 4 +- examples/singleapp/panicparse/.gitignore | 1 + examples/singleapp/panicparse/README.md | 53 ++++++++++++++++++++++ examples/singleapp/panicparse/Taskfile.yml | 27 +++++++++++ examples/singleapp/panicparse/main.go | 48 ++++++++++++++++++++ 6 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 examples/singleapp/panicparse/.gitignore create mode 100644 examples/singleapp/panicparse/README.md create mode 100644 examples/singleapp/panicparse/Taskfile.yml create mode 100644 examples/singleapp/panicparse/main.go diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 551b33a..ee2e125 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -19,6 +19,7 @@ RUN go install -v github.com/go-delve/delve/cmd/dlv@latest RUN go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@latest RUN go install -v honnef.co/go/tools/cmd/staticcheck@latest RUN go install -v golang.org/x/tools/gopls@latest +RUN go install -v github.com/maruel/panicparse/v2/cmd/pp@latest RUN printf '%s\n' 'export GOPATH=/workspace/go' \ 'export PATH=$GOPATH/bin:$PATH' > $HOME/.bashrc.d/300-go diff --git a/README.md b/README.md index 306b205..604f288 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # try-golang-extlib [try-golang](https://github.com/devlights/try-golang) プロジェクトの姉妹版。外部ライブラリに依存しているサンプルが配置されています。 -![try-golang - Go Version](https://img.shields.io/badge/go-1.22-blue.svg) +![try-golang - Go Version](https://img.shields.io/badge/go-1.24-blue.svg) ## GO version ```shell script $ go version -go version go1.22.1 linux/amd64 +go version go1.24.1 linux/amd64 ``` diff --git a/examples/singleapp/panicparse/.gitignore b/examples/singleapp/panicparse/.gitignore new file mode 100644 index 0000000..7a0b7f0 --- /dev/null +++ b/examples/singleapp/panicparse/.gitignore @@ -0,0 +1 @@ +app \ No newline at end of file diff --git a/examples/singleapp/panicparse/README.md b/examples/singleapp/panicparse/README.md new file mode 100644 index 0000000..c0f2b83 --- /dev/null +++ b/examples/singleapp/panicparse/README.md @@ -0,0 +1,53 @@ +# これは何? + +[maruel/panicparse](https://github.com/maruel/panicparse) というパニック時の出力をヒューマンフレンドリーにしてくれる 便利なライブラリのサンプルが置かれています。 + +## 実行 + +```sh +$ task +task: [clean] rm -f ./app +task: [build] go build -o app main.go +task: [run] ./app +0 +1 +2 +3 +panic: send on closed channel + +goroutine 6 [running]: +main.run.func1(0xc000096070) + /workspace/try-golang-extlib/examples/singleapp/panicparse/main.go:29 +0x5f +created by main.run in goroutine 1 + /workspace/try-golang-extlib/examples/singleapp/panicparse/main.go:26 +0xd1 + +goroutine 1 [runnable]: +sync.runtime_SemacquireWaitGroup(0xc00000e0f0?) + /home/gitpod/go/src/runtime/sema.go:110 +0x25 +sync.(*WaitGroup).Wait(0x0?) + /home/gitpod/go/src/sync/waitgroup.go:118 +0x48 +main.run() + /workspace/try-golang-extlib/examples/singleapp/panicparse/main.go:45 +0x1f1 +main.main() + /workspace/try-golang-extlib/examples/singleapp/panicparse/main.go:15 +0x13 + +task: [run] ./app |& pp +0 +1 +2 +3 +panic: send on closed channel + +1: running [Created by main.run in goroutine 1 @ main.go:26] + main main.go:29 run.func1(0xc000096070) +1: runnable + sync sema.go:110 runtime_SemacquireWaitGroup(*uint32(#1)) + sync waitgroup.go:118 (*WaitGroup).Wait(*WaitGroup(0x0)) + main main.go:45 run() + main main.go:15 main() +``` + +## 参考情報 + +- [maruel/panicparse](https://github.com/maruel/panicparse) +- [Tips to debug hanging Go programs](https://michael.stapelberg.ch/posts/2025-02-27-debug-hanging-go-programs/) diff --git a/examples/singleapp/panicparse/Taskfile.yml b/examples/singleapp/panicparse/Taskfile.yml new file mode 100644 index 0000000..dd32efd --- /dev/null +++ b/examples/singleapp/panicparse/Taskfile.yml @@ -0,0 +1,27 @@ +# https://taskfile.dev + +version: '3' + +vars: + GREETING: Hello, World! + +tasks: + default: + cmds: + - task: clean + - task: build + - task: run + build: + cmds: + - go build -o app main.go + run: + cmds: + - cmd: ./app + ignore_error: true + - cmd: ./app |& pp + ignore_error: true + env: + GOTRACEBACK: all + clean: + cmds: + - rm -f ./app diff --git a/examples/singleapp/panicparse/main.go b/examples/singleapp/panicparse/main.go new file mode 100644 index 0000000..7579d34 --- /dev/null +++ b/examples/singleapp/panicparse/main.go @@ -0,0 +1,48 @@ +/* +maruel/panicparse の動作確認用のプログラム + +2秒するとパニックします。 +*/ +package main + +import ( + "fmt" + "sync" + "time" +) + +func main() { + if err := run(); err != nil { + panic(err) + } +} + +func run() error { + ch := make(chan int) + wg := sync.WaitGroup{} + + wg.Add(3) + + go func(ch chan<- int) { + defer wg.Done() + for i := range 100 { + ch <- i + time.Sleep(500 * time.Millisecond) + } + }(ch) + go func(ch <-chan int) { + defer wg.Done() + for i := range ch { + fmt.Println(i) + } + }(ch) + go func(ch chan<- int) { + defer wg.Done() + defer close(ch) + time.Sleep(2 * time.Second) + }(ch) + + wg.Wait() + + return nil +}