diff --git a/go.mod b/go.mod
index d4e3e513f259f3e58424caba90407f06782ea60e..8fe681a22ca87c4627703852fd25da62df650d1c 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
 module 0xacab.org/leap/bitmask-vpn
 
-go 1.22
+go 1.22.2
 
 require (
 	0xacab.org/leap/obfsvpn v1.3.0
@@ -23,7 +23,7 @@ require (
 )
 
 require (
-	0xacab.org/leap/bitmask-core v0.0.0-20240705122443-e372171b7c36
+	0xacab.org/leap/bitmask-core v0.0.0-20240830161617-121267e4c4eb
 	github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce
 	github.com/prometheus-community/pro-bing v0.4.0
 	github.com/rs/zerolog v1.33.0
@@ -31,13 +31,14 @@ require (
 )
 
 require (
+	0xacab.org/leap/tunnel-telemetry v0.0.0-20240830081933-7328bb50078b // indirect
 	filippo.io/edwards25519 v1.1.0 // indirect
 	github.com/andybalholm/brotli v1.1.0 // indirect
 	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
 	github.com/asdine/storm/v3 v3.2.1 // indirect
 	github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6 // indirect
 	github.com/cloudflare/circl v1.3.9 // indirect
-	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/go-logr/logr v1.4.2 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-openapi/analysis v0.23.0 // indirect
@@ -51,7 +52,7 @@ require (
 	github.com/go-openapi/swag v0.23.0 // indirect
 	github.com/go-openapi/validate v0.24.0 // indirect
 	github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
-	github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
+	github.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect
 	github.com/google/uuid v1.6.0 // indirect
 	github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
@@ -65,7 +66,7 @@ require (
 	github.com/mitchellh/go-homedir v1.1.0 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/oklog/ulid v1.3.1 // indirect
-	github.com/onsi/ginkgo/v2 v2.9.5 // indirect
+	github.com/onsi/ginkgo/v2 v2.13.2 // indirect
 	github.com/opentracing/opentracing-go v1.2.0 // indirect
 	github.com/pion/datachannel v1.5.7 // indirect
 	github.com/pion/dtls/v2 v2.2.11 // indirect
@@ -83,7 +84,7 @@ require (
 	github.com/pion/transport/v2 v2.2.5 // indirect
 	github.com/pion/turn/v2 v2.1.6 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/pmezard/go-difflib v1.0.0 // indirect
+	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 	github.com/quic-go/quic-go v0.47.0 // indirect
 	github.com/refraction-networking/utls v1.6.7 // indirect
 	github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect
diff --git a/go.sum b/go.sum
index 2c412aabc57b5d15b51cbfc33c92d2c8ca89b5b7..6b359c77143d00e98c8aa34617ac2bdf9112efee 100644
--- a/go.sum
+++ b/go.sum
@@ -1,7 +1,9 @@
-0xacab.org/leap/bitmask-core v0.0.0-20240705122443-e372171b7c36 h1:pX9BZDphco1wjiyyfJAy4cRb4fmKKn+6u5SMvhU01zI=
-0xacab.org/leap/bitmask-core v0.0.0-20240705122443-e372171b7c36/go.mod h1:kuAy05ISfgrZJIPj2i7lXRxRlFF8gtRy3KvYYOgMYvI=
+0xacab.org/leap/bitmask-core v0.0.0-20240830161617-121267e4c4eb h1:RDLhdZKH4UAwEg8PCFpgqagsPvsx6s+CVrH2Ty6Wn/8=
+0xacab.org/leap/bitmask-core v0.0.0-20240830161617-121267e4c4eb/go.mod h1:iGWa13tANV0T5ZPgWskx0wHW/FLRsRmG7UOZLixuC7I=
 0xacab.org/leap/obfsvpn v1.3.0 h1:wZKCvfRPMdhDZryhrulhNyHTrssohJIcsNpYY5mlRjo=
 0xacab.org/leap/obfsvpn v1.3.0/go.mod h1:UnrfyIoZJCd1Tfh6XA+TjiowLubwPGYo/pNqs3MtQtc=
+0xacab.org/leap/tunnel-telemetry v0.0.0-20240830081933-7328bb50078b h1:GI6SVhECFVdHalARYd5Qt/i5/+M0fjcLtJIEEQVO4Sk=
+0xacab.org/leap/tunnel-telemetry v0.0.0-20240830081933-7328bb50078b/go.mod h1:Oy9wDiKAy+hq+V04b7CM+gbj9wOrIcX+OZKMVjrdBCs=
 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=
 filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
@@ -54,9 +56,6 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n
 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-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/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE=
@@ -73,8 +72,9 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do
 github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo=
 github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA=
 github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
@@ -165,8 +165,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
-github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=
+github.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -206,7 +206,6 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
 github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
@@ -301,14 +300,14 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
 github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
-github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
+github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs=
+github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM=
 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
-github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
-github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=
+github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg=
+github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
 github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
 github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
 github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
@@ -397,8 +396,9 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
-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/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 github.com/prometheus-community/pro-bing v0.4.0 h1:YMbv+i08gQz97OZZBwLyvmmQEEzyfyrrjEaAchdy3R4=
 github.com/prometheus-community/pro-bing v0.4.0/go.mod h1:b7wRYZtCcPmt4Sz319BykUU241rWLe1VFXyiyWK/dH4=
@@ -653,7 +653,6 @@ golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -739,8 +738,9 @@ google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMt
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
+google.golang.org/appengine v1.6.7/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-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
diff --git a/vendor/0xacab.org/leap/bitmask-core/models/models_provider.go b/vendor/0xacab.org/leap/bitmask-core/models/models_provider.go
new file mode 100644
index 0000000000000000000000000000000000000000..0ddcf2b5334916345db4e6fbee25076627f0d276
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/models/models_provider.go
@@ -0,0 +1,138 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ModelsProvider models provider
+//
+// swagger:model models.Provider
+type ModelsProvider struct {
+
+	// URL of the API endpoints
+	APIURI string `json:"api_uri,omitempty"`
+
+	// oldest supported api version
+	// deprecated: kept for backwards compatibility. Replaced by api_versions.
+	APIVersion string `json:"api_version,omitempty"`
+
+	// all API versions the provider supports
+	APIVersions []string `json:"api_versions"`
+
+	// Flag indicating whether to show regularly a donation reminder
+	AskForDonations bool `json:"ask_for_donations,omitempty"`
+
+	// fingerprint of CA cert used to setup TLS sessions during VPN setup (and up to API version 3 for API communication)
+	// deprecated: kept for backwards compatibility
+	CaCertFingerprint string `json:"ca_cert_fingerprint,omitempty"`
+
+	// URL to fetch the CA cert used to setup TLS sessions during VPN setup (and up to API version 3 for API communication)
+	// deprecated: kept for backwards compatibility
+	CaCertURI string `json:"ca_cert_uri,omitempty"`
+
+	// Default language this provider uses to show infos and provider messages
+	DefaultLanguage string `json:"default_language,omitempty"`
+
+	// Short description about the provider
+	Description map[string]string `json:"description,omitempty"`
+
+	// Domain of the provider
+	Domain string `json:"domain,omitempty"`
+
+	// Number of days until a donation reminder reappears
+	DonatePeriod string `json:"donate_period,omitempty"`
+
+	// URL to the donation website
+	DonateURL string `json:"donate_url,omitempty"`
+
+	// URL to general provider website
+	InfoURL string `json:"info_url,omitempty"`
+
+	// Languages the provider supports to show infos and provider messages
+	Languages []string `json:"languages"`
+
+	// URL to the message of the day service
+	MotdURL string `json:"motd_url,omitempty"`
+
+	// Provider name
+	Name map[string]string `json:"name,omitempty"`
+
+	// Operational properties which describe how the provider offers the service
+	Service struct {
+		ModelsProviderService
+	} `json:"service,omitempty"`
+
+	// List of services the provider offers, currently only openvpn
+	Services []string `json:"services"`
+
+	// URL to Terms of Service website
+	TosURL string `json:"tos_url,omitempty"`
+}
+
+// Validate validates this models provider
+func (m *ModelsProvider) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateService(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *ModelsProvider) validateService(formats strfmt.Registry) error {
+	if swag.IsZero(m.Service) { // not required
+		return nil
+	}
+
+	return nil
+}
+
+// ContextValidate validate this models provider based on the context it is used
+func (m *ModelsProvider) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateService(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *ModelsProvider) contextValidateService(ctx context.Context, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ModelsProvider) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ModelsProvider) UnmarshalBinary(b []byte) error {
+	var res ModelsProvider
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/models/models_provider_service.go b/vendor/0xacab.org/leap/bitmask-core/models/models_provider_service.go
new file mode 100644
index 0000000000000000000000000000000000000000..be742c3f89610e5ff58b522a3ec26e1e6114a02a
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/models/models_provider_service.go
@@ -0,0 +1,55 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ModelsProviderService models provider service
+//
+// swagger:model models.ProviderService
+type ModelsProviderService struct {
+
+	// Flag indicating if anonymous usage without registration is allowed
+	// deprecated: kept for backwards compatibility
+	AllowAnonymous bool `json:"allowAnonymous,omitempty"`
+
+	// Flag indicating if the provider supports user registration
+	// deprecated: kept for backwards compatibility
+	AllowRegistration bool `json:"allowRegistration,omitempty"`
+}
+
+// Validate validates this models provider service
+func (m *ModelsProviderService) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this models provider service based on context it is used
+func (m *ModelsProviderService) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ModelsProviderService) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ModelsProviderService) UnmarshalBinary(b []byte) error {
+	var res ModelsProviderService
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/geolocate.go b/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/geolocate.go
deleted file mode 100644
index 8b9e293b6b5a43fbbde19d2c5df604032408e2ef..0000000000000000000000000000000000000000
--- a/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/geolocate.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package bootstrap
-
-import (
-	"encoding/xml"
-	"io"
-	"net/http"
-	"strings"
-)
-
-var ubuntuGeo = "https://geoip.ubuntu.com/lookup"
-
-type ubuntuResponse struct {
-	XMLName xml.Name `xml:"Response"`
-	CC      string   `xml:"CountryCode"`
-}
-
-// ubuntuGeoLookup will attempt to fetch geolocation info from ubuntu's service,
-// which is contained in an xml document. We do not care about network or IP at
-// this moment, and it's probably better not to log/store that info.
-func ubuntuGeoLookup(client *http.Client) (string, error) {
-	resp, err := client.Get(ubuntuGeo)
-	if err != nil {
-		return "", err
-	}
-	defer resp.Body.Close()
-
-	data, err := io.ReadAll(resp.Body)
-	if err != nil {
-		return "", err
-	}
-
-	var v ubuntuResponse
-	err = xml.Unmarshal(data, &v)
-	if err != nil {
-		return "", err
-	}
-	return strings.ToLower(v.CC), nil
-}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/init.go b/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/init.go
index 48592803fcc0f8e6876badb219bf10bc22db70ba..d4bd129523da664c1962ef9f7f19a4c048029589 100644
--- a/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/init.go
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/init.go
@@ -3,7 +3,6 @@ package bootstrap
 import (
 	"bytes"
 	"fmt"
-	"net"
 	"net/http"
 	"net/url"
 	"strings"
@@ -11,24 +10,21 @@ import (
 	"time"
 
 	"github.com/rs/zerolog/log"
-	"golang.org/x/net/http2"
 	"golang.org/x/net/proxy"
 
 	"0xacab.org/leap/bitmask-core/models"
 	"0xacab.org/leap/bitmask-core/pkg/client"
 	"0xacab.org/leap/bitmask-core/pkg/client/provisioning"
 	"0xacab.org/leap/bitmask-core/pkg/introducer"
-
-	gotls "crypto/tls"
-
-	utls "github.com/refraction-networking/utls"
+	"0xacab.org/leap/tunnel-telemetry/pkg/geolocate"
 )
 
 type Config struct {
-	// BaseCountry is an ISO-2 country code. If present, we will skip
-	// geolocation lookup, and we will send our "base" country to menshen
-	// when asking for gateways/bridges.
-	BaseCountry string
+	// FallbackCountryCode is an ISO-2 country code. Fallback if geolocation lookup fails.
+	FallbackCountryCode string
+	// country code used to fetch gateways/bridges. If geolocation lookup fails,
+	// api.config.FallbackCountryCode is used
+	CountryCode string
 	// Host we will connect to for API operations.
 	Host string
 	// Port we will connect to for API operations (default 443)
@@ -41,50 +37,20 @@ type Config struct {
 	Proxy string
 	// ResolveWithDoH indicates whether we should use a DoH resolver.
 	ResolveWithDoH bool
+	// STUNServers is a list of STUN users to be used to get the current ip adress
+	// The order is kept. A provider can use a list of public STUN servers, use
+	// its self-hosted STUN servers or use public STUN servers as a fallback here.
+	// A STUN server should be in the format ip/host:port
+	STUNServers []string
+	// The CountryCodeLookupURL returns a country code for a given ip address.
+	CountryCodeLookupURL string
 }
 
-func (c *Config) getAPIClient() *http.Client {
-	if c.UseTLS {
-		client := &http.Client{
-			Transport: &http2.Transport{
-				// Hook into TLS connection buildup to resolve IP with DNS over HTTP (DoH)
-				DialTLS: func(network, addr string, tlsCfg *gotls.Config) (net.Conn, error) {
-					if c.ResolveWithDoH {
-						log.Debug().
-							Str("domain", addr).
-							Msg("Resolving host with DNS over HTTPs")
-
-						ip4, err := dohQuery(c.Host)
-						if err != nil {
-							return nil, err
-						}
-
-						log.Debug().
-							Str("domain", addr).
-							Str("ip4", ip4).
-							Msg("Sucessfully resolved host via DNS over HTTPs")
-						addr = fmt.Sprintf("%s:%d", ip4, c.Port)
-					}
-
-					roller, err := utls.NewRoller()
-					if err != nil {
-						return nil, err
-					}
-					uconn, err := roller.Dial(network, addr, c.Host)
-					if err != nil {
-						return nil, err
-					}
-
-					uconn.SetSNI(c.Host)
-					return uconn, err
-				},
-			},
-			Timeout: time.Duration(30) * time.Second,
-		}
-		return client
-	} else {
-		return &http.Client{Timeout: time.Duration(30) * time.Second}
-	}
+type API struct {
+	client     *client.MenshenAPI
+	gateways   []*models.ModelsGateway
+	httpClient *http.Client
+	config     *Config
 }
 
 func NewConfig() *Config {
@@ -95,13 +61,18 @@ func NewConfig() *Config {
 	}
 }
 
-type API struct {
-	client     *client.MenshenAPI
-	gateways   []*models.ModelsGateway
-	httpClient *http.Client
+func NewConfigFromURL(url string) (*Config, error) {
+	host, port, useTLS, err := parseApiURL(url)
+	if err != nil {
+		return nil, err
 
-	countryBase     string
-	countryOverride bool
+	}
+	return &Config{
+		Host:           host,
+		Port:           port,
+		UseTLS:         useTLS,
+		ResolveWithDoH: useTLS,
+	}, nil
 }
 
 func NewAPI(cfg *Config) (*API, error) {
@@ -137,11 +108,7 @@ func NewAPI(cfg *Config) (*API, error) {
 	api := &API{
 		client:   client,
 		gateways: make([]*models.ModelsGateway, 0),
-	}
-
-	if cfg.BaseCountry != "" {
-		api.countryOverride = true
-		api.countryBase = cfg.BaseCountry
+		config:   cfg,
 	}
 
 	// Introducer has precedence over the Proxy parameter, unless it fails.
@@ -196,35 +163,43 @@ func getSocksProxyClient(proxyString string) (*http.Client, error) {
 	return client, nil
 }
 
-// DoGeolocationLookup will try to fetch a valid country code from an online
-// geolocation service (not controlled by us). This country code will be stored and
-// sent in any subsequent resource queries to menshen (gateways/bridges), so that proximity
-// is used in addition to the load information.
+// DoGeolocationLookup will try to fetch a valid country code.This country
+// code will be stored and sent in any subsequent resource queries to menshen
 // This method should be called only once, right after initializing the API object.
-func (api *API) DoGeolocationLookup() error {
-	if api.countryOverride {
-		log.Debug().
-			Str("countryCode", api.countryBase).
-			Msg("Skipping geolocation lookup as country is already set")
-		return nil
+// The VPN must be turned off when calling this function.
+func (api *API) DoGeolocationLookup() (string, error) {
+	log.Debug().Msg("Doing geolocataion lookup")
+	geo, err := geolocate.FindCurrentHostGeolocationWithSTUN(api.config.STUNServers, api.config.CountryCodeLookupURL)
+	if err == nil {
+		// FIXME scrub if we're going to submit logs.
+		log.Info().
+			Str("countryCode", geo.CC).
+			Msg("Successfully got country code")
+		api.config.CountryCode = geo.CC
+	} else {
+		if api.config.FallbackCountryCode != "" {
+			log.Warn().
+				Err(err).
+				Str("fallbackCountryCode", api.config.FallbackCountryCode).
+				Msg("Could not get country code via geolocation lookup. Using fallback country code")
+			api.config.CountryCode = api.config.FallbackCountryCode
+		} else {
+			return "", err
+		}
 	}
+	return api.config.CountryCode, nil
+}
 
-	// we're not using uTLS in this lookup, because the geoip service used (ubuntu) does not seem to support h2.
-	// if this fails, we could explore other additional lookups (stun, etc) as the OONI probe does.
-	// in any case, we should not sweat it too much: we can also play with different heuristics, as setting
-	// up the region (continent) or time zone. that should be enough, if we consider load and probably some
-	// other estimation of proximity.
-	client := &http.Client{Timeout: time.Duration(30) * time.Second}
-	cc, err := ubuntuGeoLookup(client)
+func (api *API) GetProvider() (*models.ModelsProvider, error) {
+	params := provisioning.NewGetProviderJSONParams()
+	if api.httpClient != nil {
+		params = params.WithHTTPClient(api.httpClient)
+	}
+	providerResponse, err := api.client.Provisioning.GetProviderJSON(params)
 	if err != nil {
-		return err
+		return nil, err
 	}
-	// FIXME scrub if we're going to submit logs.
-	log.Info().
-		Str("countryCode", cc).
-		Msg("Successfully got country code from geo API")
-	api.countryBase = cc
-	return nil
+	return providerResponse.Payload, nil
 }
 
 // call menshen endpoint /service and return response
@@ -232,19 +207,19 @@ func (api *API) DoGeolocationLookup() error {
 // TODO: split /service into multiple endpoints:
 // locations, openvpn arguments, serial+version, auth
 func (api *API) GetService() (*models.ModelsEIPService, error) {
-	params := provisioning.NewGet5ServiceParams()
+	params := provisioning.NewGetAPI5ServiceParams()
 	if api.httpClient != nil {
 		params = params.WithHTTPClient(api.httpClient)
 	}
 
 	// TODO: menshen needs to accept cc as param too.
 	/*
-		if api.countryBase != "" {
-			params.Cc = api.countryBase
+		if api.config.CountryCode != "" {
+			params.Cc = api.config.CountryCode
 		}
 	*/
 
-	service, err := api.client.Provisioning.Get5Service(params)
+	service, err := api.client.Provisioning.GetAPI5Service(params)
 	if err != nil {
 		return nil, err
 	}
@@ -272,7 +247,7 @@ type GatewayParams struct {
 // API). It optionally accepts a GatewayParams object where you can set
 // different filters.
 func (api *API) GetGateways(p *GatewayParams) ([]*models.ModelsGateway, error) {
-	params := provisioning.NewGet5GatewaysParams()
+	params := provisioning.NewGetAPI5GatewaysParams()
 	if p != nil {
 		params.Loc = &p.Location
 		params.Port = &p.Port
@@ -283,7 +258,7 @@ func (api *API) GetGateways(p *GatewayParams) ([]*models.ModelsGateway, error) {
 		params = params.WithHTTPClient(api.httpClient)
 	}
 
-	gateways, err := api.client.Provisioning.Get5Gateways(params)
+	gateways, err := api.client.Provisioning.GetAPI5Gateways(params)
 	if err != nil {
 		return nil, err
 	}
@@ -293,12 +268,12 @@ func (api *API) GetGateways(p *GatewayParams) ([]*models.ModelsGateway, error) {
 // GetOpenVPNCert returns valid OpenVPN client credentials (certificate and
 // private key)
 func (api *API) GetOpenVPNCert() (string, error) {
-	params := provisioning.NewGet5OpenvpnCertParams()
+	params := provisioning.NewGetAPI5OpenvpnCertParams()
 	if api.httpClient != nil {
 		params = params.WithHTTPClient(api.httpClient)
 	}
 
-	cert, err := api.client.Provisioning.Get5OpenvpnCert(params)
+	cert, err := api.client.Provisioning.GetAPI5OpenvpnCert(params)
 	if err != nil {
 		return "", err
 	}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/utils.go b/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/utils.go
new file mode 100644
index 0000000000000000000000000000000000000000..bb87325fa15ff4623256ab9f0f149666674aca15
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/bootstrap/utils.go
@@ -0,0 +1,88 @@
+package bootstrap
+
+import (
+	gotls "crypto/tls"
+	"fmt"
+	"net"
+	"net/http"
+	"net/url"
+	"strconv"
+	"time"
+
+	utls "github.com/refraction-networking/utls"
+	"github.com/rs/zerolog/log"
+	"golang.org/x/net/http2"
+)
+
+// Parses API URL of menshen. Returns hostname/ip, port, useTLS
+func parseApiURL(menshenURL string) (string, int, bool, error) {
+	url, err := url.Parse(menshenURL)
+	if err != nil {
+		return "", -1, false, fmt.Errorf("Could not parse API url %s: %s", url, err)
+	}
+
+	hostname := url.Hostname()
+	useTLS := url.Scheme != "http"
+
+	var port int
+	if url.Port() == "" {
+		port = 443
+	} else {
+		port, err = strconv.Atoi(url.Port())
+		if err != nil {
+			return "", -1, false, fmt.Errorf("Could not parse port to int %s: %s", url.Port(), err)
+		}
+	}
+
+	log.Trace().
+		Bool("useTLS", useTLS).
+		Str("hostname", hostname).
+		Int("port", port).
+		Msg("Parsed API URL")
+
+	return hostname, port, useTLS, nil
+}
+
+func (c *Config) getAPIClient() *http.Client {
+	if c.UseTLS {
+		client := &http.Client{
+			Transport: &http2.Transport{
+				// Hook into TLS connection buildup to resolve IP with DNS over HTTP (DoH)
+				DialTLS: func(network, addr string, tlsCfg *gotls.Config) (net.Conn, error) {
+					if c.ResolveWithDoH {
+						log.Debug().
+							Str("domain", addr).
+							Msg("Resolving host with DNS over HTTPs")
+
+						ip4, err := dohQuery(c.Host)
+						if err != nil {
+							return nil, err
+						}
+
+						log.Debug().
+							Str("domain", addr).
+							Str("ip4", ip4).
+							Msg("Sucessfully resolved host via DNS over HTTPs")
+						addr = fmt.Sprintf("%s:%d", ip4, c.Port)
+					}
+
+					roller, err := utls.NewRoller()
+					if err != nil {
+						return nil, err
+					}
+					uconn, err := roller.Dial(network, addr, c.Host)
+					if err != nil {
+						return nil, err
+					}
+
+					uconn.SetSNI(c.Host)
+					return uconn, err
+				},
+			},
+			Timeout: time.Duration(30) * time.Second,
+		}
+		return client
+	} else {
+		return &http.Client{Timeout: time.Duration(30) * time.Second}
+	}
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/menshen_api_client.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/menshen_api_client.go
index c09b25c76ded032bf8b27ba19aabe7b833e853aa..75424ae701b24a83deb68f41cd71a99852594fa1 100644
--- a/vendor/0xacab.org/leap/bitmask-core/pkg/client/menshen_api_client.go
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/menshen_api_client.go
@@ -22,7 +22,7 @@ const (
 	DefaultHost string = "localhost:1323"
 	// DefaultBasePath is the default BasePath
 	// found in Meta (info) section of spec file
-	DefaultBasePath string = "/api/"
+	DefaultBasePath string = "/"
 )
 
 // DefaultSchemes are the default schemes found in Meta (info) section of spec file
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridge_location_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridge_location_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..d3cea166ec11874bb5303f0828ea1c6971b29852
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridge_location_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetAPI5BridgeLocationParams creates a new GetAPI5BridgeLocationParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAPI5BridgeLocationParams() *GetAPI5BridgeLocationParams {
+	return &GetAPI5BridgeLocationParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAPI5BridgeLocationParamsWithTimeout creates a new GetAPI5BridgeLocationParams object
+// with the ability to set a timeout on a request.
+func NewGetAPI5BridgeLocationParamsWithTimeout(timeout time.Duration) *GetAPI5BridgeLocationParams {
+	return &GetAPI5BridgeLocationParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAPI5BridgeLocationParamsWithContext creates a new GetAPI5BridgeLocationParams object
+// with the ability to set a context for a request.
+func NewGetAPI5BridgeLocationParamsWithContext(ctx context.Context) *GetAPI5BridgeLocationParams {
+	return &GetAPI5BridgeLocationParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAPI5BridgeLocationParamsWithHTTPClient creates a new GetAPI5BridgeLocationParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAPI5BridgeLocationParamsWithHTTPClient(client *http.Client) *GetAPI5BridgeLocationParams {
+	return &GetAPI5BridgeLocationParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAPI5BridgeLocationParams contains all the parameters to send to the API endpoint
+
+	for the get API 5 bridge location operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAPI5BridgeLocationParams struct {
+
+	/* Location.
+
+	   Location ID
+	*/
+	Location string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get API 5 bridge location params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5BridgeLocationParams) WithDefaults() *GetAPI5BridgeLocationParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get API 5 bridge location params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5BridgeLocationParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get API 5 bridge location params
+func (o *GetAPI5BridgeLocationParams) WithTimeout(timeout time.Duration) *GetAPI5BridgeLocationParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get API 5 bridge location params
+func (o *GetAPI5BridgeLocationParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get API 5 bridge location params
+func (o *GetAPI5BridgeLocationParams) WithContext(ctx context.Context) *GetAPI5BridgeLocationParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get API 5 bridge location params
+func (o *GetAPI5BridgeLocationParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get API 5 bridge location params
+func (o *GetAPI5BridgeLocationParams) WithHTTPClient(client *http.Client) *GetAPI5BridgeLocationParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get API 5 bridge location params
+func (o *GetAPI5BridgeLocationParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLocation adds the location to the get API 5 bridge location params
+func (o *GetAPI5BridgeLocationParams) WithLocation(location string) *GetAPI5BridgeLocationParams {
+	o.SetLocation(location)
+	return o
+}
+
+// SetLocation adds the location to the get API 5 bridge location params
+func (o *GetAPI5BridgeLocationParams) SetLocation(location string) {
+	o.Location = location
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAPI5BridgeLocationParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param location
+	if err := r.SetPathParam("location", o.Location); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridge_location_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridge_location_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..db05bbccd97a3547f41a183f7cad8b05a07b15f7
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridge_location_responses.go
@@ -0,0 +1,326 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"0xacab.org/leap/bitmask-core/models"
+)
+
+// GetAPI5BridgeLocationReader is a Reader for the GetAPI5BridgeLocation structure.
+type GetAPI5BridgeLocationReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAPI5BridgeLocationReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetApi5BridgeLocationOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetApi5BridgeLocationBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetApi5BridgeLocationNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetApi5BridgeLocationInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /api/5/bridge/{location}] GetAPI5BridgeLocation", response, response.Code())
+	}
+}
+
+// NewGetApi5BridgeLocationOK creates a GetApi5BridgeLocationOK with default headers values
+func NewGetApi5BridgeLocationOK() *GetApi5BridgeLocationOK {
+	return &GetApi5BridgeLocationOK{}
+}
+
+/*
+GetApi5BridgeLocationOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetApi5BridgeLocationOK struct {
+	Payload []*models.ModelsBridge
+}
+
+// IsSuccess returns true when this get api5 bridge location o k response has a 2xx status code
+func (o *GetApi5BridgeLocationOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get api5 bridge location o k response has a 3xx status code
+func (o *GetApi5BridgeLocationOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 bridge location o k response has a 4xx status code
+func (o *GetApi5BridgeLocationOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 bridge location o k response has a 5xx status code
+func (o *GetApi5BridgeLocationOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 bridge location o k response a status code equal to that given
+func (o *GetApi5BridgeLocationOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get api5 bridge location o k response
+func (o *GetApi5BridgeLocationOK) Code() int {
+	return 200
+}
+
+func (o *GetApi5BridgeLocationOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridge/{location}][%d] getApi5BridgeLocationOK %s", 200, payload)
+}
+
+func (o *GetApi5BridgeLocationOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridge/{location}][%d] getApi5BridgeLocationOK %s", 200, payload)
+}
+
+func (o *GetApi5BridgeLocationOK) GetPayload() []*models.ModelsBridge {
+	return o.Payload
+}
+
+func (o *GetApi5BridgeLocationOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5BridgeLocationBadRequest creates a GetApi5BridgeLocationBadRequest with default headers values
+func NewGetApi5BridgeLocationBadRequest() *GetApi5BridgeLocationBadRequest {
+	return &GetApi5BridgeLocationBadRequest{}
+}
+
+/*
+GetApi5BridgeLocationBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetApi5BridgeLocationBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 bridge location bad request response has a 2xx status code
+func (o *GetApi5BridgeLocationBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 bridge location bad request response has a 3xx status code
+func (o *GetApi5BridgeLocationBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 bridge location bad request response has a 4xx status code
+func (o *GetApi5BridgeLocationBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 bridge location bad request response has a 5xx status code
+func (o *GetApi5BridgeLocationBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 bridge location bad request response a status code equal to that given
+func (o *GetApi5BridgeLocationBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get api5 bridge location bad request response
+func (o *GetApi5BridgeLocationBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetApi5BridgeLocationBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridge/{location}][%d] getApi5BridgeLocationBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5BridgeLocationBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridge/{location}][%d] getApi5BridgeLocationBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5BridgeLocationBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5BridgeLocationBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5BridgeLocationNotFound creates a GetApi5BridgeLocationNotFound with default headers values
+func NewGetApi5BridgeLocationNotFound() *GetApi5BridgeLocationNotFound {
+	return &GetApi5BridgeLocationNotFound{}
+}
+
+/*
+GetApi5BridgeLocationNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetApi5BridgeLocationNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 bridge location not found response has a 2xx status code
+func (o *GetApi5BridgeLocationNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 bridge location not found response has a 3xx status code
+func (o *GetApi5BridgeLocationNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 bridge location not found response has a 4xx status code
+func (o *GetApi5BridgeLocationNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 bridge location not found response has a 5xx status code
+func (o *GetApi5BridgeLocationNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 bridge location not found response a status code equal to that given
+func (o *GetApi5BridgeLocationNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get api5 bridge location not found response
+func (o *GetApi5BridgeLocationNotFound) Code() int {
+	return 404
+}
+
+func (o *GetApi5BridgeLocationNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridge/{location}][%d] getApi5BridgeLocationNotFound %s", 404, payload)
+}
+
+func (o *GetApi5BridgeLocationNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridge/{location}][%d] getApi5BridgeLocationNotFound %s", 404, payload)
+}
+
+func (o *GetApi5BridgeLocationNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5BridgeLocationNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5BridgeLocationInternalServerError creates a GetApi5BridgeLocationInternalServerError with default headers values
+func NewGetApi5BridgeLocationInternalServerError() *GetApi5BridgeLocationInternalServerError {
+	return &GetApi5BridgeLocationInternalServerError{}
+}
+
+/*
+GetApi5BridgeLocationInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetApi5BridgeLocationInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 bridge location internal server error response has a 2xx status code
+func (o *GetApi5BridgeLocationInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 bridge location internal server error response has a 3xx status code
+func (o *GetApi5BridgeLocationInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 bridge location internal server error response has a 4xx status code
+func (o *GetApi5BridgeLocationInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 bridge location internal server error response has a 5xx status code
+func (o *GetApi5BridgeLocationInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get api5 bridge location internal server error response a status code equal to that given
+func (o *GetApi5BridgeLocationInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get api5 bridge location internal server error response
+func (o *GetApi5BridgeLocationInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetApi5BridgeLocationInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridge/{location}][%d] getApi5BridgeLocationInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5BridgeLocationInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridge/{location}][%d] getApi5BridgeLocationInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5BridgeLocationInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5BridgeLocationInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridges_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridges_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..e1637502c60297c16ed98317131272222c80e148
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridges_parameters.go
@@ -0,0 +1,265 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetAPI5BridgesParams creates a new GetAPI5BridgesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAPI5BridgesParams() *GetAPI5BridgesParams {
+	return &GetAPI5BridgesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAPI5BridgesParamsWithTimeout creates a new GetAPI5BridgesParams object
+// with the ability to set a timeout on a request.
+func NewGetAPI5BridgesParamsWithTimeout(timeout time.Duration) *GetAPI5BridgesParams {
+	return &GetAPI5BridgesParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAPI5BridgesParamsWithContext creates a new GetAPI5BridgesParams object
+// with the ability to set a context for a request.
+func NewGetAPI5BridgesParamsWithContext(ctx context.Context) *GetAPI5BridgesParams {
+	return &GetAPI5BridgesParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAPI5BridgesParamsWithHTTPClient creates a new GetAPI5BridgesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAPI5BridgesParamsWithHTTPClient(client *http.Client) *GetAPI5BridgesParams {
+	return &GetAPI5BridgesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAPI5BridgesParams contains all the parameters to send to the API endpoint
+
+	for the get API 5 bridges operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAPI5BridgesParams struct {
+
+	/* Loc.
+
+	   location
+	*/
+	Loc *string
+
+	/* Port.
+
+	   port
+	*/
+	Port *string
+
+	/* Tr.
+
+	   transport (tcp|udp)
+	*/
+	Tr *string
+
+	/* Type.
+
+	   type
+	*/
+	Type *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get API 5 bridges params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5BridgesParams) WithDefaults() *GetAPI5BridgesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get API 5 bridges params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5BridgesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) WithTimeout(timeout time.Duration) *GetAPI5BridgesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) WithContext(ctx context.Context) *GetAPI5BridgesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) WithHTTPClient(client *http.Client) *GetAPI5BridgesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLoc adds the loc to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) WithLoc(loc *string) *GetAPI5BridgesParams {
+	o.SetLoc(loc)
+	return o
+}
+
+// SetLoc adds the loc to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) SetLoc(loc *string) {
+	o.Loc = loc
+}
+
+// WithPort adds the port to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) WithPort(port *string) *GetAPI5BridgesParams {
+	o.SetPort(port)
+	return o
+}
+
+// SetPort adds the port to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) SetPort(port *string) {
+	o.Port = port
+}
+
+// WithTr adds the tr to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) WithTr(tr *string) *GetAPI5BridgesParams {
+	o.SetTr(tr)
+	return o
+}
+
+// SetTr adds the tr to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) SetTr(tr *string) {
+	o.Tr = tr
+}
+
+// WithType adds the typeVar to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) WithType(typeVar *string) *GetAPI5BridgesParams {
+	o.SetType(typeVar)
+	return o
+}
+
+// SetType adds the type to the get API 5 bridges params
+func (o *GetAPI5BridgesParams) SetType(typeVar *string) {
+	o.Type = typeVar
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAPI5BridgesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Loc != nil {
+
+		// query param loc
+		var qrLoc string
+
+		if o.Loc != nil {
+			qrLoc = *o.Loc
+		}
+		qLoc := qrLoc
+		if qLoc != "" {
+
+			if err := r.SetQueryParam("loc", qLoc); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Port != nil {
+
+		// query param port
+		var qrPort string
+
+		if o.Port != nil {
+			qrPort = *o.Port
+		}
+		qPort := qrPort
+		if qPort != "" {
+
+			if err := r.SetQueryParam("port", qPort); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Tr != nil {
+
+		// query param tr
+		var qrTr string
+
+		if o.Tr != nil {
+			qrTr = *o.Tr
+		}
+		qTr := qrTr
+		if qTr != "" {
+
+			if err := r.SetQueryParam("tr", qTr); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Type != nil {
+
+		// query param type
+		var qrType string
+
+		if o.Type != nil {
+			qrType = *o.Type
+		}
+		qType := qrType
+		if qType != "" {
+
+			if err := r.SetQueryParam("type", qType); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridges_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridges_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..08c654cdf23f1e9f1b89c06d77a2511a5146dec6
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_bridges_responses.go
@@ -0,0 +1,326 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"0xacab.org/leap/bitmask-core/models"
+)
+
+// GetAPI5BridgesReader is a Reader for the GetAPI5Bridges structure.
+type GetAPI5BridgesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAPI5BridgesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetApi5BridgesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetApi5BridgesBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetApi5BridgesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetApi5BridgesInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /api/5/bridges] GetAPI5Bridges", response, response.Code())
+	}
+}
+
+// NewGetApi5BridgesOK creates a GetApi5BridgesOK with default headers values
+func NewGetApi5BridgesOK() *GetApi5BridgesOK {
+	return &GetApi5BridgesOK{}
+}
+
+/*
+GetApi5BridgesOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetApi5BridgesOK struct {
+	Payload []*models.ModelsBridge
+}
+
+// IsSuccess returns true when this get api5 bridges o k response has a 2xx status code
+func (o *GetApi5BridgesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get api5 bridges o k response has a 3xx status code
+func (o *GetApi5BridgesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 bridges o k response has a 4xx status code
+func (o *GetApi5BridgesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 bridges o k response has a 5xx status code
+func (o *GetApi5BridgesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 bridges o k response a status code equal to that given
+func (o *GetApi5BridgesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get api5 bridges o k response
+func (o *GetApi5BridgesOK) Code() int {
+	return 200
+}
+
+func (o *GetApi5BridgesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridges][%d] getApi5BridgesOK %s", 200, payload)
+}
+
+func (o *GetApi5BridgesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridges][%d] getApi5BridgesOK %s", 200, payload)
+}
+
+func (o *GetApi5BridgesOK) GetPayload() []*models.ModelsBridge {
+	return o.Payload
+}
+
+func (o *GetApi5BridgesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5BridgesBadRequest creates a GetApi5BridgesBadRequest with default headers values
+func NewGetApi5BridgesBadRequest() *GetApi5BridgesBadRequest {
+	return &GetApi5BridgesBadRequest{}
+}
+
+/*
+GetApi5BridgesBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetApi5BridgesBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 bridges bad request response has a 2xx status code
+func (o *GetApi5BridgesBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 bridges bad request response has a 3xx status code
+func (o *GetApi5BridgesBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 bridges bad request response has a 4xx status code
+func (o *GetApi5BridgesBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 bridges bad request response has a 5xx status code
+func (o *GetApi5BridgesBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 bridges bad request response a status code equal to that given
+func (o *GetApi5BridgesBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get api5 bridges bad request response
+func (o *GetApi5BridgesBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetApi5BridgesBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridges][%d] getApi5BridgesBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5BridgesBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridges][%d] getApi5BridgesBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5BridgesBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5BridgesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5BridgesNotFound creates a GetApi5BridgesNotFound with default headers values
+func NewGetApi5BridgesNotFound() *GetApi5BridgesNotFound {
+	return &GetApi5BridgesNotFound{}
+}
+
+/*
+GetApi5BridgesNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetApi5BridgesNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 bridges not found response has a 2xx status code
+func (o *GetApi5BridgesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 bridges not found response has a 3xx status code
+func (o *GetApi5BridgesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 bridges not found response has a 4xx status code
+func (o *GetApi5BridgesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 bridges not found response has a 5xx status code
+func (o *GetApi5BridgesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 bridges not found response a status code equal to that given
+func (o *GetApi5BridgesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get api5 bridges not found response
+func (o *GetApi5BridgesNotFound) Code() int {
+	return 404
+}
+
+func (o *GetApi5BridgesNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridges][%d] getApi5BridgesNotFound %s", 404, payload)
+}
+
+func (o *GetApi5BridgesNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridges][%d] getApi5BridgesNotFound %s", 404, payload)
+}
+
+func (o *GetApi5BridgesNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5BridgesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5BridgesInternalServerError creates a GetApi5BridgesInternalServerError with default headers values
+func NewGetApi5BridgesInternalServerError() *GetApi5BridgesInternalServerError {
+	return &GetApi5BridgesInternalServerError{}
+}
+
+/*
+GetApi5BridgesInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetApi5BridgesInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 bridges internal server error response has a 2xx status code
+func (o *GetApi5BridgesInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 bridges internal server error response has a 3xx status code
+func (o *GetApi5BridgesInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 bridges internal server error response has a 4xx status code
+func (o *GetApi5BridgesInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 bridges internal server error response has a 5xx status code
+func (o *GetApi5BridgesInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get api5 bridges internal server error response a status code equal to that given
+func (o *GetApi5BridgesInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get api5 bridges internal server error response
+func (o *GetApi5BridgesInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetApi5BridgesInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridges][%d] getApi5BridgesInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5BridgesInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/bridges][%d] getApi5BridgesInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5BridgesInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5BridgesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateway_location_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateway_location_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..08ad6b0ce09e1671bd365710680c928163992574
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateway_location_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetAPI5GatewayLocationParams creates a new GetAPI5GatewayLocationParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAPI5GatewayLocationParams() *GetAPI5GatewayLocationParams {
+	return &GetAPI5GatewayLocationParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAPI5GatewayLocationParamsWithTimeout creates a new GetAPI5GatewayLocationParams object
+// with the ability to set a timeout on a request.
+func NewGetAPI5GatewayLocationParamsWithTimeout(timeout time.Duration) *GetAPI5GatewayLocationParams {
+	return &GetAPI5GatewayLocationParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAPI5GatewayLocationParamsWithContext creates a new GetAPI5GatewayLocationParams object
+// with the ability to set a context for a request.
+func NewGetAPI5GatewayLocationParamsWithContext(ctx context.Context) *GetAPI5GatewayLocationParams {
+	return &GetAPI5GatewayLocationParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAPI5GatewayLocationParamsWithHTTPClient creates a new GetAPI5GatewayLocationParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAPI5GatewayLocationParamsWithHTTPClient(client *http.Client) *GetAPI5GatewayLocationParams {
+	return &GetAPI5GatewayLocationParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAPI5GatewayLocationParams contains all the parameters to send to the API endpoint
+
+	for the get API 5 gateway location operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAPI5GatewayLocationParams struct {
+
+	/* Location.
+
+	   Location ID
+	*/
+	Location string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get API 5 gateway location params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5GatewayLocationParams) WithDefaults() *GetAPI5GatewayLocationParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get API 5 gateway location params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5GatewayLocationParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get API 5 gateway location params
+func (o *GetAPI5GatewayLocationParams) WithTimeout(timeout time.Duration) *GetAPI5GatewayLocationParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get API 5 gateway location params
+func (o *GetAPI5GatewayLocationParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get API 5 gateway location params
+func (o *GetAPI5GatewayLocationParams) WithContext(ctx context.Context) *GetAPI5GatewayLocationParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get API 5 gateway location params
+func (o *GetAPI5GatewayLocationParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get API 5 gateway location params
+func (o *GetAPI5GatewayLocationParams) WithHTTPClient(client *http.Client) *GetAPI5GatewayLocationParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get API 5 gateway location params
+func (o *GetAPI5GatewayLocationParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLocation adds the location to the get API 5 gateway location params
+func (o *GetAPI5GatewayLocationParams) WithLocation(location string) *GetAPI5GatewayLocationParams {
+	o.SetLocation(location)
+	return o
+}
+
+// SetLocation adds the location to the get API 5 gateway location params
+func (o *GetAPI5GatewayLocationParams) SetLocation(location string) {
+	o.Location = location
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAPI5GatewayLocationParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param location
+	if err := r.SetPathParam("location", o.Location); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateway_location_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateway_location_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..70830cd8abcfba57761896b60c91258883a9758d
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateway_location_responses.go
@@ -0,0 +1,326 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"0xacab.org/leap/bitmask-core/models"
+)
+
+// GetAPI5GatewayLocationReader is a Reader for the GetAPI5GatewayLocation structure.
+type GetAPI5GatewayLocationReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAPI5GatewayLocationReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetApi5GatewayLocationOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetApi5GatewayLocationBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetApi5GatewayLocationNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetApi5GatewayLocationInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /api/5/gateway/{location}] GetAPI5GatewayLocation", response, response.Code())
+	}
+}
+
+// NewGetApi5GatewayLocationOK creates a GetApi5GatewayLocationOK with default headers values
+func NewGetApi5GatewayLocationOK() *GetApi5GatewayLocationOK {
+	return &GetApi5GatewayLocationOK{}
+}
+
+/*
+GetApi5GatewayLocationOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetApi5GatewayLocationOK struct {
+	Payload []*models.ModelsGateway
+}
+
+// IsSuccess returns true when this get api5 gateway location o k response has a 2xx status code
+func (o *GetApi5GatewayLocationOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get api5 gateway location o k response has a 3xx status code
+func (o *GetApi5GatewayLocationOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 gateway location o k response has a 4xx status code
+func (o *GetApi5GatewayLocationOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 gateway location o k response has a 5xx status code
+func (o *GetApi5GatewayLocationOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 gateway location o k response a status code equal to that given
+func (o *GetApi5GatewayLocationOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get api5 gateway location o k response
+func (o *GetApi5GatewayLocationOK) Code() int {
+	return 200
+}
+
+func (o *GetApi5GatewayLocationOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateway/{location}][%d] getApi5GatewayLocationOK %s", 200, payload)
+}
+
+func (o *GetApi5GatewayLocationOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateway/{location}][%d] getApi5GatewayLocationOK %s", 200, payload)
+}
+
+func (o *GetApi5GatewayLocationOK) GetPayload() []*models.ModelsGateway {
+	return o.Payload
+}
+
+func (o *GetApi5GatewayLocationOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5GatewayLocationBadRequest creates a GetApi5GatewayLocationBadRequest with default headers values
+func NewGetApi5GatewayLocationBadRequest() *GetApi5GatewayLocationBadRequest {
+	return &GetApi5GatewayLocationBadRequest{}
+}
+
+/*
+GetApi5GatewayLocationBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetApi5GatewayLocationBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 gateway location bad request response has a 2xx status code
+func (o *GetApi5GatewayLocationBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 gateway location bad request response has a 3xx status code
+func (o *GetApi5GatewayLocationBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 gateway location bad request response has a 4xx status code
+func (o *GetApi5GatewayLocationBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 gateway location bad request response has a 5xx status code
+func (o *GetApi5GatewayLocationBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 gateway location bad request response a status code equal to that given
+func (o *GetApi5GatewayLocationBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get api5 gateway location bad request response
+func (o *GetApi5GatewayLocationBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetApi5GatewayLocationBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateway/{location}][%d] getApi5GatewayLocationBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5GatewayLocationBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateway/{location}][%d] getApi5GatewayLocationBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5GatewayLocationBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5GatewayLocationBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5GatewayLocationNotFound creates a GetApi5GatewayLocationNotFound with default headers values
+func NewGetApi5GatewayLocationNotFound() *GetApi5GatewayLocationNotFound {
+	return &GetApi5GatewayLocationNotFound{}
+}
+
+/*
+GetApi5GatewayLocationNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetApi5GatewayLocationNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 gateway location not found response has a 2xx status code
+func (o *GetApi5GatewayLocationNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 gateway location not found response has a 3xx status code
+func (o *GetApi5GatewayLocationNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 gateway location not found response has a 4xx status code
+func (o *GetApi5GatewayLocationNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 gateway location not found response has a 5xx status code
+func (o *GetApi5GatewayLocationNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 gateway location not found response a status code equal to that given
+func (o *GetApi5GatewayLocationNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get api5 gateway location not found response
+func (o *GetApi5GatewayLocationNotFound) Code() int {
+	return 404
+}
+
+func (o *GetApi5GatewayLocationNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateway/{location}][%d] getApi5GatewayLocationNotFound %s", 404, payload)
+}
+
+func (o *GetApi5GatewayLocationNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateway/{location}][%d] getApi5GatewayLocationNotFound %s", 404, payload)
+}
+
+func (o *GetApi5GatewayLocationNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5GatewayLocationNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5GatewayLocationInternalServerError creates a GetApi5GatewayLocationInternalServerError with default headers values
+func NewGetApi5GatewayLocationInternalServerError() *GetApi5GatewayLocationInternalServerError {
+	return &GetApi5GatewayLocationInternalServerError{}
+}
+
+/*
+GetApi5GatewayLocationInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetApi5GatewayLocationInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 gateway location internal server error response has a 2xx status code
+func (o *GetApi5GatewayLocationInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 gateway location internal server error response has a 3xx status code
+func (o *GetApi5GatewayLocationInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 gateway location internal server error response has a 4xx status code
+func (o *GetApi5GatewayLocationInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 gateway location internal server error response has a 5xx status code
+func (o *GetApi5GatewayLocationInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get api5 gateway location internal server error response a status code equal to that given
+func (o *GetApi5GatewayLocationInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get api5 gateway location internal server error response
+func (o *GetApi5GatewayLocationInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetApi5GatewayLocationInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateway/{location}][%d] getApi5GatewayLocationInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5GatewayLocationInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateway/{location}][%d] getApi5GatewayLocationInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5GatewayLocationInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5GatewayLocationInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateways_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateways_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..7fc09b05a7bfd689d18f2e7fe1f70adebf3e5a6c
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateways_parameters.go
@@ -0,0 +1,300 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewGetAPI5GatewaysParams creates a new GetAPI5GatewaysParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAPI5GatewaysParams() *GetAPI5GatewaysParams {
+	return &GetAPI5GatewaysParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAPI5GatewaysParamsWithTimeout creates a new GetAPI5GatewaysParams object
+// with the ability to set a timeout on a request.
+func NewGetAPI5GatewaysParamsWithTimeout(timeout time.Duration) *GetAPI5GatewaysParams {
+	return &GetAPI5GatewaysParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAPI5GatewaysParamsWithContext creates a new GetAPI5GatewaysParams object
+// with the ability to set a context for a request.
+func NewGetAPI5GatewaysParamsWithContext(ctx context.Context) *GetAPI5GatewaysParams {
+	return &GetAPI5GatewaysParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAPI5GatewaysParamsWithHTTPClient creates a new GetAPI5GatewaysParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAPI5GatewaysParamsWithHTTPClient(client *http.Client) *GetAPI5GatewaysParams {
+	return &GetAPI5GatewaysParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAPI5GatewaysParams contains all the parameters to send to the API endpoint
+
+	for the get API 5 gateways operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAPI5GatewaysParams struct {
+
+	/* Byload.
+
+	   Sort by load (experimental)
+	*/
+	Byload *bool
+
+	/* Cc.
+
+	   base country code (ISO-2)
+	*/
+	Cc *string
+
+	/* Loc.
+
+	   location override
+	*/
+	Loc *string
+
+	/* Port.
+
+	   port
+	*/
+	Port *string
+
+	/* Tr.
+
+	   transport (tcp|udp)
+	*/
+	Tr *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get API 5 gateways params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5GatewaysParams) WithDefaults() *GetAPI5GatewaysParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get API 5 gateways params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5GatewaysParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) WithTimeout(timeout time.Duration) *GetAPI5GatewaysParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) WithContext(ctx context.Context) *GetAPI5GatewaysParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) WithHTTPClient(client *http.Client) *GetAPI5GatewaysParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithByload adds the byload to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) WithByload(byload *bool) *GetAPI5GatewaysParams {
+	o.SetByload(byload)
+	return o
+}
+
+// SetByload adds the byload to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) SetByload(byload *bool) {
+	o.Byload = byload
+}
+
+// WithCc adds the cc to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) WithCc(cc *string) *GetAPI5GatewaysParams {
+	o.SetCc(cc)
+	return o
+}
+
+// SetCc adds the cc to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) SetCc(cc *string) {
+	o.Cc = cc
+}
+
+// WithLoc adds the loc to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) WithLoc(loc *string) *GetAPI5GatewaysParams {
+	o.SetLoc(loc)
+	return o
+}
+
+// SetLoc adds the loc to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) SetLoc(loc *string) {
+	o.Loc = loc
+}
+
+// WithPort adds the port to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) WithPort(port *string) *GetAPI5GatewaysParams {
+	o.SetPort(port)
+	return o
+}
+
+// SetPort adds the port to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) SetPort(port *string) {
+	o.Port = port
+}
+
+// WithTr adds the tr to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) WithTr(tr *string) *GetAPI5GatewaysParams {
+	o.SetTr(tr)
+	return o
+}
+
+// SetTr adds the tr to the get API 5 gateways params
+func (o *GetAPI5GatewaysParams) SetTr(tr *string) {
+	o.Tr = tr
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAPI5GatewaysParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Byload != nil {
+
+		// query param byload
+		var qrByload bool
+
+		if o.Byload != nil {
+			qrByload = *o.Byload
+		}
+		qByload := swag.FormatBool(qrByload)
+		if qByload != "" {
+
+			if err := r.SetQueryParam("byload", qByload); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Cc != nil {
+
+		// query param cc
+		var qrCc string
+
+		if o.Cc != nil {
+			qrCc = *o.Cc
+		}
+		qCc := qrCc
+		if qCc != "" {
+
+			if err := r.SetQueryParam("cc", qCc); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Loc != nil {
+
+		// query param loc
+		var qrLoc string
+
+		if o.Loc != nil {
+			qrLoc = *o.Loc
+		}
+		qLoc := qrLoc
+		if qLoc != "" {
+
+			if err := r.SetQueryParam("loc", qLoc); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Port != nil {
+
+		// query param port
+		var qrPort string
+
+		if o.Port != nil {
+			qrPort = *o.Port
+		}
+		qPort := qrPort
+		if qPort != "" {
+
+			if err := r.SetQueryParam("port", qPort); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Tr != nil {
+
+		// query param tr
+		var qrTr string
+
+		if o.Tr != nil {
+			qrTr = *o.Tr
+		}
+		qTr := qrTr
+		if qTr != "" {
+
+			if err := r.SetQueryParam("tr", qTr); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateways_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateways_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..17a1587ca12f38c92acdfd77d9b67a225cf03710
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_gateways_responses.go
@@ -0,0 +1,326 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"0xacab.org/leap/bitmask-core/models"
+)
+
+// GetAPI5GatewaysReader is a Reader for the GetAPI5Gateways structure.
+type GetAPI5GatewaysReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAPI5GatewaysReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetApi5GatewaysOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetApi5GatewaysBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetApi5GatewaysNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetApi5GatewaysInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /api/5/gateways] GetAPI5Gateways", response, response.Code())
+	}
+}
+
+// NewGetApi5GatewaysOK creates a GetApi5GatewaysOK with default headers values
+func NewGetApi5GatewaysOK() *GetApi5GatewaysOK {
+	return &GetApi5GatewaysOK{}
+}
+
+/*
+GetApi5GatewaysOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetApi5GatewaysOK struct {
+	Payload []*models.ModelsGateway
+}
+
+// IsSuccess returns true when this get api5 gateways o k response has a 2xx status code
+func (o *GetApi5GatewaysOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get api5 gateways o k response has a 3xx status code
+func (o *GetApi5GatewaysOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 gateways o k response has a 4xx status code
+func (o *GetApi5GatewaysOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 gateways o k response has a 5xx status code
+func (o *GetApi5GatewaysOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 gateways o k response a status code equal to that given
+func (o *GetApi5GatewaysOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get api5 gateways o k response
+func (o *GetApi5GatewaysOK) Code() int {
+	return 200
+}
+
+func (o *GetApi5GatewaysOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateways][%d] getApi5GatewaysOK %s", 200, payload)
+}
+
+func (o *GetApi5GatewaysOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateways][%d] getApi5GatewaysOK %s", 200, payload)
+}
+
+func (o *GetApi5GatewaysOK) GetPayload() []*models.ModelsGateway {
+	return o.Payload
+}
+
+func (o *GetApi5GatewaysOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5GatewaysBadRequest creates a GetApi5GatewaysBadRequest with default headers values
+func NewGetApi5GatewaysBadRequest() *GetApi5GatewaysBadRequest {
+	return &GetApi5GatewaysBadRequest{}
+}
+
+/*
+GetApi5GatewaysBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetApi5GatewaysBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 gateways bad request response has a 2xx status code
+func (o *GetApi5GatewaysBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 gateways bad request response has a 3xx status code
+func (o *GetApi5GatewaysBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 gateways bad request response has a 4xx status code
+func (o *GetApi5GatewaysBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 gateways bad request response has a 5xx status code
+func (o *GetApi5GatewaysBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 gateways bad request response a status code equal to that given
+func (o *GetApi5GatewaysBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get api5 gateways bad request response
+func (o *GetApi5GatewaysBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetApi5GatewaysBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateways][%d] getApi5GatewaysBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5GatewaysBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateways][%d] getApi5GatewaysBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5GatewaysBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5GatewaysBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5GatewaysNotFound creates a GetApi5GatewaysNotFound with default headers values
+func NewGetApi5GatewaysNotFound() *GetApi5GatewaysNotFound {
+	return &GetApi5GatewaysNotFound{}
+}
+
+/*
+GetApi5GatewaysNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetApi5GatewaysNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 gateways not found response has a 2xx status code
+func (o *GetApi5GatewaysNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 gateways not found response has a 3xx status code
+func (o *GetApi5GatewaysNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 gateways not found response has a 4xx status code
+func (o *GetApi5GatewaysNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 gateways not found response has a 5xx status code
+func (o *GetApi5GatewaysNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 gateways not found response a status code equal to that given
+func (o *GetApi5GatewaysNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get api5 gateways not found response
+func (o *GetApi5GatewaysNotFound) Code() int {
+	return 404
+}
+
+func (o *GetApi5GatewaysNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateways][%d] getApi5GatewaysNotFound %s", 404, payload)
+}
+
+func (o *GetApi5GatewaysNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateways][%d] getApi5GatewaysNotFound %s", 404, payload)
+}
+
+func (o *GetApi5GatewaysNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5GatewaysNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5GatewaysInternalServerError creates a GetApi5GatewaysInternalServerError with default headers values
+func NewGetApi5GatewaysInternalServerError() *GetApi5GatewaysInternalServerError {
+	return &GetApi5GatewaysInternalServerError{}
+}
+
+/*
+GetApi5GatewaysInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetApi5GatewaysInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 gateways internal server error response has a 2xx status code
+func (o *GetApi5GatewaysInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 gateways internal server error response has a 3xx status code
+func (o *GetApi5GatewaysInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 gateways internal server error response has a 4xx status code
+func (o *GetApi5GatewaysInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 gateways internal server error response has a 5xx status code
+func (o *GetApi5GatewaysInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get api5 gateways internal server error response a status code equal to that given
+func (o *GetApi5GatewaysInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get api5 gateways internal server error response
+func (o *GetApi5GatewaysInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetApi5GatewaysInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateways][%d] getApi5GatewaysInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5GatewaysInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/gateways][%d] getApi5GatewaysInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5GatewaysInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5GatewaysInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_cert_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_cert_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..448d855b6890f970f52d66b7461f7d799948d17b
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_cert_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetAPI5OpenvpnCertParams creates a new GetAPI5OpenvpnCertParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAPI5OpenvpnCertParams() *GetAPI5OpenvpnCertParams {
+	return &GetAPI5OpenvpnCertParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAPI5OpenvpnCertParamsWithTimeout creates a new GetAPI5OpenvpnCertParams object
+// with the ability to set a timeout on a request.
+func NewGetAPI5OpenvpnCertParamsWithTimeout(timeout time.Duration) *GetAPI5OpenvpnCertParams {
+	return &GetAPI5OpenvpnCertParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAPI5OpenvpnCertParamsWithContext creates a new GetAPI5OpenvpnCertParams object
+// with the ability to set a context for a request.
+func NewGetAPI5OpenvpnCertParamsWithContext(ctx context.Context) *GetAPI5OpenvpnCertParams {
+	return &GetAPI5OpenvpnCertParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAPI5OpenvpnCertParamsWithHTTPClient creates a new GetAPI5OpenvpnCertParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAPI5OpenvpnCertParamsWithHTTPClient(client *http.Client) *GetAPI5OpenvpnCertParams {
+	return &GetAPI5OpenvpnCertParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAPI5OpenvpnCertParams contains all the parameters to send to the API endpoint
+
+	for the get API 5 openvpn cert operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAPI5OpenvpnCertParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get API 5 openvpn cert params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5OpenvpnCertParams) WithDefaults() *GetAPI5OpenvpnCertParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get API 5 openvpn cert params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5OpenvpnCertParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get API 5 openvpn cert params
+func (o *GetAPI5OpenvpnCertParams) WithTimeout(timeout time.Duration) *GetAPI5OpenvpnCertParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get API 5 openvpn cert params
+func (o *GetAPI5OpenvpnCertParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get API 5 openvpn cert params
+func (o *GetAPI5OpenvpnCertParams) WithContext(ctx context.Context) *GetAPI5OpenvpnCertParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get API 5 openvpn cert params
+func (o *GetAPI5OpenvpnCertParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get API 5 openvpn cert params
+func (o *GetAPI5OpenvpnCertParams) WithHTTPClient(client *http.Client) *GetAPI5OpenvpnCertParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get API 5 openvpn cert params
+func (o *GetAPI5OpenvpnCertParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAPI5OpenvpnCertParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_cert_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_cert_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..1317c3d7601a6c53d7d22cbf3c715866754e1e73
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_cert_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// GetAPI5OpenvpnCertReader is a Reader for the GetAPI5OpenvpnCert structure.
+type GetAPI5OpenvpnCertReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAPI5OpenvpnCertReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetApi5OpenvpnCertOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetApi5OpenvpnCertBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetApi5OpenvpnCertNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetApi5OpenvpnCertInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /api/5/openvpn/cert] GetAPI5OpenvpnCert", response, response.Code())
+	}
+}
+
+// NewGetApi5OpenvpnCertOK creates a GetApi5OpenvpnCertOK with default headers values
+func NewGetApi5OpenvpnCertOK() *GetApi5OpenvpnCertOK {
+	return &GetApi5OpenvpnCertOK{}
+}
+
+/*
+GetApi5OpenvpnCertOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetApi5OpenvpnCertOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this get api5 openvpn cert o k response has a 2xx status code
+func (o *GetApi5OpenvpnCertOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get api5 openvpn cert o k response has a 3xx status code
+func (o *GetApi5OpenvpnCertOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 openvpn cert o k response has a 4xx status code
+func (o *GetApi5OpenvpnCertOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 openvpn cert o k response has a 5xx status code
+func (o *GetApi5OpenvpnCertOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 openvpn cert o k response a status code equal to that given
+func (o *GetApi5OpenvpnCertOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get api5 openvpn cert o k response
+func (o *GetApi5OpenvpnCertOK) Code() int {
+	return 200
+}
+
+func (o *GetApi5OpenvpnCertOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/cert][%d] getApi5OpenvpnCertOK %s", 200, payload)
+}
+
+func (o *GetApi5OpenvpnCertOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/cert][%d] getApi5OpenvpnCertOK %s", 200, payload)
+}
+
+func (o *GetApi5OpenvpnCertOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *GetApi5OpenvpnCertOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5OpenvpnCertBadRequest creates a GetApi5OpenvpnCertBadRequest with default headers values
+func NewGetApi5OpenvpnCertBadRequest() *GetApi5OpenvpnCertBadRequest {
+	return &GetApi5OpenvpnCertBadRequest{}
+}
+
+/*
+GetApi5OpenvpnCertBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetApi5OpenvpnCertBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 openvpn cert bad request response has a 2xx status code
+func (o *GetApi5OpenvpnCertBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 openvpn cert bad request response has a 3xx status code
+func (o *GetApi5OpenvpnCertBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 openvpn cert bad request response has a 4xx status code
+func (o *GetApi5OpenvpnCertBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 openvpn cert bad request response has a 5xx status code
+func (o *GetApi5OpenvpnCertBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 openvpn cert bad request response a status code equal to that given
+func (o *GetApi5OpenvpnCertBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get api5 openvpn cert bad request response
+func (o *GetApi5OpenvpnCertBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetApi5OpenvpnCertBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/cert][%d] getApi5OpenvpnCertBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5OpenvpnCertBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/cert][%d] getApi5OpenvpnCertBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5OpenvpnCertBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5OpenvpnCertBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5OpenvpnCertNotFound creates a GetApi5OpenvpnCertNotFound with default headers values
+func NewGetApi5OpenvpnCertNotFound() *GetApi5OpenvpnCertNotFound {
+	return &GetApi5OpenvpnCertNotFound{}
+}
+
+/*
+GetApi5OpenvpnCertNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetApi5OpenvpnCertNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 openvpn cert not found response has a 2xx status code
+func (o *GetApi5OpenvpnCertNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 openvpn cert not found response has a 3xx status code
+func (o *GetApi5OpenvpnCertNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 openvpn cert not found response has a 4xx status code
+func (o *GetApi5OpenvpnCertNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 openvpn cert not found response has a 5xx status code
+func (o *GetApi5OpenvpnCertNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 openvpn cert not found response a status code equal to that given
+func (o *GetApi5OpenvpnCertNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get api5 openvpn cert not found response
+func (o *GetApi5OpenvpnCertNotFound) Code() int {
+	return 404
+}
+
+func (o *GetApi5OpenvpnCertNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/cert][%d] getApi5OpenvpnCertNotFound %s", 404, payload)
+}
+
+func (o *GetApi5OpenvpnCertNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/cert][%d] getApi5OpenvpnCertNotFound %s", 404, payload)
+}
+
+func (o *GetApi5OpenvpnCertNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5OpenvpnCertNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5OpenvpnCertInternalServerError creates a GetApi5OpenvpnCertInternalServerError with default headers values
+func NewGetApi5OpenvpnCertInternalServerError() *GetApi5OpenvpnCertInternalServerError {
+	return &GetApi5OpenvpnCertInternalServerError{}
+}
+
+/*
+GetApi5OpenvpnCertInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetApi5OpenvpnCertInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 openvpn cert internal server error response has a 2xx status code
+func (o *GetApi5OpenvpnCertInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 openvpn cert internal server error response has a 3xx status code
+func (o *GetApi5OpenvpnCertInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 openvpn cert internal server error response has a 4xx status code
+func (o *GetApi5OpenvpnCertInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 openvpn cert internal server error response has a 5xx status code
+func (o *GetApi5OpenvpnCertInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get api5 openvpn cert internal server error response a status code equal to that given
+func (o *GetApi5OpenvpnCertInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get api5 openvpn cert internal server error response
+func (o *GetApi5OpenvpnCertInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetApi5OpenvpnCertInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/cert][%d] getApi5OpenvpnCertInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5OpenvpnCertInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/cert][%d] getApi5OpenvpnCertInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5OpenvpnCertInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5OpenvpnCertInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_config_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_config_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..e20f7b85096d1df9cf9bcae7574eba59c5b77351
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_config_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetAPI5OpenvpnConfigParams creates a new GetAPI5OpenvpnConfigParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAPI5OpenvpnConfigParams() *GetAPI5OpenvpnConfigParams {
+	return &GetAPI5OpenvpnConfigParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAPI5OpenvpnConfigParamsWithTimeout creates a new GetAPI5OpenvpnConfigParams object
+// with the ability to set a timeout on a request.
+func NewGetAPI5OpenvpnConfigParamsWithTimeout(timeout time.Duration) *GetAPI5OpenvpnConfigParams {
+	return &GetAPI5OpenvpnConfigParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAPI5OpenvpnConfigParamsWithContext creates a new GetAPI5OpenvpnConfigParams object
+// with the ability to set a context for a request.
+func NewGetAPI5OpenvpnConfigParamsWithContext(ctx context.Context) *GetAPI5OpenvpnConfigParams {
+	return &GetAPI5OpenvpnConfigParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAPI5OpenvpnConfigParamsWithHTTPClient creates a new GetAPI5OpenvpnConfigParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAPI5OpenvpnConfigParamsWithHTTPClient(client *http.Client) *GetAPI5OpenvpnConfigParams {
+	return &GetAPI5OpenvpnConfigParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAPI5OpenvpnConfigParams contains all the parameters to send to the API endpoint
+
+	for the get API 5 openvpn config operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAPI5OpenvpnConfigParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get API 5 openvpn config params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5OpenvpnConfigParams) WithDefaults() *GetAPI5OpenvpnConfigParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get API 5 openvpn config params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5OpenvpnConfigParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get API 5 openvpn config params
+func (o *GetAPI5OpenvpnConfigParams) WithTimeout(timeout time.Duration) *GetAPI5OpenvpnConfigParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get API 5 openvpn config params
+func (o *GetAPI5OpenvpnConfigParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get API 5 openvpn config params
+func (o *GetAPI5OpenvpnConfigParams) WithContext(ctx context.Context) *GetAPI5OpenvpnConfigParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get API 5 openvpn config params
+func (o *GetAPI5OpenvpnConfigParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get API 5 openvpn config params
+func (o *GetAPI5OpenvpnConfigParams) WithHTTPClient(client *http.Client) *GetAPI5OpenvpnConfigParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get API 5 openvpn config params
+func (o *GetAPI5OpenvpnConfigParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAPI5OpenvpnConfigParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_config_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_config_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..fff687410fd73e190d61400f41da6181d80b98a8
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_openvpn_config_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// GetAPI5OpenvpnConfigReader is a Reader for the GetAPI5OpenvpnConfig structure.
+type GetAPI5OpenvpnConfigReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAPI5OpenvpnConfigReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetApi5OpenvpnConfigOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetApi5OpenvpnConfigBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetApi5OpenvpnConfigNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetApi5OpenvpnConfigInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /api/5/openvpn/config] GetAPI5OpenvpnConfig", response, response.Code())
+	}
+}
+
+// NewGetApi5OpenvpnConfigOK creates a GetApi5OpenvpnConfigOK with default headers values
+func NewGetApi5OpenvpnConfigOK() *GetApi5OpenvpnConfigOK {
+	return &GetApi5OpenvpnConfigOK{}
+}
+
+/*
+GetApi5OpenvpnConfigOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetApi5OpenvpnConfigOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this get api5 openvpn config o k response has a 2xx status code
+func (o *GetApi5OpenvpnConfigOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get api5 openvpn config o k response has a 3xx status code
+func (o *GetApi5OpenvpnConfigOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 openvpn config o k response has a 4xx status code
+func (o *GetApi5OpenvpnConfigOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 openvpn config o k response has a 5xx status code
+func (o *GetApi5OpenvpnConfigOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 openvpn config o k response a status code equal to that given
+func (o *GetApi5OpenvpnConfigOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get api5 openvpn config o k response
+func (o *GetApi5OpenvpnConfigOK) Code() int {
+	return 200
+}
+
+func (o *GetApi5OpenvpnConfigOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/config][%d] getApi5OpenvpnConfigOK %s", 200, payload)
+}
+
+func (o *GetApi5OpenvpnConfigOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/config][%d] getApi5OpenvpnConfigOK %s", 200, payload)
+}
+
+func (o *GetApi5OpenvpnConfigOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *GetApi5OpenvpnConfigOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5OpenvpnConfigBadRequest creates a GetApi5OpenvpnConfigBadRequest with default headers values
+func NewGetApi5OpenvpnConfigBadRequest() *GetApi5OpenvpnConfigBadRequest {
+	return &GetApi5OpenvpnConfigBadRequest{}
+}
+
+/*
+GetApi5OpenvpnConfigBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetApi5OpenvpnConfigBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 openvpn config bad request response has a 2xx status code
+func (o *GetApi5OpenvpnConfigBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 openvpn config bad request response has a 3xx status code
+func (o *GetApi5OpenvpnConfigBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 openvpn config bad request response has a 4xx status code
+func (o *GetApi5OpenvpnConfigBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 openvpn config bad request response has a 5xx status code
+func (o *GetApi5OpenvpnConfigBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 openvpn config bad request response a status code equal to that given
+func (o *GetApi5OpenvpnConfigBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get api5 openvpn config bad request response
+func (o *GetApi5OpenvpnConfigBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetApi5OpenvpnConfigBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/config][%d] getApi5OpenvpnConfigBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5OpenvpnConfigBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/config][%d] getApi5OpenvpnConfigBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5OpenvpnConfigBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5OpenvpnConfigBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5OpenvpnConfigNotFound creates a GetApi5OpenvpnConfigNotFound with default headers values
+func NewGetApi5OpenvpnConfigNotFound() *GetApi5OpenvpnConfigNotFound {
+	return &GetApi5OpenvpnConfigNotFound{}
+}
+
+/*
+GetApi5OpenvpnConfigNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetApi5OpenvpnConfigNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 openvpn config not found response has a 2xx status code
+func (o *GetApi5OpenvpnConfigNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 openvpn config not found response has a 3xx status code
+func (o *GetApi5OpenvpnConfigNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 openvpn config not found response has a 4xx status code
+func (o *GetApi5OpenvpnConfigNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 openvpn config not found response has a 5xx status code
+func (o *GetApi5OpenvpnConfigNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 openvpn config not found response a status code equal to that given
+func (o *GetApi5OpenvpnConfigNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get api5 openvpn config not found response
+func (o *GetApi5OpenvpnConfigNotFound) Code() int {
+	return 404
+}
+
+func (o *GetApi5OpenvpnConfigNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/config][%d] getApi5OpenvpnConfigNotFound %s", 404, payload)
+}
+
+func (o *GetApi5OpenvpnConfigNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/config][%d] getApi5OpenvpnConfigNotFound %s", 404, payload)
+}
+
+func (o *GetApi5OpenvpnConfigNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5OpenvpnConfigNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5OpenvpnConfigInternalServerError creates a GetApi5OpenvpnConfigInternalServerError with default headers values
+func NewGetApi5OpenvpnConfigInternalServerError() *GetApi5OpenvpnConfigInternalServerError {
+	return &GetApi5OpenvpnConfigInternalServerError{}
+}
+
+/*
+GetApi5OpenvpnConfigInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetApi5OpenvpnConfigInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 openvpn config internal server error response has a 2xx status code
+func (o *GetApi5OpenvpnConfigInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 openvpn config internal server error response has a 3xx status code
+func (o *GetApi5OpenvpnConfigInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 openvpn config internal server error response has a 4xx status code
+func (o *GetApi5OpenvpnConfigInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 openvpn config internal server error response has a 5xx status code
+func (o *GetApi5OpenvpnConfigInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get api5 openvpn config internal server error response a status code equal to that given
+func (o *GetApi5OpenvpnConfigInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get api5 openvpn config internal server error response
+func (o *GetApi5OpenvpnConfigInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetApi5OpenvpnConfigInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/config][%d] getApi5OpenvpnConfigInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5OpenvpnConfigInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/openvpn/config][%d] getApi5OpenvpnConfigInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5OpenvpnConfigInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5OpenvpnConfigInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_service_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_service_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..9ca6a0d29341a1c2c144d1456f9a3817aa7344fa
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_service_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetAPI5ServiceParams creates a new GetAPI5ServiceParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAPI5ServiceParams() *GetAPI5ServiceParams {
+	return &GetAPI5ServiceParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAPI5ServiceParamsWithTimeout creates a new GetAPI5ServiceParams object
+// with the ability to set a timeout on a request.
+func NewGetAPI5ServiceParamsWithTimeout(timeout time.Duration) *GetAPI5ServiceParams {
+	return &GetAPI5ServiceParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAPI5ServiceParamsWithContext creates a new GetAPI5ServiceParams object
+// with the ability to set a context for a request.
+func NewGetAPI5ServiceParamsWithContext(ctx context.Context) *GetAPI5ServiceParams {
+	return &GetAPI5ServiceParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAPI5ServiceParamsWithHTTPClient creates a new GetAPI5ServiceParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAPI5ServiceParamsWithHTTPClient(client *http.Client) *GetAPI5ServiceParams {
+	return &GetAPI5ServiceParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAPI5ServiceParams contains all the parameters to send to the API endpoint
+
+	for the get API 5 service operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAPI5ServiceParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get API 5 service params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5ServiceParams) WithDefaults() *GetAPI5ServiceParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get API 5 service params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPI5ServiceParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get API 5 service params
+func (o *GetAPI5ServiceParams) WithTimeout(timeout time.Duration) *GetAPI5ServiceParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get API 5 service params
+func (o *GetAPI5ServiceParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get API 5 service params
+func (o *GetAPI5ServiceParams) WithContext(ctx context.Context) *GetAPI5ServiceParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get API 5 service params
+func (o *GetAPI5ServiceParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get API 5 service params
+func (o *GetAPI5ServiceParams) WithHTTPClient(client *http.Client) *GetAPI5ServiceParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get API 5 service params
+func (o *GetAPI5ServiceParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAPI5ServiceParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_service_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_service_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..7424a128e9d8d544cabd253e20ab766e8ff293aa
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_5_service_responses.go
@@ -0,0 +1,328 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"0xacab.org/leap/bitmask-core/models"
+)
+
+// GetAPI5ServiceReader is a Reader for the GetAPI5Service structure.
+type GetAPI5ServiceReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAPI5ServiceReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetApi5ServiceOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetApi5ServiceBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetApi5ServiceNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetApi5ServiceInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /api/5/service] GetAPI5Service", response, response.Code())
+	}
+}
+
+// NewGetApi5ServiceOK creates a GetApi5ServiceOK with default headers values
+func NewGetApi5ServiceOK() *GetApi5ServiceOK {
+	return &GetApi5ServiceOK{}
+}
+
+/*
+GetApi5ServiceOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetApi5ServiceOK struct {
+	Payload *models.ModelsEIPService
+}
+
+// IsSuccess returns true when this get api5 service o k response has a 2xx status code
+func (o *GetApi5ServiceOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get api5 service o k response has a 3xx status code
+func (o *GetApi5ServiceOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 service o k response has a 4xx status code
+func (o *GetApi5ServiceOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 service o k response has a 5xx status code
+func (o *GetApi5ServiceOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 service o k response a status code equal to that given
+func (o *GetApi5ServiceOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get api5 service o k response
+func (o *GetApi5ServiceOK) Code() int {
+	return 200
+}
+
+func (o *GetApi5ServiceOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/service][%d] getApi5ServiceOK %s", 200, payload)
+}
+
+func (o *GetApi5ServiceOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/service][%d] getApi5ServiceOK %s", 200, payload)
+}
+
+func (o *GetApi5ServiceOK) GetPayload() *models.ModelsEIPService {
+	return o.Payload
+}
+
+func (o *GetApi5ServiceOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ModelsEIPService)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5ServiceBadRequest creates a GetApi5ServiceBadRequest with default headers values
+func NewGetApi5ServiceBadRequest() *GetApi5ServiceBadRequest {
+	return &GetApi5ServiceBadRequest{}
+}
+
+/*
+GetApi5ServiceBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetApi5ServiceBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 service bad request response has a 2xx status code
+func (o *GetApi5ServiceBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 service bad request response has a 3xx status code
+func (o *GetApi5ServiceBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 service bad request response has a 4xx status code
+func (o *GetApi5ServiceBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 service bad request response has a 5xx status code
+func (o *GetApi5ServiceBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 service bad request response a status code equal to that given
+func (o *GetApi5ServiceBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get api5 service bad request response
+func (o *GetApi5ServiceBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetApi5ServiceBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/service][%d] getApi5ServiceBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5ServiceBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/service][%d] getApi5ServiceBadRequest %s", 400, payload)
+}
+
+func (o *GetApi5ServiceBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5ServiceBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5ServiceNotFound creates a GetApi5ServiceNotFound with default headers values
+func NewGetApi5ServiceNotFound() *GetApi5ServiceNotFound {
+	return &GetApi5ServiceNotFound{}
+}
+
+/*
+GetApi5ServiceNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetApi5ServiceNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 service not found response has a 2xx status code
+func (o *GetApi5ServiceNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 service not found response has a 3xx status code
+func (o *GetApi5ServiceNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 service not found response has a 4xx status code
+func (o *GetApi5ServiceNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get api5 service not found response has a 5xx status code
+func (o *GetApi5ServiceNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get api5 service not found response a status code equal to that given
+func (o *GetApi5ServiceNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get api5 service not found response
+func (o *GetApi5ServiceNotFound) Code() int {
+	return 404
+}
+
+func (o *GetApi5ServiceNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/service][%d] getApi5ServiceNotFound %s", 404, payload)
+}
+
+func (o *GetApi5ServiceNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/service][%d] getApi5ServiceNotFound %s", 404, payload)
+}
+
+func (o *GetApi5ServiceNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5ServiceNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetApi5ServiceInternalServerError creates a GetApi5ServiceInternalServerError with default headers values
+func NewGetApi5ServiceInternalServerError() *GetApi5ServiceInternalServerError {
+	return &GetApi5ServiceInternalServerError{}
+}
+
+/*
+GetApi5ServiceInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetApi5ServiceInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get api5 service internal server error response has a 2xx status code
+func (o *GetApi5ServiceInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get api5 service internal server error response has a 3xx status code
+func (o *GetApi5ServiceInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get api5 service internal server error response has a 4xx status code
+func (o *GetApi5ServiceInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get api5 service internal server error response has a 5xx status code
+func (o *GetApi5ServiceInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get api5 service internal server error response a status code equal to that given
+func (o *GetApi5ServiceInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get api5 service internal server error response
+func (o *GetApi5ServiceInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetApi5ServiceInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/service][%d] getApi5ServiceInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5ServiceInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/5/service][%d] getApi5ServiceInternalServerError %s", 500, payload)
+}
+
+func (o *GetApi5ServiceInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetApi5ServiceInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_autoconf_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_autoconf_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..a02ea7789606dd10471127c45af127d662ab0160
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_autoconf_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetAPIAutoconfParams creates a new GetAPIAutoconfParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAPIAutoconfParams() *GetAPIAutoconfParams {
+	return &GetAPIAutoconfParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAPIAutoconfParamsWithTimeout creates a new GetAPIAutoconfParams object
+// with the ability to set a timeout on a request.
+func NewGetAPIAutoconfParamsWithTimeout(timeout time.Duration) *GetAPIAutoconfParams {
+	return &GetAPIAutoconfParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAPIAutoconfParamsWithContext creates a new GetAPIAutoconfParams object
+// with the ability to set a context for a request.
+func NewGetAPIAutoconfParamsWithContext(ctx context.Context) *GetAPIAutoconfParams {
+	return &GetAPIAutoconfParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAPIAutoconfParamsWithHTTPClient creates a new GetAPIAutoconfParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAPIAutoconfParamsWithHTTPClient(client *http.Client) *GetAPIAutoconfParams {
+	return &GetAPIAutoconfParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAPIAutoconfParams contains all the parameters to send to the API endpoint
+
+	for the get API autoconf operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAPIAutoconfParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get API autoconf params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPIAutoconfParams) WithDefaults() *GetAPIAutoconfParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get API autoconf params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAPIAutoconfParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get API autoconf params
+func (o *GetAPIAutoconfParams) WithTimeout(timeout time.Duration) *GetAPIAutoconfParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get API autoconf params
+func (o *GetAPIAutoconfParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get API autoconf params
+func (o *GetAPIAutoconfParams) WithContext(ctx context.Context) *GetAPIAutoconfParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get API autoconf params
+func (o *GetAPIAutoconfParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get API autoconf params
+func (o *GetAPIAutoconfParams) WithHTTPClient(client *http.Client) *GetAPIAutoconfParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get API autoconf params
+func (o *GetAPIAutoconfParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAPIAutoconfParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_autoconf_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_autoconf_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..ac5ec276224688898f8c57879205cd0016a06795
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_api_autoconf_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// GetAPIAutoconfReader is a Reader for the GetAPIAutoconf structure.
+type GetAPIAutoconfReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAPIAutoconfReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetAPIAutoconfOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetAPIAutoconfBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetAPIAutoconfNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetAPIAutoconfInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /api/autoconf] GetAPIAutoconf", response, response.Code())
+	}
+}
+
+// NewGetAPIAutoconfOK creates a GetAPIAutoconfOK with default headers values
+func NewGetAPIAutoconfOK() *GetAPIAutoconfOK {
+	return &GetAPIAutoconfOK{}
+}
+
+/*
+GetAPIAutoconfOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetAPIAutoconfOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this get Api autoconf o k response has a 2xx status code
+func (o *GetAPIAutoconfOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get Api autoconf o k response has a 3xx status code
+func (o *GetAPIAutoconfOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get Api autoconf o k response has a 4xx status code
+func (o *GetAPIAutoconfOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get Api autoconf o k response has a 5xx status code
+func (o *GetAPIAutoconfOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get Api autoconf o k response a status code equal to that given
+func (o *GetAPIAutoconfOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get Api autoconf o k response
+func (o *GetAPIAutoconfOK) Code() int {
+	return 200
+}
+
+func (o *GetAPIAutoconfOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/autoconf][%d] getApiAutoconfOK %s", 200, payload)
+}
+
+func (o *GetAPIAutoconfOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/autoconf][%d] getApiAutoconfOK %s", 200, payload)
+}
+
+func (o *GetAPIAutoconfOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *GetAPIAutoconfOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetAPIAutoconfBadRequest creates a GetAPIAutoconfBadRequest with default headers values
+func NewGetAPIAutoconfBadRequest() *GetAPIAutoconfBadRequest {
+	return &GetAPIAutoconfBadRequest{}
+}
+
+/*
+GetAPIAutoconfBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetAPIAutoconfBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get Api autoconf bad request response has a 2xx status code
+func (o *GetAPIAutoconfBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get Api autoconf bad request response has a 3xx status code
+func (o *GetAPIAutoconfBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get Api autoconf bad request response has a 4xx status code
+func (o *GetAPIAutoconfBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get Api autoconf bad request response has a 5xx status code
+func (o *GetAPIAutoconfBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get Api autoconf bad request response a status code equal to that given
+func (o *GetAPIAutoconfBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get Api autoconf bad request response
+func (o *GetAPIAutoconfBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetAPIAutoconfBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/autoconf][%d] getApiAutoconfBadRequest %s", 400, payload)
+}
+
+func (o *GetAPIAutoconfBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/autoconf][%d] getApiAutoconfBadRequest %s", 400, payload)
+}
+
+func (o *GetAPIAutoconfBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetAPIAutoconfBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetAPIAutoconfNotFound creates a GetAPIAutoconfNotFound with default headers values
+func NewGetAPIAutoconfNotFound() *GetAPIAutoconfNotFound {
+	return &GetAPIAutoconfNotFound{}
+}
+
+/*
+GetAPIAutoconfNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetAPIAutoconfNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get Api autoconf not found response has a 2xx status code
+func (o *GetAPIAutoconfNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get Api autoconf not found response has a 3xx status code
+func (o *GetAPIAutoconfNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get Api autoconf not found response has a 4xx status code
+func (o *GetAPIAutoconfNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get Api autoconf not found response has a 5xx status code
+func (o *GetAPIAutoconfNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get Api autoconf not found response a status code equal to that given
+func (o *GetAPIAutoconfNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get Api autoconf not found response
+func (o *GetAPIAutoconfNotFound) Code() int {
+	return 404
+}
+
+func (o *GetAPIAutoconfNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/autoconf][%d] getApiAutoconfNotFound %s", 404, payload)
+}
+
+func (o *GetAPIAutoconfNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/autoconf][%d] getApiAutoconfNotFound %s", 404, payload)
+}
+
+func (o *GetAPIAutoconfNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetAPIAutoconfNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetAPIAutoconfInternalServerError creates a GetAPIAutoconfInternalServerError with default headers values
+func NewGetAPIAutoconfInternalServerError() *GetAPIAutoconfInternalServerError {
+	return &GetAPIAutoconfInternalServerError{}
+}
+
+/*
+GetAPIAutoconfInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetAPIAutoconfInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get Api autoconf internal server error response has a 2xx status code
+func (o *GetAPIAutoconfInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get Api autoconf internal server error response has a 3xx status code
+func (o *GetAPIAutoconfInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get Api autoconf internal server error response has a 4xx status code
+func (o *GetAPIAutoconfInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get Api autoconf internal server error response has a 5xx status code
+func (o *GetAPIAutoconfInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get Api autoconf internal server error response a status code equal to that given
+func (o *GetAPIAutoconfInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get Api autoconf internal server error response
+func (o *GetAPIAutoconfInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetAPIAutoconfInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/autoconf][%d] getApiAutoconfInternalServerError %s", 500, payload)
+}
+
+func (o *GetAPIAutoconfInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /api/autoconf][%d] getApiAutoconfInternalServerError %s", 500, payload)
+}
+
+func (o *GetAPIAutoconfInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetAPIAutoconfInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_provider_json_parameters.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_provider_json_parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..68b3b805aeaecf8e1b30a38f597c6c99a5a856c6
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_provider_json_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetProviderJSONParams creates a new GetProviderJSONParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetProviderJSONParams() *GetProviderJSONParams {
+	return &GetProviderJSONParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetProviderJSONParamsWithTimeout creates a new GetProviderJSONParams object
+// with the ability to set a timeout on a request.
+func NewGetProviderJSONParamsWithTimeout(timeout time.Duration) *GetProviderJSONParams {
+	return &GetProviderJSONParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetProviderJSONParamsWithContext creates a new GetProviderJSONParams object
+// with the ability to set a context for a request.
+func NewGetProviderJSONParamsWithContext(ctx context.Context) *GetProviderJSONParams {
+	return &GetProviderJSONParams{
+		Context: ctx,
+	}
+}
+
+// NewGetProviderJSONParamsWithHTTPClient creates a new GetProviderJSONParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetProviderJSONParamsWithHTTPClient(client *http.Client) *GetProviderJSONParams {
+	return &GetProviderJSONParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetProviderJSONParams contains all the parameters to send to the API endpoint
+
+	for the get provider JSON operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetProviderJSONParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get provider JSON params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetProviderJSONParams) WithDefaults() *GetProviderJSONParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get provider JSON params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetProviderJSONParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get provider JSON params
+func (o *GetProviderJSONParams) WithTimeout(timeout time.Duration) *GetProviderJSONParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get provider JSON params
+func (o *GetProviderJSONParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get provider JSON params
+func (o *GetProviderJSONParams) WithContext(ctx context.Context) *GetProviderJSONParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get provider JSON params
+func (o *GetProviderJSONParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get provider JSON params
+func (o *GetProviderJSONParams) WithHTTPClient(client *http.Client) *GetProviderJSONParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get provider JSON params
+func (o *GetProviderJSONParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetProviderJSONParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_provider_json_responses.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_provider_json_responses.go
new file mode 100644
index 0000000000000000000000000000000000000000..c2ea0bfa937c4e5c9331b77a72d0af3fb78793f8
--- /dev/null
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/get_provider_json_responses.go
@@ -0,0 +1,328 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package provisioning
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"0xacab.org/leap/bitmask-core/models"
+)
+
+// GetProviderJSONReader is a Reader for the GetProviderJSON structure.
+type GetProviderJSONReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetProviderJSONReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetProviderJSONOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetProviderJSONBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetProviderJSONNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 500:
+		result := NewGetProviderJSONInternalServerError()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /provider.json] GetProviderJSON", response, response.Code())
+	}
+}
+
+// NewGetProviderJSONOK creates a GetProviderJSONOK with default headers values
+func NewGetProviderJSONOK() *GetProviderJSONOK {
+	return &GetProviderJSONOK{}
+}
+
+/*
+GetProviderJSONOK describes a response with status code 200, with default header values.
+
+OK
+*/
+type GetProviderJSONOK struct {
+	Payload *models.ModelsProvider
+}
+
+// IsSuccess returns true when this get provider Json o k response has a 2xx status code
+func (o *GetProviderJSONOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get provider Json o k response has a 3xx status code
+func (o *GetProviderJSONOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get provider Json o k response has a 4xx status code
+func (o *GetProviderJSONOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get provider Json o k response has a 5xx status code
+func (o *GetProviderJSONOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get provider Json o k response a status code equal to that given
+func (o *GetProviderJSONOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get provider Json o k response
+func (o *GetProviderJSONOK) Code() int {
+	return 200
+}
+
+func (o *GetProviderJSONOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /provider.json][%d] getProviderJsonOK %s", 200, payload)
+}
+
+func (o *GetProviderJSONOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /provider.json][%d] getProviderJsonOK %s", 200, payload)
+}
+
+func (o *GetProviderJSONOK) GetPayload() *models.ModelsProvider {
+	return o.Payload
+}
+
+func (o *GetProviderJSONOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ModelsProvider)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetProviderJSONBadRequest creates a GetProviderJSONBadRequest with default headers values
+func NewGetProviderJSONBadRequest() *GetProviderJSONBadRequest {
+	return &GetProviderJSONBadRequest{}
+}
+
+/*
+GetProviderJSONBadRequest describes a response with status code 400, with default header values.
+
+Bad Request
+*/
+type GetProviderJSONBadRequest struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get provider Json bad request response has a 2xx status code
+func (o *GetProviderJSONBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get provider Json bad request response has a 3xx status code
+func (o *GetProviderJSONBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get provider Json bad request response has a 4xx status code
+func (o *GetProviderJSONBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get provider Json bad request response has a 5xx status code
+func (o *GetProviderJSONBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get provider Json bad request response a status code equal to that given
+func (o *GetProviderJSONBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get provider Json bad request response
+func (o *GetProviderJSONBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetProviderJSONBadRequest) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /provider.json][%d] getProviderJsonBadRequest %s", 400, payload)
+}
+
+func (o *GetProviderJSONBadRequest) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /provider.json][%d] getProviderJsonBadRequest %s", 400, payload)
+}
+
+func (o *GetProviderJSONBadRequest) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetProviderJSONBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetProviderJSONNotFound creates a GetProviderJSONNotFound with default headers values
+func NewGetProviderJSONNotFound() *GetProviderJSONNotFound {
+	return &GetProviderJSONNotFound{}
+}
+
+/*
+GetProviderJSONNotFound describes a response with status code 404, with default header values.
+
+Not Found
+*/
+type GetProviderJSONNotFound struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get provider Json not found response has a 2xx status code
+func (o *GetProviderJSONNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get provider Json not found response has a 3xx status code
+func (o *GetProviderJSONNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get provider Json not found response has a 4xx status code
+func (o *GetProviderJSONNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get provider Json not found response has a 5xx status code
+func (o *GetProviderJSONNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get provider Json not found response a status code equal to that given
+func (o *GetProviderJSONNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get provider Json not found response
+func (o *GetProviderJSONNotFound) Code() int {
+	return 404
+}
+
+func (o *GetProviderJSONNotFound) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /provider.json][%d] getProviderJsonNotFound %s", 404, payload)
+}
+
+func (o *GetProviderJSONNotFound) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /provider.json][%d] getProviderJsonNotFound %s", 404, payload)
+}
+
+func (o *GetProviderJSONNotFound) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetProviderJSONNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetProviderJSONInternalServerError creates a GetProviderJSONInternalServerError with default headers values
+func NewGetProviderJSONInternalServerError() *GetProviderJSONInternalServerError {
+	return &GetProviderJSONInternalServerError{}
+}
+
+/*
+GetProviderJSONInternalServerError describes a response with status code 500, with default header values.
+
+Internal Server Error
+*/
+type GetProviderJSONInternalServerError struct {
+	Payload interface{}
+}
+
+// IsSuccess returns true when this get provider Json internal server error response has a 2xx status code
+func (o *GetProviderJSONInternalServerError) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get provider Json internal server error response has a 3xx status code
+func (o *GetProviderJSONInternalServerError) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get provider Json internal server error response has a 4xx status code
+func (o *GetProviderJSONInternalServerError) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get provider Json internal server error response has a 5xx status code
+func (o *GetProviderJSONInternalServerError) IsServerError() bool {
+	return true
+}
+
+// IsCode returns true when this get provider Json internal server error response a status code equal to that given
+func (o *GetProviderJSONInternalServerError) IsCode(code int) bool {
+	return code == 500
+}
+
+// Code gets the status code for the get provider Json internal server error response
+func (o *GetProviderJSONInternalServerError) Code() int {
+	return 500
+}
+
+func (o *GetProviderJSONInternalServerError) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /provider.json][%d] getProviderJsonInternalServerError %s", 500, payload)
+}
+
+func (o *GetProviderJSONInternalServerError) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /provider.json][%d] getProviderJsonInternalServerError %s", 500, payload)
+}
+
+func (o *GetProviderJSONInternalServerError) GetPayload() interface{} {
+	return o.Payload
+}
+
+func (o *GetProviderJSONInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/provisioning_client.go b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/provisioning_client.go
index d93cb17d2e2b17169a0a59e16209c6d730c7079b..ca36757736a46b24015463dd3b13369b85a60e37 100644
--- a/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/provisioning_client.go
+++ b/vendor/0xacab.org/leap/bitmask-core/pkg/client/provisioning/provisioning_client.go
@@ -80,44 +80,46 @@ func WithAcceptTextPlain(r *runtime.ClientOperation) {
 
 // ClientService is the interface for Client methods
 type ClientService interface {
-	Get5BridgeLocation(params *Get5BridgeLocationParams, opts ...ClientOption) (*Get5BridgeLocationOK, error)
+	GetAPI5BridgeLocation(params *GetAPI5BridgeLocationParams, opts ...ClientOption) (*GetApi5BridgeLocationOK, error)
 
-	Get5Bridges(params *Get5BridgesParams, opts ...ClientOption) (*Get5BridgesOK, error)
+	GetAPI5Bridges(params *GetAPI5BridgesParams, opts ...ClientOption) (*GetApi5BridgesOK, error)
 
-	Get5GatewayLocation(params *Get5GatewayLocationParams, opts ...ClientOption) (*Get5GatewayLocationOK, error)
+	GetAPI5GatewayLocation(params *GetAPI5GatewayLocationParams, opts ...ClientOption) (*GetApi5GatewayLocationOK, error)
 
-	Get5Gateways(params *Get5GatewaysParams, opts ...ClientOption) (*Get5GatewaysOK, error)
+	GetAPI5Gateways(params *GetAPI5GatewaysParams, opts ...ClientOption) (*GetApi5GatewaysOK, error)
 
-	Get5OpenvpnCert(params *Get5OpenvpnCertParams, opts ...ClientOption) (*Get5OpenvpnCertOK, error)
+	GetAPI5OpenvpnCert(params *GetAPI5OpenvpnCertParams, opts ...ClientOption) (*GetApi5OpenvpnCertOK, error)
 
-	Get5OpenvpnConfig(params *Get5OpenvpnConfigParams, opts ...ClientOption) (*Get5OpenvpnConfigOK, error)
+	GetAPI5OpenvpnConfig(params *GetAPI5OpenvpnConfigParams, opts ...ClientOption) (*GetApi5OpenvpnConfigOK, error)
 
-	Get5Service(params *Get5ServiceParams, opts ...ClientOption) (*Get5ServiceOK, error)
+	GetAPI5Service(params *GetAPI5ServiceParams, opts ...ClientOption) (*GetApi5ServiceOK, error)
 
-	GetAutoconf(params *GetAutoconfParams, opts ...ClientOption) (*GetAutoconfOK, error)
+	GetAPIAutoconf(params *GetAPIAutoconfParams, opts ...ClientOption) (*GetAPIAutoconfOK, error)
+
+	GetProviderJSON(params *GetProviderJSONParams, opts ...ClientOption) (*GetProviderJSONOK, error)
 
 	SetTransport(transport runtime.ClientTransport)
 }
 
 /*
-Get5BridgeLocation gets bridges
+GetAPI5BridgeLocation gets bridges
 
 fetch bridges by location
 */
-func (a *Client) Get5BridgeLocation(params *Get5BridgeLocationParams, opts ...ClientOption) (*Get5BridgeLocationOK, error) {
+func (a *Client) GetAPI5BridgeLocation(params *GetAPI5BridgeLocationParams, opts ...ClientOption) (*GetApi5BridgeLocationOK, error) {
 	// TODO: Validate the params before sending
 	if params == nil {
-		params = NewGet5BridgeLocationParams()
+		params = NewGetAPI5BridgeLocationParams()
 	}
 	op := &runtime.ClientOperation{
-		ID:                 "Get5BridgeLocation",
+		ID:                 "GetAPI5BridgeLocation",
 		Method:             "GET",
-		PathPattern:        "/5/bridge/{location}",
+		PathPattern:        "/api/5/bridge/{location}",
 		ProducesMediaTypes: []string{"application/json"},
 		ConsumesMediaTypes: []string{"application/json"},
 		Schemes:            []string{"http"},
 		Params:             params,
-		Reader:             &Get5BridgeLocationReader{formats: a.formats},
+		Reader:             &GetAPI5BridgeLocationReader{formats: a.formats},
 		Context:            params.Context,
 		Client:             params.HTTPClient,
 	}
@@ -129,35 +131,35 @@ func (a *Client) Get5BridgeLocation(params *Get5BridgeLocationParams, opts ...Cl
 	if err != nil {
 		return nil, err
 	}
-	success, ok := result.(*Get5BridgeLocationOK)
+	success, ok := result.(*GetApi5BridgeLocationOK)
 	if ok {
 		return success, nil
 	}
 	// unexpected success response
 	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
-	msg := fmt.Sprintf("unexpected success response for Get5BridgeLocation: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	msg := fmt.Sprintf("unexpected success response for GetAPI5BridgeLocation: API contract not enforced by server. Client expected to get an error, but got: %T", result)
 	panic(msg)
 }
 
 /*
-Get5Bridges gets all bridges
+GetAPI5Bridges gets all bridges
 
 Fetch all bridges. This is an optional API endpoint for compatibility with vpnweb, but do not count on all the providers to have it enabled since it makes it easier to enumerate resources. On the other hand, if the service has "open" VPN endpoints, they can enumerate them here freely. Bridges, however, should be more restricted as a general rule.
 */
-func (a *Client) Get5Bridges(params *Get5BridgesParams, opts ...ClientOption) (*Get5BridgesOK, error) {
+func (a *Client) GetAPI5Bridges(params *GetAPI5BridgesParams, opts ...ClientOption) (*GetApi5BridgesOK, error) {
 	// TODO: Validate the params before sending
 	if params == nil {
-		params = NewGet5BridgesParams()
+		params = NewGetAPI5BridgesParams()
 	}
 	op := &runtime.ClientOperation{
-		ID:                 "Get5Bridges",
+		ID:                 "GetAPI5Bridges",
 		Method:             "GET",
-		PathPattern:        "/5/bridges",
+		PathPattern:        "/api/5/bridges",
 		ProducesMediaTypes: []string{"application/json"},
 		ConsumesMediaTypes: []string{"application/json"},
 		Schemes:            []string{"http"},
 		Params:             params,
-		Reader:             &Get5BridgesReader{formats: a.formats},
+		Reader:             &GetAPI5BridgesReader{formats: a.formats},
 		Context:            params.Context,
 		Client:             params.HTTPClient,
 	}
@@ -169,35 +171,35 @@ func (a *Client) Get5Bridges(params *Get5BridgesParams, opts ...ClientOption) (*
 	if err != nil {
 		return nil, err
 	}
-	success, ok := result.(*Get5BridgesOK)
+	success, ok := result.(*GetApi5BridgesOK)
 	if ok {
 		return success, nil
 	}
 	// unexpected success response
 	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
-	msg := fmt.Sprintf("unexpected success response for Get5Bridges: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	msg := fmt.Sprintf("unexpected success response for GetAPI5Bridges: API contract not enforced by server. Client expected to get an error, but got: %T", result)
 	panic(msg)
 }
 
 /*
-Get5GatewayLocation gets gateways by location
+GetAPI5GatewayLocation gets gateways by location
 
 fetch random gateways for a given location
 */
-func (a *Client) Get5GatewayLocation(params *Get5GatewayLocationParams, opts ...ClientOption) (*Get5GatewayLocationOK, error) {
+func (a *Client) GetAPI5GatewayLocation(params *GetAPI5GatewayLocationParams, opts ...ClientOption) (*GetApi5GatewayLocationOK, error) {
 	// TODO: Validate the params before sending
 	if params == nil {
-		params = NewGet5GatewayLocationParams()
+		params = NewGetAPI5GatewayLocationParams()
 	}
 	op := &runtime.ClientOperation{
-		ID:                 "Get5GatewayLocation",
+		ID:                 "GetAPI5GatewayLocation",
 		Method:             "GET",
-		PathPattern:        "/5/gateway/{location}",
+		PathPattern:        "/api/5/gateway/{location}",
 		ProducesMediaTypes: []string{"application/json"},
 		ConsumesMediaTypes: []string{"application/json"},
 		Schemes:            []string{"http"},
 		Params:             params,
-		Reader:             &Get5GatewayLocationReader{formats: a.formats},
+		Reader:             &GetAPI5GatewayLocationReader{formats: a.formats},
 		Context:            params.Context,
 		Client:             params.HTTPClient,
 	}
@@ -209,35 +211,35 @@ func (a *Client) Get5GatewayLocation(params *Get5GatewayLocationParams, opts ...
 	if err != nil {
 		return nil, err
 	}
-	success, ok := result.(*Get5GatewayLocationOK)
+	success, ok := result.(*GetApi5GatewayLocationOK)
 	if ok {
 		return success, nil
 	}
 	// unexpected success response
 	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
-	msg := fmt.Sprintf("unexpected success response for Get5GatewayLocation: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	msg := fmt.Sprintf("unexpected success response for GetAPI5GatewayLocation: API contract not enforced by server. Client expected to get an error, but got: %T", result)
 	panic(msg)
 }
 
 /*
-Get5Gateways gets all gateways
+GetAPI5Gateways gets all gateways
 
 Fetch all gateways. This is an optional API endpoint for compatibility with vpnweb, but do not count on all the providers to have it enabled since it makes it easier to enumerate resources. On the other hand, if the service has "open" VPN endpoints, they can enumerate them here freely. Bridges, however, should be more restricted as a general rule.
 */
-func (a *Client) Get5Gateways(params *Get5GatewaysParams, opts ...ClientOption) (*Get5GatewaysOK, error) {
+func (a *Client) GetAPI5Gateways(params *GetAPI5GatewaysParams, opts ...ClientOption) (*GetApi5GatewaysOK, error) {
 	// TODO: Validate the params before sending
 	if params == nil {
-		params = NewGet5GatewaysParams()
+		params = NewGetAPI5GatewaysParams()
 	}
 	op := &runtime.ClientOperation{
-		ID:                 "Get5Gateways",
+		ID:                 "GetAPI5Gateways",
 		Method:             "GET",
-		PathPattern:        "/5/gateways",
+		PathPattern:        "/api/5/gateways",
 		ProducesMediaTypes: []string{"application/json"},
 		ConsumesMediaTypes: []string{"application/json"},
 		Schemes:            []string{"http"},
 		Params:             params,
-		Reader:             &Get5GatewaysReader{formats: a.formats},
+		Reader:             &GetAPI5GatewaysReader{formats: a.formats},
 		Context:            params.Context,
 		Client:             params.HTTPClient,
 	}
@@ -249,35 +251,35 @@ func (a *Client) Get5Gateways(params *Get5GatewaysParams, opts ...ClientOption)
 	if err != nil {
 		return nil, err
 	}
-	success, ok := result.(*Get5GatewaysOK)
+	success, ok := result.(*GetApi5GatewaysOK)
 	if ok {
 		return success, nil
 	}
 	// unexpected success response
 	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
-	msg := fmt.Sprintf("unexpected success response for Get5Gateways: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	msg := fmt.Sprintf("unexpected success response for GetAPI5Gateways: API contract not enforced by server. Client expected to get an error, but got: %T", result)
 	panic(msg)
 }
 
 /*
-Get5OpenvpnCert gets openvpn cert
+GetAPI5OpenvpnCert gets openvpn cert
 
 Fetch a new key and cert.
 */
-func (a *Client) Get5OpenvpnCert(params *Get5OpenvpnCertParams, opts ...ClientOption) (*Get5OpenvpnCertOK, error) {
+func (a *Client) GetAPI5OpenvpnCert(params *GetAPI5OpenvpnCertParams, opts ...ClientOption) (*GetApi5OpenvpnCertOK, error) {
 	// TODO: Validate the params before sending
 	if params == nil {
-		params = NewGet5OpenvpnCertParams()
+		params = NewGetAPI5OpenvpnCertParams()
 	}
 	op := &runtime.ClientOperation{
-		ID:                 "Get5OpenvpnCert",
+		ID:                 "GetAPI5OpenvpnCert",
 		Method:             "GET",
-		PathPattern:        "/5/openvpn/cert",
+		PathPattern:        "/api/5/openvpn/cert",
 		ProducesMediaTypes: []string{"application/json"},
 		ConsumesMediaTypes: []string{"application/json"},
 		Schemes:            []string{"http"},
 		Params:             params,
-		Reader:             &Get5OpenvpnCertReader{formats: a.formats},
+		Reader:             &GetAPI5OpenvpnCertReader{formats: a.formats},
 		Context:            params.Context,
 		Client:             params.HTTPClient,
 	}
@@ -289,35 +291,35 @@ func (a *Client) Get5OpenvpnCert(params *Get5OpenvpnCertParams, opts ...ClientOp
 	if err != nil {
 		return nil, err
 	}
-	success, ok := result.(*Get5OpenvpnCertOK)
+	success, ok := result.(*GetApi5OpenvpnCertOK)
 	if ok {
 		return success, nil
 	}
 	// unexpected success response
 	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
-	msg := fmt.Sprintf("unexpected success response for Get5OpenvpnCert: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	msg := fmt.Sprintf("unexpected success response for GetAPI5OpenvpnCert: API contract not enforced by server. Client expected to get an error, but got: %T", result)
 	panic(msg)
 }
 
 /*
-Get5OpenvpnConfig fetches open v p n config file
+GetAPI5OpenvpnConfig fetches open v p n config file
 
 fetch a working config file for OpenVPN service.
 */
-func (a *Client) Get5OpenvpnConfig(params *Get5OpenvpnConfigParams, opts ...ClientOption) (*Get5OpenvpnConfigOK, error) {
+func (a *Client) GetAPI5OpenvpnConfig(params *GetAPI5OpenvpnConfigParams, opts ...ClientOption) (*GetApi5OpenvpnConfigOK, error) {
 	// TODO: Validate the params before sending
 	if params == nil {
-		params = NewGet5OpenvpnConfigParams()
+		params = NewGetAPI5OpenvpnConfigParams()
 	}
 	op := &runtime.ClientOperation{
-		ID:                 "Get5OpenvpnConfig",
+		ID:                 "GetAPI5OpenvpnConfig",
 		Method:             "GET",
-		PathPattern:        "/5/openvpn/config",
+		PathPattern:        "/api/5/openvpn/config",
 		ProducesMediaTypes: []string{"text/plain"},
 		ConsumesMediaTypes: []string{"application/json"},
 		Schemes:            []string{"http"},
 		Params:             params,
-		Reader:             &Get5OpenvpnConfigReader{formats: a.formats},
+		Reader:             &GetAPI5OpenvpnConfigReader{formats: a.formats},
 		Context:            params.Context,
 		Client:             params.HTTPClient,
 	}
@@ -329,35 +331,35 @@ func (a *Client) Get5OpenvpnConfig(params *Get5OpenvpnConfigParams, opts ...Clie
 	if err != nil {
 		return nil, err
 	}
-	success, ok := result.(*Get5OpenvpnConfigOK)
+	success, ok := result.(*GetApi5OpenvpnConfigOK)
 	if ok {
 		return success, nil
 	}
 	// unexpected success response
 	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
-	msg := fmt.Sprintf("unexpected success response for Get5OpenvpnConfig: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	msg := fmt.Sprintf("unexpected success response for GetAPI5OpenvpnConfig: API contract not enforced by server. Client expected to get an error, but got: %T", result)
 	panic(msg)
 }
 
 /*
-Get5Service gets service info
+GetAPI5Service gets service info
 
 fetch service information, including location and common tunnel config
 */
-func (a *Client) Get5Service(params *Get5ServiceParams, opts ...ClientOption) (*Get5ServiceOK, error) {
+func (a *Client) GetAPI5Service(params *GetAPI5ServiceParams, opts ...ClientOption) (*GetApi5ServiceOK, error) {
 	// TODO: Validate the params before sending
 	if params == nil {
-		params = NewGet5ServiceParams()
+		params = NewGetAPI5ServiceParams()
 	}
 	op := &runtime.ClientOperation{
-		ID:                 "Get5Service",
+		ID:                 "GetAPI5Service",
 		Method:             "GET",
-		PathPattern:        "/5/service",
+		PathPattern:        "/api/5/service",
 		ProducesMediaTypes: []string{"application/json"},
 		ConsumesMediaTypes: []string{"application/json"},
 		Schemes:            []string{"http"},
 		Params:             params,
-		Reader:             &Get5ServiceReader{formats: a.formats},
+		Reader:             &GetAPI5ServiceReader{formats: a.formats},
 		Context:            params.Context,
 		Client:             params.HTTPClient,
 	}
@@ -369,35 +371,75 @@ func (a *Client) Get5Service(params *Get5ServiceParams, opts ...ClientOption) (*
 	if err != nil {
 		return nil, err
 	}
-	success, ok := result.(*Get5ServiceOK)
+	success, ok := result.(*GetApi5ServiceOK)
 	if ok {
 		return success, nil
 	}
 	// unexpected success response
 	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
-	msg := fmt.Sprintf("unexpected success response for Get5Service: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	msg := fmt.Sprintf("unexpected success response for GetAPI5Service: API contract not enforced by server. Client expected to get an error, but got: %T", result)
 	panic(msg)
 }
 
 /*
-GetAutoconf fetches open v p n config file
+GetAPIAutoconf fetches open v p n config file
 
 fetch a working config file for OpenVPN service.
 */
-func (a *Client) GetAutoconf(params *GetAutoconfParams, opts ...ClientOption) (*GetAutoconfOK, error) {
+func (a *Client) GetAPIAutoconf(params *GetAPIAutoconfParams, opts ...ClientOption) (*GetAPIAutoconfOK, error) {
 	// TODO: Validate the params before sending
 	if params == nil {
-		params = NewGetAutoconfParams()
+		params = NewGetAPIAutoconfParams()
 	}
 	op := &runtime.ClientOperation{
-		ID:                 "GetAutoconf",
+		ID:                 "GetAPIAutoconf",
 		Method:             "GET",
-		PathPattern:        "/autoconf",
+		PathPattern:        "/api/autoconf",
 		ProducesMediaTypes: []string{"text/plain"},
 		ConsumesMediaTypes: []string{"application/json"},
 		Schemes:            []string{"http"},
 		Params:             params,
-		Reader:             &GetAutoconfReader{formats: a.formats},
+		Reader:             &GetAPIAutoconfReader{formats: a.formats},
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetAPIAutoconfOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for GetAPIAutoconf: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetProviderJSON gets provider info
+
+Fetch provider information how to configure and bootstrap the VPN
+*/
+func (a *Client) GetProviderJSON(params *GetProviderJSONParams, opts ...ClientOption) (*GetProviderJSONOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetProviderJSONParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "GetProviderJSON",
+		Method:             "GET",
+		PathPattern:        "/provider.json",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http"},
+		Params:             params,
+		Reader:             &GetProviderJSONReader{formats: a.formats},
 		Context:            params.Context,
 		Client:             params.HTTPClient,
 	}
@@ -409,13 +451,13 @@ func (a *Client) GetAutoconf(params *GetAutoconfParams, opts ...ClientOption) (*
 	if err != nil {
 		return nil, err
 	}
-	success, ok := result.(*GetAutoconfOK)
+	success, ok := result.(*GetProviderJSONOK)
 	if ok {
 		return success, nil
 	}
 	// unexpected success response
 	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
-	msg := fmt.Sprintf("unexpected success response for GetAutoconf: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	msg := fmt.Sprintf("unexpected success response for GetProviderJSON: API contract not enforced by server. Client expected to get an error, but got: %T", result)
 	panic(msg)
 }
 
diff --git a/vendor/0xacab.org/leap/tunnel-telemetry/LICENSE b/vendor/0xacab.org/leap/tunnel-telemetry/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..810fce6e9bf2aa10265b85614db5ac65941ecf81
--- /dev/null
+++ b/vendor/0xacab.org/leap/tunnel-telemetry/LICENSE
@@ -0,0 +1,621 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
diff --git a/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/doc.go b/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/doc.go
new file mode 100644
index 0000000000000000000000000000000000000000..41968a9de47df56259dcc2d1934b235ff8f8f2ca
--- /dev/null
+++ b/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/doc.go
@@ -0,0 +1,2 @@
+// Package geolocate has utils to obtain geolocate metadata about the vantage point.
+package geolocate
diff --git a/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/geolocate.go b/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/geolocate.go
new file mode 100644
index 0000000000000000000000000000000000000000..49eeecb677c45f389a4d227fbc7881b76bb42311
--- /dev/null
+++ b/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/geolocate.go
@@ -0,0 +1,194 @@
+package geolocate
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"math/rand"
+	"net/http"
+
+	"github.com/rs/zerolog/log"
+)
+
+var (
+	defaultGeolocationAPI = "https://api.dev.ooni.io/api/v1/geolookup"
+)
+
+// FindCurrentHostGeolocation will make a best-effor attempt at discovering the public IP
+// of the vantage point where the software is running, and obtain geolocation metadata for it.
+// This function currently uses a single endpoint for geolocation (in the OONI API).
+func FindCurrentHostGeolocation() (*GeoInfo, error) {
+	ip, err := AttemptFetchingPublicIP()
+	if err != nil {
+		return nil, err
+	}
+
+	// TODO: use smart-dialer here.
+	geo := NewGeolocator()
+	info, err := geo.Geolocate(ip)
+	if err != nil {
+		return nil, err
+	}
+	return info, nil
+}
+
+// FindCurrentHostGeolocationWithSTUN first trys to get the current public ip address by
+// using the given STUN servers. It then uses countryCodeLookupURL to convert the ip address
+// into a country code. If countryCodeLookupURL is empty, then defaultGeolocationAPI (OONI) is used
+func FindCurrentHostGeolocationWithSTUN(stunServers []string, countryCodeLookupURL string) (*GeoInfo, error) {
+	var ip string
+	var err error
+
+	if len(stunServers) == 0 {
+		return nil, errors.New("Could not get country code. The list of STUN servers is empty")
+	}
+
+	for _, server := range stunServers {
+		log.Trace().
+			Str("server", server).
+			Msg("Trying STUN server")
+
+		ip, err = FetchIPFromSTUNCall(server)
+		if err == nil {
+			break
+		} else {
+			log.Warn().
+				Str("server", server).
+				Err(err).
+				Msg("Could not get ip using STUN server")
+		}
+	}
+
+	if ip == "" {
+		return nil, errors.New("Could not get ip address with STUN servers. All STUN servers failed")
+	}
+
+	// TODO: use smart-dialer here.
+	geo := NewGeolocator()
+	if countryCodeLookupURL == "" {
+		log.Trace().
+			Str("countryCodeLookupURL", defaultGeolocationAPI).
+			Msg("Using default country code lookup url (OONI)")
+	} else {
+		geo.API = countryCodeLookupURL
+		log.Trace().
+			Str("countryCodeLookupURL", countryCodeLookupURL).
+			Msg("Using custom country code lookup url")
+	}
+	info, err := geo.Geolocate(ip)
+	if err != nil {
+		return nil, err
+	}
+	return info, nil
+}
+
+// AttemptFetchingPublicIP will attempt to get our public IP by exhausting
+// all the available sources; the order is stun > https. It will return
+// an error if all the sources are used and we still don't have a result.
+func AttemptFetchingPublicIP() (string, error) {
+
+	log.Trace().Msg("Trying to get current ip address using STUN servers")
+	shuffleServers(stunServers)
+
+	for _, server := range stunServers {
+		log.Trace().
+			Str("server", server).
+			Msg("Trying STUN server")
+
+		ip, err := FetchIPFromSTUNCall(server)
+		if err != nil {
+			log.Warn().
+				Str("server", server).
+				Err(err).
+				Msg("Could not get ip using STUN server")
+			continue
+		}
+		return ip, nil
+	}
+
+	log.Warn().Msg("Could not get current ip address using STUN servers. Using public WebAPIs")
+
+	shuffleServers(httpsServers)
+	for _, provider := range httpsServers {
+
+		log.Trace().
+			Str("provider", provider).
+			Msg("Using Provider")
+
+		ip, err := FetchIPFromHTTPSAPICall(provider)
+		if err != nil {
+			log.Warn().
+				Str("provider", provider).
+				Err(err).
+				Msg("Could not get ip using WebAPI")
+			continue
+		} else {
+			return ip, nil
+		}
+	}
+	return "", errors.New("Could not get ip address by using STUN/WebAPIs")
+}
+
+// A Geolocator is able to geolocate IPs, using a specific http.Client.
+type Geolocator struct {
+	API    string
+	Client *http.Client
+}
+
+// TODO: add NewGeolocationWithHTTPClient
+func NewGeolocator() *Geolocator {
+	return &Geolocator{
+		API:    defaultGeolocationAPI,
+		Client: defaultHTTPClient,
+	}
+}
+
+// GeoInfo contains the minimal metadata that we need for annotating
+// reports.
+type GeoInfo struct {
+	ASName string `json:"as_name"`
+	ASN    int    `json:"asn"`
+	CC     string `json:"cc"`
+}
+
+type geoLocationFromOONI struct {
+	Geolocation map[string]GeoInfo `json:"geolocation"`
+	Version     int                `json:"v"`
+}
+
+func (g *Geolocator) Geolocate(ip string) (*GeoInfo, error) {
+	resp := &geoLocationFromOONI{}
+	query := fmt.Sprintf(`{"addresses": ["%s"]}`, ip)
+	if err := g.doPostJSON(g.API, []byte(query), resp); err != nil {
+		return nil, fmt.Errorf("Could not use country code lookup server: %s", err)
+	}
+	geoinfo := resp.Geolocation[ip]
+	return &geoinfo, nil
+}
+
+func (g *Geolocator) doPostJSON(url string, data []byte, jd any) error {
+	req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(data)))
+	if err != nil {
+		return err
+	}
+	req.Header.Set("Content-Type", "application/json")
+	resp, err := g.Client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+
+	if jd != nil {
+		if err := json.NewDecoder(resp.Body).Decode(jd); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func shuffleServers(ss []string) {
+	rand.Shuffle(len(ss), func(i, j int) {
+		ss[i], ss[j] = ss[j], ss[i]
+	})
+}
diff --git a/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/https.go b/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/https.go
new file mode 100644
index 0000000000000000000000000000000000000000..e6e019da786f756b7d6ec23cb7a5424be7f538fe
--- /dev/null
+++ b/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/https.go
@@ -0,0 +1,76 @@
+package geolocate
+
+import (
+	"net/http"
+	"time"
+)
+
+var (
+	// TODO: can add ubuntu, cloudflare here
+	httpsServers = []string{"bdc", "ipify", "ipinfo"}
+
+	defaultHTTPClient = &http.Client{Timeout: 10 * time.Second}
+)
+
+type apiIP struct {
+	uri    string
+	lookup func() (string, error)
+}
+
+var ipProviders = map[string]apiIP{
+	"bdc": func() apiIP {
+		uri := "https://api-bdc.net/data/client-ip"
+		type r struct {
+			IP   string `json:"ipString"`
+			Type string `json:"ipType"`
+		}
+		return apiIP{
+			uri: uri,
+			lookup: func() (string, error) {
+				v := &r{}
+				if err := getJSON(uri, v); err != nil {
+					return "", err
+				}
+				return v.IP, nil
+			},
+		}
+	}(),
+	"ipify": func() apiIP {
+		uri := "https://api.ipify.org?format=json"
+		type r struct {
+			IP string `json:"ip"`
+		}
+		return apiIP{
+			uri: uri,
+			lookup: func() (string, error) {
+				v := &r{}
+				if err := getJSON(uri, v); err != nil {
+					return "", err
+				}
+				return v.IP, nil
+			},
+		}
+	}(),
+	"ipinfo": func() apiIP {
+		uri := "https://ipinfo.io/json"
+		type r struct {
+			IP      string `json:"ip"`
+			Country string `json:"country"`
+		}
+		return apiIP{
+			uri: uri,
+			lookup: func() (string, error) {
+				v := &r{}
+				if err := getJSON(uri, v); err != nil {
+					return "", err
+				}
+				return v.IP, nil
+			},
+		}
+	}(),
+}
+
+// FetchIPFromHTTPSAPICall tries to get the public IP via the passed HTTPS provider label.
+func FetchIPFromHTTPSAPICall(provider string) (string, error) {
+	return ipProviders[provider].lookup()
+}
diff --git a/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/stun.go b/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/stun.go
new file mode 100644
index 0000000000000000000000000000000000000000..41535a574779bcf0dcf5caa7e9f6cd592bd04753
--- /dev/null
+++ b/vendor/0xacab.org/leap/tunnel-telemetry/pkg/geolocate/stun.go
@@ -0,0 +1,87 @@
+package geolocate
+
+import (
+	"encoding/json"
+
+	"github.com/pion/stun"
+)
+
+var (
+	// useful: https://github.com/pradt2/always-online-stun
+	stunServers = []string{
+		"stun.ekiga.net:3478",
+		"stun.syncthing.net:3478",
+		"stun.nextcloud.com:443",
+		"relay.webwormhole.io:3478",
+		"stun4.l.google.com:3478",
+		"stun1.l.google.com:3478",
+		"stun2.l.google.com:3478",
+		"stun3.l.google.com:3478",
+		"stun.cloudflare.com:3478",
+		// cn
+		"stun.xten.com:3478",
+		"stun.miwifi.com:3478",
+		"stun.chat.bilibili.com:3478",
+		// hardcoded ips
+		"209.105.241.31:3478",
+		"51.68.45.75:3478",
+		"37.139.120.14:3478",
+		"3.132.228.249:3478",
+		"198.27.70.99:3478",
+		"5.9.87.18:3478",
+		"193.22.17.97:3478",
+	}
+)
+
+// FetchIPFromSTUNCall tries to get our public IP using the passed
+// stun uri. It returns an error of the operation does not succeed.
+func FetchIPFromSTUNCall(uri string) (string, error) {
+	u, err := stun.ParseURI("stun:" + uri)
+	if err != nil {
+		return "", err
+	}
+
+	// Create a "connection" to STUN server.
+	c, err := stun.DialURI(u, &stun.DialConfig{})
+	if err != nil {
+		return "", err
+	}
+	// Build binding request with random transaction id.
+	message := stun.MustBuild(stun.TransactionID, stun.BindingRequest)
+
+	errch, ipch := make(chan error, 1), make(chan string, 1)
+
+	// Send request to STUN server, waiting for response message.
+	if err := c.Do(message, func(res stun.Event) {
+		if res.Error != nil {
+			errch <- res.Error
+			return
+		}
+		// Decode XOR-MAPPED-ADDRESS attribute from message.
+		var xorAddr stun.XORMappedAddress
+		if err := xorAddr.GetFrom(res.Message); err != nil {
+			errch <- err
+			return
+		}
+		ipch <- xorAddr.IP.String()
+	}); err != nil {
+		return "", err
+	}
+	// TODO(ain): add timeout/ctx
+	select {
+	case err := <-errch:
+		return "", err
+	case ip := <-ipch:
+		return ip, nil
+	}
+}
+
+func getJSON(url string, target interface{}) error {
+	r, err := defaultHTTPClient.Get(url)
+	if err != nil {
+		return err
+	}
+	defer r.Body.Close()
+
+	return json.NewDecoder(r.Body).Decode(target)
+}
diff --git a/vendor/github.com/google/pprof/profile/encode.go b/vendor/github.com/google/pprof/profile/encode.go
index ab7f03ae2677b4a5673def3d47e349821629f606..182c926b9089842a6f1c4e2cc84d8b371e3ebde3 100644
--- a/vendor/github.com/google/pprof/profile/encode.go
+++ b/vendor/github.com/google/pprof/profile/encode.go
@@ -17,6 +17,7 @@ package profile
 import (
 	"errors"
 	"sort"
+	"strings"
 )
 
 func (p *Profile) decoder() []decoder {
@@ -183,12 +184,13 @@ var profileDecoder = []decoder{
 	// repeated Location location = 4
 	func(b *buffer, m message) error {
 		x := new(Location)
-		x.Line = make([]Line, 0, 8) // Pre-allocate Line buffer
+		x.Line = b.tmpLines[:0] // Use shared space temporarily
 		pp := m.(*Profile)
 		pp.Location = append(pp.Location, x)
 		err := decodeMessage(b, x)
-		var tmp []Line
-		x.Line = append(tmp, x.Line...) // Shrink to allocated size
+		b.tmpLines = x.Line[:0]
+		// Copy to shrink size and detach from shared space.
+		x.Line = append([]Line(nil), x.Line...)
 		return err
 	},
 	// repeated Function function = 5
@@ -252,6 +254,14 @@ func (p *Profile) postDecode() error {
 		} else {
 			mappings[m.ID] = m
 		}
+
+		// If this a main linux kernel mapping with a relocation symbol suffix
+		// ("[kernel.kallsyms]_text"), extract said suffix.
+		// It is fairly hacky to handle at this level, but the alternatives appear even worse.
+		const prefix = "[kernel.kallsyms]"
+		if strings.HasPrefix(m.File, prefix) {
+			m.KernelRelocationSymbol = m.File[len(prefix):]
+		}
 	}
 
 	functions := make(map[uint64]*Function, len(p.Function))
@@ -298,41 +308,52 @@ func (p *Profile) postDecode() error {
 		st.Unit, err = getString(p.stringTable, &st.unitX, err)
 	}
 
+	// Pre-allocate space for all locations.
+	numLocations := 0
+	for _, s := range p.Sample {
+		numLocations += len(s.locationIDX)
+	}
+	locBuffer := make([]*Location, numLocations)
+
 	for _, s := range p.Sample {
-		labels := make(map[string][]string, len(s.labelX))
-		numLabels := make(map[string][]int64, len(s.labelX))
-		numUnits := make(map[string][]string, len(s.labelX))
-		for _, l := range s.labelX {
-			var key, value string
-			key, err = getString(p.stringTable, &l.keyX, err)
-			if l.strX != 0 {
-				value, err = getString(p.stringTable, &l.strX, err)
-				labels[key] = append(labels[key], value)
-			} else if l.numX != 0 || l.unitX != 0 {
-				numValues := numLabels[key]
-				units := numUnits[key]
-				if l.unitX != 0 {
-					var unit string
-					unit, err = getString(p.stringTable, &l.unitX, err)
-					units = padStringArray(units, len(numValues))
-					numUnits[key] = append(units, unit)
+		if len(s.labelX) > 0 {
+			labels := make(map[string][]string, len(s.labelX))
+			numLabels := make(map[string][]int64, len(s.labelX))
+			numUnits := make(map[string][]string, len(s.labelX))
+			for _, l := range s.labelX {
+				var key, value string
+				key, err = getString(p.stringTable, &l.keyX, err)
+				if l.strX != 0 {
+					value, err = getString(p.stringTable, &l.strX, err)
+					labels[key] = append(labels[key], value)
+				} else if l.numX != 0 || l.unitX != 0 {
+					numValues := numLabels[key]
+					units := numUnits[key]
+					if l.unitX != 0 {
+						var unit string
+						unit, err = getString(p.stringTable, &l.unitX, err)
+						units = padStringArray(units, len(numValues))
+						numUnits[key] = append(units, unit)
+					}
+					numLabels[key] = append(numLabels[key], l.numX)
 				}
-				numLabels[key] = append(numLabels[key], l.numX)
 			}
-		}
-		if len(labels) > 0 {
-			s.Label = labels
-		}
-		if len(numLabels) > 0 {
-			s.NumLabel = numLabels
-			for key, units := range numUnits {
-				if len(units) > 0 {
-					numUnits[key] = padStringArray(units, len(numLabels[key]))
+			if len(labels) > 0 {
+				s.Label = labels
+			}
+			if len(numLabels) > 0 {
+				s.NumLabel = numLabels
+				for key, units := range numUnits {
+					if len(units) > 0 {
+						numUnits[key] = padStringArray(units, len(numLabels[key]))
+					}
 				}
+				s.NumUnit = numUnits
 			}
-			s.NumUnit = numUnits
 		}
-		s.Location = make([]*Location, len(s.locationIDX))
+
+		s.Location = locBuffer[:len(s.locationIDX)]
+		locBuffer = locBuffer[len(s.locationIDX):]
 		for i, lid := range s.locationIDX {
 			if lid < uint64(len(locationIds)) {
 				s.Location[i] = locationIds[lid]
diff --git a/vendor/github.com/google/pprof/profile/filter.go b/vendor/github.com/google/pprof/profile/filter.go
index ea8e66c68d25546dd2f5cd1a882c5261f526a3c4..c794b939067cfd119e0427a5ea7af5ff5ba2cdb7 100644
--- a/vendor/github.com/google/pprof/profile/filter.go
+++ b/vendor/github.com/google/pprof/profile/filter.go
@@ -22,6 +22,10 @@ import "regexp"
 // samples where at least one frame matches focus but none match ignore.
 // Returns true is the corresponding regexp matched at least one sample.
 func (p *Profile) FilterSamplesByName(focus, ignore, hide, show *regexp.Regexp) (fm, im, hm, hnm bool) {
+	if focus == nil && ignore == nil && hide == nil && show == nil {
+		fm = true // Missing focus implies a match
+		return
+	}
 	focusOrIgnore := make(map[uint64]bool)
 	hidden := make(map[uint64]bool)
 	for _, l := range p.Location {
diff --git a/vendor/github.com/google/pprof/profile/legacy_profile.go b/vendor/github.com/google/pprof/profile/legacy_profile.go
index 0c8f3bb5b71f45f6c9edc402c4a9fada3690b9f8..8d07fd6c27c2af3052c3fd36562307560a058623 100644
--- a/vendor/github.com/google/pprof/profile/legacy_profile.go
+++ b/vendor/github.com/google/pprof/profile/legacy_profile.go
@@ -295,11 +295,12 @@ func get64b(b []byte) (uint64, []byte) {
 //
 // The general format for profilez samples is a sequence of words in
 // binary format. The first words are a header with the following data:
-//   1st word -- 0
-//   2nd word -- 3
-//   3rd word -- 0 if a c++ application, 1 if a java application.
-//   4th word -- Sampling period (in microseconds).
-//   5th word -- Padding.
+//
+//	1st word -- 0
+//	2nd word -- 3
+//	3rd word -- 0 if a c++ application, 1 if a java application.
+//	4th word -- Sampling period (in microseconds).
+//	5th word -- Padding.
 func parseCPU(b []byte) (*Profile, error) {
 	var parse func([]byte) (uint64, []byte)
 	var n1, n2, n3, n4, n5 uint64
@@ -403,15 +404,18 @@ func cleanupDuplicateLocations(p *Profile) {
 //
 // profilez samples are a repeated sequence of stack frames of the
 // form:
-//    1st word -- The number of times this stack was encountered.
-//    2nd word -- The size of the stack (StackSize).
-//    3rd word -- The first address on the stack.
-//    ...
-//    StackSize + 2 -- The last address on the stack
+//
+//	1st word -- The number of times this stack was encountered.
+//	2nd word -- The size of the stack (StackSize).
+//	3rd word -- The first address on the stack.
+//	...
+//	StackSize + 2 -- The last address on the stack
+//
 // The last stack trace is of the form:
-//   1st word -- 0
-//   2nd word -- 1
-//   3rd word -- 0
+//
+//	1st word -- 0
+//	2nd word -- 1
+//	3rd word -- 0
 //
 // Addresses from stack traces may point to the next instruction after
 // each call. Optionally adjust by -1 to land somewhere on the actual
@@ -861,7 +865,6 @@ func parseThread(b []byte) (*Profile, error) {
 	// Recognize each thread and populate profile samples.
 	for !isMemoryMapSentinel(line) {
 		if strings.HasPrefix(line, "---- no stack trace for") {
-			line = ""
 			break
 		}
 		if t := threadStartRE.FindStringSubmatch(line); len(t) != 4 {
diff --git a/vendor/github.com/google/pprof/profile/merge.go b/vendor/github.com/google/pprof/profile/merge.go
index 9978e7330e6e6fe670b78561c2eb45d166b217bb..4b66282cb8e03f28c531c707ec33857bb7220906 100644
--- a/vendor/github.com/google/pprof/profile/merge.go
+++ b/vendor/github.com/google/pprof/profile/merge.go
@@ -15,6 +15,7 @@
 package profile
 
 import (
+	"encoding/binary"
 	"fmt"
 	"sort"
 	"strconv"
@@ -58,7 +59,7 @@ func Merge(srcs []*Profile) (*Profile, error) {
 
 	for _, src := range srcs {
 		// Clear the profile-specific hash tables
-		pm.locationsByID = make(map[uint64]*Location, len(src.Location))
+		pm.locationsByID = makeLocationIDMap(len(src.Location))
 		pm.functionsByID = make(map[uint64]*Function, len(src.Function))
 		pm.mappingsByID = make(map[uint64]mapInfo, len(src.Mapping))
 
@@ -136,7 +137,7 @@ type profileMerger struct {
 	p *Profile
 
 	// Memoization tables within a profile.
-	locationsByID map[uint64]*Location
+	locationsByID locationIDMap
 	functionsByID map[uint64]*Function
 	mappingsByID  map[uint64]mapInfo
 
@@ -153,6 +154,16 @@ type mapInfo struct {
 }
 
 func (pm *profileMerger) mapSample(src *Sample) *Sample {
+	// Check memoization table
+	k := pm.sampleKey(src)
+	if ss, ok := pm.samples[k]; ok {
+		for i, v := range src.Value {
+			ss.Value[i] += v
+		}
+		return ss
+	}
+
+	// Make new sample.
 	s := &Sample{
 		Location: make([]*Location, len(src.Location)),
 		Value:    make([]int64, len(src.Value)),
@@ -177,52 +188,98 @@ func (pm *profileMerger) mapSample(src *Sample) *Sample {
 		s.NumLabel[k] = vv
 		s.NumUnit[k] = uu
 	}
-	// Check memoization table. Must be done on the remapped location to
-	// account for the remapped mapping. Add current values to the
-	// existing sample.
-	k := s.key()
-	if ss, ok := pm.samples[k]; ok {
-		for i, v := range src.Value {
-			ss.Value[i] += v
-		}
-		return ss
-	}
 	copy(s.Value, src.Value)
 	pm.samples[k] = s
 	pm.p.Sample = append(pm.p.Sample, s)
 	return s
 }
 
-// key generates sampleKey to be used as a key for maps.
-func (sample *Sample) key() sampleKey {
-	ids := make([]string, len(sample.Location))
-	for i, l := range sample.Location {
-		ids[i] = strconv.FormatUint(l.ID, 16)
+func (pm *profileMerger) sampleKey(sample *Sample) sampleKey {
+	// Accumulate contents into a string.
+	var buf strings.Builder
+	buf.Grow(64) // Heuristic to avoid extra allocs
+
+	// encode a number
+	putNumber := func(v uint64) {
+		var num [binary.MaxVarintLen64]byte
+		n := binary.PutUvarint(num[:], v)
+		buf.Write(num[:n])
+	}
+
+	// encode a string prefixed with its length.
+	putDelimitedString := func(s string) {
+		putNumber(uint64(len(s)))
+		buf.WriteString(s)
+	}
+
+	for _, l := range sample.Location {
+		// Get the location in the merged profile, which may have a different ID.
+		if loc := pm.mapLocation(l); loc != nil {
+			putNumber(loc.ID)
+		}
 	}
+	putNumber(0) // Delimiter
 
-	labels := make([]string, 0, len(sample.Label))
-	for k, v := range sample.Label {
-		labels = append(labels, fmt.Sprintf("%q%q", k, v))
+	for _, l := range sortedKeys1(sample.Label) {
+		putDelimitedString(l)
+		values := sample.Label[l]
+		putNumber(uint64(len(values)))
+		for _, v := range values {
+			putDelimitedString(v)
+		}
 	}
-	sort.Strings(labels)
 
-	numlabels := make([]string, 0, len(sample.NumLabel))
-	for k, v := range sample.NumLabel {
-		numlabels = append(numlabels, fmt.Sprintf("%q%x%x", k, v, sample.NumUnit[k]))
+	for _, l := range sortedKeys2(sample.NumLabel) {
+		putDelimitedString(l)
+		values := sample.NumLabel[l]
+		putNumber(uint64(len(values)))
+		for _, v := range values {
+			putNumber(uint64(v))
+		}
+		units := sample.NumUnit[l]
+		putNumber(uint64(len(units)))
+		for _, v := range units {
+			putDelimitedString(v)
+		}
 	}
-	sort.Strings(numlabels)
 
-	return sampleKey{
-		strings.Join(ids, "|"),
-		strings.Join(labels, ""),
-		strings.Join(numlabels, ""),
+	return sampleKey(buf.String())
+}
+
+type sampleKey string
+
+// sortedKeys1 returns the sorted keys found in a string->[]string map.
+//
+// Note: this is currently non-generic since github pprof runs golint,
+// which does not support generics. When that issue is fixed, it can
+// be merged with sortedKeys2 and made into a generic function.
+func sortedKeys1(m map[string][]string) []string {
+	if len(m) == 0 {
+		return nil
 	}
+	keys := make([]string, 0, len(m))
+	for k := range m {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys)
+	return keys
 }
 
-type sampleKey struct {
-	locations string
-	labels    string
-	numlabels string
+// sortedKeys2 returns the sorted keys found in a string->[]int64 map.
+//
+// Note: this is currently non-generic since github pprof runs golint,
+// which does not support generics. When that issue is fixed, it can
+// be merged with sortedKeys1 and made into a generic function.
+func sortedKeys2(m map[string][]int64) []string {
+	if len(m) == 0 {
+		return nil
+	}
+	keys := make([]string, 0, len(m))
+	for k := range m {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys)
+	return keys
 }
 
 func (pm *profileMerger) mapLocation(src *Location) *Location {
@@ -230,7 +287,7 @@ func (pm *profileMerger) mapLocation(src *Location) *Location {
 		return nil
 	}
 
-	if l, ok := pm.locationsByID[src.ID]; ok {
+	if l := pm.locationsByID.get(src.ID); l != nil {
 		return l
 	}
 
@@ -249,10 +306,10 @@ func (pm *profileMerger) mapLocation(src *Location) *Location {
 	// account for the remapped mapping ID.
 	k := l.key()
 	if ll, ok := pm.locations[k]; ok {
-		pm.locationsByID[src.ID] = ll
+		pm.locationsByID.set(src.ID, ll)
 		return ll
 	}
-	pm.locationsByID[src.ID] = l
+	pm.locationsByID.set(src.ID, l)
 	pm.locations[k] = l
 	pm.p.Location = append(pm.p.Location, l)
 	return l
@@ -303,16 +360,17 @@ func (pm *profileMerger) mapMapping(src *Mapping) mapInfo {
 		return mi
 	}
 	m := &Mapping{
-		ID:              uint64(len(pm.p.Mapping) + 1),
-		Start:           src.Start,
-		Limit:           src.Limit,
-		Offset:          src.Offset,
-		File:            src.File,
-		BuildID:         src.BuildID,
-		HasFunctions:    src.HasFunctions,
-		HasFilenames:    src.HasFilenames,
-		HasLineNumbers:  src.HasLineNumbers,
-		HasInlineFrames: src.HasInlineFrames,
+		ID:                     uint64(len(pm.p.Mapping) + 1),
+		Start:                  src.Start,
+		Limit:                  src.Limit,
+		Offset:                 src.Offset,
+		File:                   src.File,
+		KernelRelocationSymbol: src.KernelRelocationSymbol,
+		BuildID:                src.BuildID,
+		HasFunctions:           src.HasFunctions,
+		HasFilenames:           src.HasFilenames,
+		HasLineNumbers:         src.HasLineNumbers,
+		HasInlineFrames:        src.HasInlineFrames,
 	}
 	pm.p.Mapping = append(pm.p.Mapping, m)
 
@@ -479,3 +537,131 @@ func (p *Profile) compatible(pb *Profile) error {
 func equalValueType(st1, st2 *ValueType) bool {
 	return st1.Type == st2.Type && st1.Unit == st2.Unit
 }
+
+// locationIDMap is like a map[uint64]*Location, but provides efficiency for
+// ids that are densely numbered, which is often the case.
+type locationIDMap struct {
+	dense  []*Location          // indexed by id for id < len(dense)
+	sparse map[uint64]*Location // indexed by id for id >= len(dense)
+}
+
+func makeLocationIDMap(n int) locationIDMap {
+	return locationIDMap{
+		dense:  make([]*Location, n),
+		sparse: map[uint64]*Location{},
+	}
+}
+
+func (lm locationIDMap) get(id uint64) *Location {
+	if id < uint64(len(lm.dense)) {
+		return lm.dense[int(id)]
+	}
+	return lm.sparse[id]
+}
+
+func (lm locationIDMap) set(id uint64, loc *Location) {
+	if id < uint64(len(lm.dense)) {
+		lm.dense[id] = loc
+		return
+	}
+	lm.sparse[id] = loc
+}
+
+// CompatibilizeSampleTypes makes profiles compatible to be compared/merged. It
+// keeps sample types that appear in all profiles only and drops/reorders the
+// sample types as necessary.
+//
+// In the case of sample types order is not the same for given profiles the
+// order is derived from the first profile.
+//
+// Profiles are modified in-place.
+//
+// It returns an error if the sample type's intersection is empty.
+func CompatibilizeSampleTypes(ps []*Profile) error {
+	sTypes := commonSampleTypes(ps)
+	if len(sTypes) == 0 {
+		return fmt.Errorf("profiles have empty common sample type list")
+	}
+	for _, p := range ps {
+		if err := compatibilizeSampleTypes(p, sTypes); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// commonSampleTypes returns sample types that appear in all profiles in the
+// order how they ordered in the first profile.
+func commonSampleTypes(ps []*Profile) []string {
+	if len(ps) == 0 {
+		return nil
+	}
+	sTypes := map[string]int{}
+	for _, p := range ps {
+		for _, st := range p.SampleType {
+			sTypes[st.Type]++
+		}
+	}
+	var res []string
+	for _, st := range ps[0].SampleType {
+		if sTypes[st.Type] == len(ps) {
+			res = append(res, st.Type)
+		}
+	}
+	return res
+}
+
+// compatibilizeSampleTypes drops sample types that are not present in sTypes
+// list and reorder them if needed.
+//
+// It sets DefaultSampleType to sType[0] if it is not in sType list.
+//
+// It assumes that all sample types from the sTypes list are present in the
+// given profile otherwise it returns an error.
+func compatibilizeSampleTypes(p *Profile, sTypes []string) error {
+	if len(sTypes) == 0 {
+		return fmt.Errorf("sample type list is empty")
+	}
+	defaultSampleType := sTypes[0]
+	reMap, needToModify := make([]int, len(sTypes)), false
+	for i, st := range sTypes {
+		if st == p.DefaultSampleType {
+			defaultSampleType = p.DefaultSampleType
+		}
+		idx := searchValueType(p.SampleType, st)
+		if idx < 0 {
+			return fmt.Errorf("%q sample type is not found in profile", st)
+		}
+		reMap[i] = idx
+		if idx != i {
+			needToModify = true
+		}
+	}
+	if !needToModify && len(sTypes) == len(p.SampleType) {
+		return nil
+	}
+	p.DefaultSampleType = defaultSampleType
+	oldSampleTypes := p.SampleType
+	p.SampleType = make([]*ValueType, len(sTypes))
+	for i, idx := range reMap {
+		p.SampleType[i] = oldSampleTypes[idx]
+	}
+	values := make([]int64, len(sTypes))
+	for _, s := range p.Sample {
+		for i, idx := range reMap {
+			values[i] = s.Value[idx]
+		}
+		s.Value = s.Value[:len(values)]
+		copy(s.Value, values)
+	}
+	return nil
+}
+
+func searchValueType(vts []*ValueType, s string) int {
+	for i, vt := range vts {
+		if vt.Type == s {
+			return i
+		}
+	}
+	return -1
+}
diff --git a/vendor/github.com/google/pprof/profile/profile.go b/vendor/github.com/google/pprof/profile/profile.go
index 2590c8ddb42e25ede9dd54e54a80f0286cc7105e..60ef7e92687f56e20c9b0541cf555f0c3caadc15 100644
--- a/vendor/github.com/google/pprof/profile/profile.go
+++ b/vendor/github.com/google/pprof/profile/profile.go
@@ -21,7 +21,6 @@ import (
 	"compress/gzip"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"path/filepath"
 	"regexp"
@@ -73,9 +72,23 @@ type ValueType struct {
 type Sample struct {
 	Location []*Location
 	Value    []int64
-	Label    map[string][]string
+	// Label is a per-label-key map to values for string labels.
+	//
+	// In general, having multiple values for the given label key is strongly
+	// discouraged - see docs for the sample label field in profile.proto.  The
+	// main reason this unlikely state is tracked here is to make the
+	// decoding->encoding roundtrip not lossy. But we expect that the value
+	// slices present in this map are always of length 1.
+	Label map[string][]string
+	// NumLabel is a per-label-key map to values for numeric labels. See a note
+	// above on handling multiple values for a label.
 	NumLabel map[string][]int64
-	NumUnit  map[string][]string
+	// NumUnit is a per-label-key map to the unit names of corresponding numeric
+	// label values. The unit info may be missing even if the label is in
+	// NumLabel, see the docs in profile.proto for details. When the value is
+	// slice is present and not nil, its length must be equal to the length of
+	// the corresponding value slice in NumLabel.
+	NumUnit map[string][]string
 
 	locationIDX []uint64
 	labelX      []label
@@ -106,6 +119,15 @@ type Mapping struct {
 
 	fileX    int64
 	buildIDX int64
+
+	// Name of the kernel relocation symbol ("_text" or "_stext"), extracted from File.
+	// For linux kernel mappings generated by some tools, correct symbolization depends
+	// on knowing which of the two possible relocation symbols was used for `Start`.
+	// This is given to us as a suffix in `File` (e.g. "[kernel.kallsyms]_stext").
+	//
+	// Note, this public field is not persisted in the proto. For the purposes of
+	// copying / merging / hashing profiles, it is considered subsumed by `File`.
+	KernelRelocationSymbol string
 }
 
 // Location corresponds to Profile.Location
@@ -144,7 +166,7 @@ type Function struct {
 // may be a gzip-compressed encoded protobuf or one of many legacy
 // profile formats which may be unsupported in the future.
 func Parse(r io.Reader) (*Profile, error) {
-	data, err := ioutil.ReadAll(r)
+	data, err := io.ReadAll(r)
 	if err != nil {
 		return nil, err
 	}
@@ -159,7 +181,7 @@ func ParseData(data []byte) (*Profile, error) {
 	if len(data) >= 2 && data[0] == 0x1f && data[1] == 0x8b {
 		gz, err := gzip.NewReader(bytes.NewBuffer(data))
 		if err == nil {
-			data, err = ioutil.ReadAll(gz)
+			data, err = io.ReadAll(gz)
 		}
 		if err != nil {
 			return nil, fmt.Errorf("decompressing profile: %v", err)
@@ -707,6 +729,35 @@ func (s *Sample) HasLabel(key, value string) bool {
 	return false
 }
 
+// SetNumLabel sets the specified key to the specified value for all samples in the
+// profile. "unit" is a slice that describes the units that each corresponding member
+// of "values" is measured in (e.g. bytes or seconds).  If there is no relevant
+// unit for a given value, that member of "unit" should be the empty string.
+// "unit" must either have the same length as "value", or be nil.
+func (p *Profile) SetNumLabel(key string, value []int64, unit []string) {
+	for _, sample := range p.Sample {
+		if sample.NumLabel == nil {
+			sample.NumLabel = map[string][]int64{key: value}
+		} else {
+			sample.NumLabel[key] = value
+		}
+		if sample.NumUnit == nil {
+			sample.NumUnit = map[string][]string{key: unit}
+		} else {
+			sample.NumUnit[key] = unit
+		}
+	}
+}
+
+// RemoveNumLabel removes all numerical labels associated with the specified key for all
+// samples in the profile.
+func (p *Profile) RemoveNumLabel(key string) {
+	for _, sample := range p.Sample {
+		delete(sample.NumLabel, key)
+		delete(sample.NumUnit, key)
+	}
+}
+
 // DiffBaseSample returns true if a sample belongs to the diff base and false
 // otherwise.
 func (s *Sample) DiffBaseSample() bool {
diff --git a/vendor/github.com/google/pprof/profile/proto.go b/vendor/github.com/google/pprof/profile/proto.go
index 539ad3ab33f97b11ceb9cf12abda43c0c17388c8..a15696ba16f24448c3e81163c6d41b277eec104e 100644
--- a/vendor/github.com/google/pprof/profile/proto.go
+++ b/vendor/github.com/google/pprof/profile/proto.go
@@ -39,11 +39,12 @@ import (
 )
 
 type buffer struct {
-	field int // field tag
-	typ   int // proto wire type code for field
-	u64   uint64
-	data  []byte
-	tmp   [16]byte
+	field    int // field tag
+	typ      int // proto wire type code for field
+	u64      uint64
+	data     []byte
+	tmp      [16]byte
+	tmpLines []Line // temporary storage used while decoding "repeated Line".
 }
 
 type decoder func(*buffer, message) error
@@ -286,7 +287,6 @@ func decodeInt64s(b *buffer, x *[]int64) error {
 	if b.typ == 2 {
 		// Packed encoding
 		data := b.data
-		tmp := make([]int64, 0, len(data)) // Maximally sized
 		for len(data) > 0 {
 			var u uint64
 			var err error
@@ -294,9 +294,8 @@ func decodeInt64s(b *buffer, x *[]int64) error {
 			if u, data, err = decodeVarint(data); err != nil {
 				return err
 			}
-			tmp = append(tmp, int64(u))
+			*x = append(*x, int64(u))
 		}
-		*x = append(*x, tmp...)
 		return nil
 	}
 	var i int64
@@ -319,7 +318,6 @@ func decodeUint64s(b *buffer, x *[]uint64) error {
 	if b.typ == 2 {
 		data := b.data
 		// Packed encoding
-		tmp := make([]uint64, 0, len(data)) // Maximally sized
 		for len(data) > 0 {
 			var u uint64
 			var err error
@@ -327,9 +325,8 @@ func decodeUint64s(b *buffer, x *[]uint64) error {
 			if u, data, err = decodeVarint(data); err != nil {
 				return err
 			}
-			tmp = append(tmp, u)
+			*x = append(*x, u)
 		}
-		*x = append(*x, tmp...)
 		return nil
 	}
 	var u uint64
diff --git a/vendor/github.com/google/pprof/profile/prune.go b/vendor/github.com/google/pprof/profile/prune.go
index 02d21a8184639e07f7de8b6735f0a2d1a1b598eb..b2f9fd54660d9a55758dc2cd8d05fb27a36fcbc4 100644
--- a/vendor/github.com/google/pprof/profile/prune.go
+++ b/vendor/github.com/google/pprof/profile/prune.go
@@ -62,15 +62,31 @@ func (p *Profile) Prune(dropRx, keepRx *regexp.Regexp) {
 	prune := make(map[uint64]bool)
 	pruneBeneath := make(map[uint64]bool)
 
+	// simplifyFunc can be expensive, so cache results.
+	// Note that the same function name can be encountered many times due
+	// different lines and addresses in the same function.
+	pruneCache := map[string]bool{} // Map from function to whether or not to prune
+	pruneFromHere := func(s string) bool {
+		if r, ok := pruneCache[s]; ok {
+			return r
+		}
+		funcName := simplifyFunc(s)
+		if dropRx.MatchString(funcName) {
+			if keepRx == nil || !keepRx.MatchString(funcName) {
+				pruneCache[s] = true
+				return true
+			}
+		}
+		pruneCache[s] = false
+		return false
+	}
+
 	for _, loc := range p.Location {
 		var i int
 		for i = len(loc.Line) - 1; i >= 0; i-- {
 			if fn := loc.Line[i].Function; fn != nil && fn.Name != "" {
-				funcName := simplifyFunc(fn.Name)
-				if dropRx.MatchString(funcName) {
-					if keepRx == nil || !keepRx.MatchString(funcName) {
-						break
-					}
+				if pruneFromHere(fn.Name) {
+					break
 				}
 			}
 		}
diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go
index 48d23f9191c2da0b2f5813be0a19ffd7cb695d02..be01dec979dc2c3ac5c89460aa3d7ebf92fe9dbf 100644
--- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go
+++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go
@@ -32,6 +32,9 @@ func BuildGenerateCommand() command.Command {
 			{Name: "template-data", KeyPath: "CustomTemplateData",
 				UsageArgument: "template-data-file",
 				Usage:         "If specified, generate will use the contents of the file passed as data to be rendered in the test file template"},
+			{Name: "tags", KeyPath: "Tags",
+				UsageArgument: "build-tags",
+				Usage:         "If specified, generate will create a test file that uses the given build tags (i.e. `--tags e2e,!unit` will add `//go:build e2e,!unit`)"},
 		},
 		&conf,
 		types.GinkgoFlagSections{},
@@ -59,6 +62,7 @@ You can also pass a <filename> of the form "file.go" and generate will emit "fil
 }
 
 type specData struct {
+	BuildTags         string
 	Package           string
 	Subject           string
 	PackageImportPath string
@@ -93,6 +97,7 @@ func generateTestFileForSubject(subject string, conf GeneratorsConfig) {
 	}
 
 	data := specData{
+		BuildTags:         getBuildTags(conf.Tags),
 		Package:           determinePackageName(packageName, conf.Internal),
 		Subject:           formattedName,
 		PackageImportPath: getPackageImportPath(),
diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go
index c3470adbfd1c6f2829a505e82f0aa5f8a1e55716..4dab07d03692b7f97ad98ceff8f1760aa351a9c6 100644
--- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go
+++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go
@@ -1,6 +1,7 @@
 package generators
 
-var specText = `package {{.Package}}
+var specText = `{{.BuildTags}}
+package {{.Package}}
 
 import (
 	{{.GinkgoImport}}
@@ -14,7 +15,8 @@ var _ = {{.GinkgoPackage}}Describe("{{.Subject}}", func() {
 })
 `
 
-var agoutiSpecText = `package {{.Package}}
+var agoutiSpecText = `{{.BuildTags}}
+package {{.Package}}
 
 import (
 	{{.GinkgoImport}}
diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go
index 3046a4487aaa6cb566d9e16532e6387d4cea55a3..28c7aa6f434eb8c678651c7aa722cda77b3dcd06 100644
--- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go
+++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go
@@ -1,6 +1,7 @@
 package generators
 
 import (
+	"fmt"
 	"go/build"
 	"os"
 	"path/filepath"
@@ -14,6 +15,7 @@ type GeneratorsConfig struct {
 	Agouti, NoDot, Internal bool
 	CustomTemplate          string
 	CustomTemplateData      string
+	Tags                    string
 }
 
 func getPackageAndFormattedName() (string, string, string) {
@@ -62,3 +64,13 @@ func determinePackageName(name string, internal bool) string {
 
 	return name + "_test"
 }
+
+// getBuildTags returns the resultant string to be added.
+// If the input string is not empty, then returns a `//go:build {}` string,
+// otherwise returns an empty string.
+func getBuildTags(tags string) string {
+	if tags != "" {
+		return fmt.Sprintf("//go:build %s\n", tags)
+	}
+	return ""
+}
diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go
index 64dcb1b78c6e97413a7a860c68f9b79a1bc29780..df99875be2041ad18fe417a57c643dd239330eeb 100644
--- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go
+++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go
@@ -7,6 +7,7 @@ import (
 	"path"
 	"path/filepath"
 	"regexp"
+	"runtime"
 	"strings"
 
 	"github.com/onsi/ginkgo/v2/types"
@@ -192,7 +193,7 @@ func precompiledTestSuite(path string) (TestSuite, error) {
 		return TestSuite{}, errors.New("this is not a .test binary")
 	}
 
-	if filepath.Ext(path) == ".test" && info.Mode()&0111 == 0 {
+	if filepath.Ext(path) == ".test" && runtime.GOOS != "windows" && info.Mode()&0111 == 0 {
 		return TestSuite{}, errors.New("this is not executable")
 	}
 
@@ -225,7 +226,7 @@ func suitesInDir(dir string, recurse bool) TestSuites {
 	files, _ := os.ReadDir(dir)
 	re := regexp.MustCompile(`^[^._].*_test\.go$`)
 	for _, file := range files {
-		if !file.IsDir() && re.Match([]byte(file.Name())) {
+		if !file.IsDir() && re.MatchString(file.Name()) {
 			suite := TestSuite{
 				Path:        relPath(dir),
 				PackageName: packageNameForSuite(dir),
@@ -240,7 +241,7 @@ func suitesInDir(dir string, recurse bool) TestSuites {
 	if recurse {
 		re = regexp.MustCompile(`^[._]`)
 		for _, file := range files {
-			if file.IsDir() && !re.Match([]byte(file.Name())) {
+			if file.IsDir() && !re.MatchString(file.Name()) {
 				suites = append(suites, suitesInDir(dir+"/"+file.Name(), recurse)...)
 			}
 		}
@@ -271,7 +272,7 @@ func filesHaveGinkgoSuite(dir string, files []os.DirEntry) bool {
 	reGinkgo := regexp.MustCompile(`package ginkgo|\/ginkgo"|\/ginkgo\/v2"|\/ginkgo\/v2/dsl/`)
 
 	for _, file := range files {
-		if !file.IsDir() && reTestFile.Match([]byte(file.Name())) {
+		if !file.IsDir() && reTestFile.MatchString(file.Name()) {
 			contents, _ := os.ReadFile(dir + "/" + file.Name())
 			if reGinkgo.Match(contents) {
 				return true
diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go
index 0b9b19fe740a30e42687cff65f00c70028112a23..958daccbfa8c15f6775aa8a3123534a8782f33e2 100644
--- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go
+++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go
@@ -244,9 +244,7 @@ func labelFromCallExpr(ce *ast.CallExpr) []string {
 			}
 			if id.Name == "Label" {
 				ls := extractLabels(expr)
-				for _, label := range ls {
-					labels = append(labels, label)
-				}
+				labels = append(labels, ls...)
 			}
 		}
 	}
diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go
index f5ddff30fc764c19f455660ee1d37879d0323219..a34d94354d9b2b65103bdb4679f3cb3d02d5f902 100644
--- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go
+++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go
@@ -78,7 +78,7 @@ func (d Dependencies) resolveAndAdd(deps []string, depth int) {
 		if err != nil {
 			continue
 		}
-		if !pkg.Goroot && (!ginkgoAndGomegaFilter.Match([]byte(pkg.Dir)) || ginkgoIntegrationTestFilter.Match([]byte(pkg.Dir))) {
+		if !pkg.Goroot && (!ginkgoAndGomegaFilter.MatchString(pkg.Dir) || ginkgoIntegrationTestFilter.MatchString(pkg.Dir)) {
 			d.addDepIfNotPresent(pkg.Dir, depth)
 		}
 	}
diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go
index e9f7ec0cb3b0efbbefc36ed9b1b56869d703c121..17d052bdc3c1ec218b9de8f06abafee3bb73612b 100644
--- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go
+++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go
@@ -79,7 +79,7 @@ func (p *PackageHash) computeHashes() (codeHash string, codeModifiedTime time.Ti
 			continue
 		}
 
-		if goTestRegExp.Match([]byte(info.Name())) {
+		if goTestRegExp.MatchString(info.Name()) {
 			testHash += p.hashForFileInfo(info)
 			if info.ModTime().After(testModifiedTime) {
 				testModifiedTime = info.ModTime()
@@ -87,7 +87,7 @@ func (p *PackageHash) computeHashes() (codeHash string, codeModifiedTime time.Ti
 			continue
 		}
 
-		if p.watchRegExp.Match([]byte(info.Name())) {
+		if p.watchRegExp.MatchString(info.Name()) {
 			codeHash += p.hashForFileInfo(info)
 			if info.ModTime().After(codeModifiedTime) {
 				codeModifiedTime = info.ModTime()
diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go
index 7f96c450fe9432f2b398df727b63815263c346ec..5d3e8db994bbc525b2936f018da7701a82e1063a 100644
--- a/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go
+++ b/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go
@@ -4,16 +4,21 @@ import (
 	"encoding/json"
 	"fmt"
 	"os"
+	"path"
 
 	"github.com/onsi/ginkgo/v2/types"
 )
 
-//GenerateJSONReport produces a JSON-formatted report at the passed in destination
+// GenerateJSONReport produces a JSON-formatted report at the passed in destination
 func GenerateJSONReport(report types.Report, destination string) error {
+	if err := os.MkdirAll(path.Dir(destination), 0770); err != nil {
+		return err
+	}
 	f, err := os.Create(destination)
 	if err != nil {
 		return err
 	}
+	defer f.Close()
 	enc := json.NewEncoder(f)
 	enc.SetIndent("", "  ")
 	err = enc.Encode([]types.Report{
@@ -22,11 +27,11 @@ func GenerateJSONReport(report types.Report, destination string) error {
 	if err != nil {
 		return err
 	}
-	return f.Close()
+	return nil
 }
 
-//MergeJSONReports produces a single JSON-formatted report at the passed in destination by merging the JSON-formatted reports provided in sources
-//It skips over reports that fail to decode but reports on them via the returned messages []string
+// MergeJSONReports produces a single JSON-formatted report at the passed in destination by merging the JSON-formatted reports provided in sources
+// It skips over reports that fail to decode but reports on them via the returned messages []string
 func MergeAndCleanupJSONReports(sources []string, destination string) ([]string, error) {
 	messages := []string{}
 	allReports := []types.Report{}
@@ -46,15 +51,19 @@ func MergeAndCleanupJSONReports(sources []string, destination string) ([]string,
 		allReports = append(allReports, reports...)
 	}
 
+	if err := os.MkdirAll(path.Dir(destination), 0770); err != nil {
+		return messages, err
+	}
 	f, err := os.Create(destination)
 	if err != nil {
 		return messages, err
 	}
+	defer f.Close()
 	enc := json.NewEncoder(f)
 	enc.SetIndent("", "  ")
 	err = enc.Encode(allReports)
 	if err != nil {
 		return messages, err
 	}
-	return messages, f.Close()
+	return messages, nil
 }
diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go
index 592d7f614b5ff9deea59802dcfec105c0f68c7bc..816042208c08338732d192c7077278efaa387d96 100644
--- a/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go
+++ b/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go
@@ -14,6 +14,7 @@ import (
 	"encoding/xml"
 	"fmt"
 	"os"
+	"path"
 	"strings"
 
 	"github.com/onsi/ginkgo/v2/config"
@@ -285,6 +286,9 @@ func GenerateJUnitReportWithConfig(report types.Report, dst string, config Junit
 		TestSuites: []JUnitTestSuite{suite},
 	}
 
+	if err := os.MkdirAll(path.Dir(dst), 0770); err != nil {
+		return err
+	}
 	f, err := os.Create(dst)
 	if err != nil {
 		return err
@@ -322,6 +326,9 @@ func MergeAndCleanupJUnitReports(sources []string, dst string) ([]string, error)
 		mergedReport.TestSuites = append(mergedReport.TestSuites, report.TestSuites...)
 	}
 
+	if err := os.MkdirAll(path.Dir(dst), 0770); err != nil {
+		return messages, err
+	}
 	f, err := os.Create(dst)
 	if err != nil {
 		return messages, err
diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go
index c1863496dc71fa53a3c6c36243e1c38b6a318428..e990ad82e138486f8b88389eeec197a1543ad2ed 100644
--- a/vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go
+++ b/vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go
@@ -11,6 +11,7 @@ package reporters
 import (
 	"fmt"
 	"os"
+	"path"
 	"strings"
 
 	"github.com/onsi/ginkgo/v2/types"
@@ -27,6 +28,9 @@ func tcEscape(s string) string {
 }
 
 func GenerateTeamcityReport(report types.Report, dst string) error {
+	if err := os.MkdirAll(path.Dir(dst), 0770); err != nil {
+		return err
+	}
 	f, err := os.Create(dst)
 	if err != nil {
 		return err
diff --git a/vendor/github.com/onsi/ginkgo/v2/types/code_location.go b/vendor/github.com/onsi/ginkgo/v2/types/code_location.go
index 9cd5768170a44d2306491737b05b42926bf10aed..57e87517e0769c6c08bd046e4edda94c8822276c 100644
--- a/vendor/github.com/onsi/ginkgo/v2/types/code_location.go
+++ b/vendor/github.com/onsi/ginkgo/v2/types/code_location.go
@@ -149,7 +149,7 @@ func PruneStack(fullStackTrace string, skip int) string {
 		re := regexp.MustCompile(`\/ginkgo\/|\/pkg\/testing\/|\/pkg\/runtime\/`)
 		for i := 0; i < len(stack)/2; i++ {
 			// We filter out based on the source code file name.
-			if !re.Match([]byte(stack[i*2+1])) {
+			if !re.MatchString(stack[i*2+1]) {
 				prunedStack = append(prunedStack, stack[i*2])
 				prunedStack = append(prunedStack, stack[i*2+1])
 			}
diff --git a/vendor/github.com/onsi/ginkgo/v2/types/config.go b/vendor/github.com/onsi/ginkgo/v2/types/config.go
index 1014c7b49f4c4708e321104b1b17d8fd52dabe27..c88fc85a75fbec2df9d3afb567cf2d058633d7e6 100644
--- a/vendor/github.com/onsi/ginkgo/v2/types/config.go
+++ b/vendor/github.com/onsi/ginkgo/v2/types/config.go
@@ -27,6 +27,7 @@ type SuiteConfig struct {
 	FailOnPending         bool
 	FailFast              bool
 	FlakeAttempts         int
+	MustPassRepeatedly    int
 	DryRun                bool
 	PollProgressAfter     time.Duration
 	PollProgressInterval  time.Duration
diff --git a/vendor/github.com/onsi/ginkgo/v2/types/errors.go b/vendor/github.com/onsi/ginkgo/v2/types/errors.go
index 1e0dbfd9df81d3849d24a4f9d71e446301010f60..4fbdc3e9b1d385fd915085089d3832eab99bb9dd 100644
--- a/vendor/github.com/onsi/ginkgo/v2/types/errors.go
+++ b/vendor/github.com/onsi/ginkgo/v2/types/errors.go
@@ -453,8 +453,8 @@ func (g ginkgoErrors) InvalidEntryDescription(cl CodeLocation) error {
 
 func (g ginkgoErrors) MissingParametersForTableFunction(cl CodeLocation) error {
 	return GinkgoError{
-		Heading:      fmt.Sprintf("No parameters have been passed to the Table Function"),
-		Message:      fmt.Sprintf("The Table Function expected at least 1 parameter"),
+		Heading:      "No parameters have been passed to the Table Function",
+		Message:      "The Table Function expected at least 1 parameter",
 		CodeLocation: cl,
 		DocLink:      "table-specs",
 	}
diff --git a/vendor/github.com/onsi/ginkgo/v2/types/types.go b/vendor/github.com/onsi/ginkgo/v2/types/types.go
index d048a8adab1961c0cc140298a9028182e6fee77a..aae69b04c9d7862ddbdd687b1e93a49393ec4ea8 100644
--- a/vendor/github.com/onsi/ginkgo/v2/types/types.go
+++ b/vendor/github.com/onsi/ginkgo/v2/types/types.go
@@ -97,9 +97,7 @@ func (report Report) Add(other Report) Report {
 	report.RunTime = report.EndTime.Sub(report.StartTime)
 
 	reports := make(SpecReports, len(report.SpecReports)+len(other.SpecReports))
-	for i := range report.SpecReports {
-		reports[i] = report.SpecReports[i]
-	}
+	copy(reports, report.SpecReports)
 	offset := len(report.SpecReports)
 	for i := range other.SpecReports {
 		reports[i+offset] = other.SpecReports[i]
diff --git a/vendor/github.com/onsi/ginkgo/v2/types/version.go b/vendor/github.com/onsi/ginkgo/v2/types/version.go
index 43066341e1c5ac9b943b124b7aaa5df61c603f26..a4a1524b4fd01cfcf417efee6d74b3be392fede9 100644
--- a/vendor/github.com/onsi/ginkgo/v2/types/version.go
+++ b/vendor/github.com/onsi/ginkgo/v2/types/version.go
@@ -1,3 +1,3 @@
 package types
 
-const VERSION = "2.9.5"
+const VERSION = "2.13.2"
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 889c2e3487489c0853a2047f096e68e87972f831..eb3ddf1907c023a9cdeb61d0d79f093f8f2c5594 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1,5 +1,5 @@
-# 0xacab.org/leap/bitmask-core v0.0.0-20240705122443-e372171b7c36
-## explicit; go 1.20
+# 0xacab.org/leap/bitmask-core v0.0.0-20240830161617-121267e4c4eb
+## explicit; go 1.22.2
 0xacab.org/leap/bitmask-core/models
 0xacab.org/leap/bitmask-core/pkg/bootstrap
 0xacab.org/leap/bitmask-core/pkg/client
@@ -11,6 +11,9 @@
 ## explicit; go 1.22
 0xacab.org/leap/obfsvpn/client
 0xacab.org/leap/obfsvpn/obfsvpn
+# 0xacab.org/leap/tunnel-telemetry v0.0.0-20240830081933-7328bb50078b
+## explicit; go 1.21.5
+0xacab.org/leap/tunnel-telemetry/pkg/geolocate
 # filippo.io/edwards25519 v1.1.0
 ## explicit; go 1.20
 filippo.io/edwards25519
@@ -96,7 +99,7 @@ github.com/cretz/bine/tor
 github.com/cretz/bine/torutil
 github.com/cretz/bine/torutil/ed25519
 github.com/cretz/bine/torutil/ed25519/internal/edwards25519
-# github.com/davecgh/go-spew v1.1.1
+# github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
 ## explicit
 github.com/davecgh/go-spew/spew
 # github.com/dchest/siphash v1.2.3
@@ -157,8 +160,8 @@ github.com/go-openapi/validate
 # github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572
 ## explicit; go 1.13
 github.com/go-task/slim-sprig
-# github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38
-## explicit; go 1.14
+# github.com/google/pprof v0.0.0-20231212022811-ec68065c825e
+## explicit; go 1.19
 github.com/google/pprof/profile
 # github.com/google/uuid v1.6.0
 ## explicit
@@ -217,7 +220,7 @@ github.com/natefinch/npipe
 # github.com/oklog/ulid v1.3.1
 ## explicit
 github.com/oklog/ulid
-# github.com/onsi/ginkgo/v2 v2.9.5
+# github.com/onsi/ginkgo/v2 v2.13.2
 ## explicit; go 1.18
 github.com/onsi/ginkgo/v2/config
 github.com/onsi/ginkgo/v2/formatter
@@ -338,7 +341,7 @@ github.com/pion/webrtc/v3/pkg/rtcerr
 # github.com/pkg/errors v0.9.1
 ## explicit
 github.com/pkg/errors
-# github.com/pmezard/go-difflib v1.0.0
+# github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
 ## explicit
 github.com/pmezard/go-difflib/difflib
 # github.com/prometheus-community/pro-bing v0.4.0