diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 98ff9ec12fa..0906f3914da 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -37,3 +37,6 @@ PHILOSOPHY.md @jaekwon @moul CONTRIBUTING.md @jaekwon @moul LICENSE.md @jaekwon @moul .github/CODEOWNERS @jaekwon @moul + +# Documentation. +docs/* @gnolang/devrels \ No newline at end of file diff --git a/.github/workflows/docusaurus.yml b/.github/workflows/docusaurus.yml new file mode 100644 index 00000000000..5cdaa2455c0 --- /dev/null +++ b/.github/workflows/docusaurus.yml @@ -0,0 +1,29 @@ +name: docusaurus build +on: + pull_request: + paths: + - "docs/**" + push: + branches: [ "master" ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install Docusaurus Dependencies + run: | + cd misc/docusaurus + yarn install + + - name: Build Docusaurus Docs + run: | + cd misc/docusaurus + yarn build diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index f69a27d15b6..b72b9b24dc1 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -32,8 +32,7 @@ jobs: with: go-version: ${{ matrix.goversion }} - run: go install -v ./gnovm/cmd/gno - - run: go run ./gnovm/cmd/gno precompile --verbose ./examples - - run: go run ./gnovm/cmd/gno build --verbose ./examples + - run: go run ./gnovm/cmd/gno precompile --verbose --gobuild ./examples test: strategy: fail-fast: false diff --git a/.github/workflows/misc.yml b/.github/workflows/misc.yml index f72a97c95b3..64be9b4e829 100644 --- a/.github/workflows/misc.yml +++ b/.github/workflows/misc.yml @@ -71,9 +71,20 @@ jobs: - name: Check go.mods run: | + set -e + # Find all go.mod files gomods=$(find . -type f -name go.mod) - sums="$(sha256sum ${gomods})" - for path in $(dirname $(gomods)); do - env -C $path go mod tidy -v || exit 1 + + # Calculate sums for all go.mod files + sums=$(sha256sum $gomods) + + # Iterate over each go.mod file + for modfile in $gomods; do + dir=$(dirname "$modfile") + + # Run go mod tidy in the directory + (cd "$dir" && go mod tidy -v) || exit 1 done + + # Verify the sums echo "$sums" | sha256sum -c diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1739d50f034..5c2bb8f9996 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,7 +52,7 @@ Likewise, if you have an idea on how to improve this guide, go for it as well. ### Environment -The gno repository is primarily based on Golang (Go), and Gnolang (Gno). +The gno repository is primarily based on Golang (Go) and Gnolang (Gno). The primary tech stack for working on the repository: diff --git a/PHILOSOPHY.md b/PHILOSOPHY.md index c55d479f741..bde27a48ef7 100644 --- a/PHILOSOPHY.md +++ b/PHILOSOPHY.md @@ -5,7 +5,7 @@ * Readability is paramount - beautiful is better than fast. * Minimal code - keep total footprint small. * Minimal dependencies - all dependencies must get audited, and become part of the repo. - * Modular dependencies - whereever reasonable, make components modular. + * Modular dependencies - wherever reasonable, make components modular. * Finished - software projects that don't become finished are projects that are forever vulnerable. One of the primary goals of the Gno language and related works is to become finished within a reasonable timeframe. diff --git a/README.md b/README.md index 71c53b86f19..6a59c4716b4 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Gno is an interpreted and fully-deterministic implementation of the Go programming language, designed to build succinct and composable smart contracts. The first blockchain to use it is Gno.land, a -[Proof of Contribution](./docs/proof-of-contribution.md)-based chain, backed by +[Proof of Contribution](./docs/explanation/proof-of-contribution.md)-based chain, backed by a variation of the [Tendermint](https://docs.tendermint.com/v0.34/introduction/what-is-tendermint.html) consensus engine. diff --git a/contribs/gnokeykc/go.mod b/contribs/gnokeykc/go.mod index fca27e7455a..4f832dc3359 100644 --- a/contribs/gnokeykc/go.mod +++ b/contribs/gnokeykc/go.mod @@ -11,13 +11,14 @@ require ( require ( github.com/alessio/shellescape v1.4.1 // indirect - github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c // indirect - github.com/btcsuite/btcd/btcutil v1.0.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/btcsuite/btcd/btcutil v1.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect github.com/cockroachdb/apd v1.1.0 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/dgraph-io/badger/v3 v3.2103.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dustin/go-humanize v1.0.0 // indirect @@ -34,21 +35,21 @@ require ( github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.12.3 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/linxGnu/grocksdb v1.8.4 // indirect + github.com/linxGnu/grocksdb v1.8.5 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/peterbourgon/ff/v3 v3.4.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rs/cors v1.10.1 // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect - go.etcd.io/bbolt v1.3.7 // indirect + go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.22.5 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.15.0 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect ) diff --git a/contribs/gnokeykc/go.sum b/contribs/gnokeykc/go.sum index 9ab29663ae6..21b2d9a6f9b 100644 --- a/contribs/gnokeykc/go.sum +++ b/contribs/gnokeykc/go.sum @@ -7,16 +7,27 @@ github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVK github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c h1:lnAMg3ra/Gw4AkRMxrxYs8nrprWsHowg8H9zaYsJOo4= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd/btcutil v1.0.0 h1:dB36qRTOucIh6NUe40UCieOS+axPhP6VNyRtYkTUKKk= +github.com/btcsuite/btcd v0.23.0 h1:V2/ZgjfDFIygAX3ZapeigkVBoVUtOJKSwrhZdlpSvaA= +github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= @@ -36,6 +47,12 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2 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/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/dgraph-io/badger/v3 v3.2103.4 h1:WE1B07YNTTJTtG9xjBcSW2wn0RJLyiV99h959RKZqM4= github.com/dgraph-io/badger/v3 v3.2103.4/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= @@ -48,8 +65,9 @@ github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR4 github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gnolang/goleveldb v0.0.9 h1:Q7rGko9oXMKtQA+Apeeed5a3sjba/mcDhzJGoTVLCKE= github.com/gnolang/goleveldb v0.0.9/go.mod h1:Dz6p9bmpy/FBESTgduiThZt5mToVDipcHGzj/zUOo8E= github.com/gnolang/overflow v0.0.0-20170615021017-4d914c927216 h1:GKvsK3oLWG9B1GL7WP/VqwM6C92j5tIvB844oggL9Lk= @@ -65,6 +83,12 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -74,6 +98,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -85,6 +111,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jaekwon/testify v1.6.1 h1:4AtAJcR9GzXN5W4DdY7ie74iCPiJV1JJUJL90t2ZUyw= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= @@ -99,17 +126,23 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/linxGnu/grocksdb v1.8.4 h1:ZMsBpPpJNtRLHiKKp0mI7gW+NT4s7UgfD5xHxx1jVRo= -github.com/linxGnu/grocksdb v1.8.4/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.5 h1:Okfk5B1h0ikCYdDM7Tc5yJUS8LTwAmMBq5IPWTmOLPs= +github.com/linxGnu/grocksdb v1.8.5/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 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.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 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 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -136,7 +169,9 @@ github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -145,8 +180,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms= github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= @@ -158,8 +193,8 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -168,6 +203,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -176,6 +212,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= @@ -192,15 +230,22 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -221,6 +266,12 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= @@ -232,6 +283,9 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/docs/assets/explanation/packages/pkg-1.gno b/docs/assets/explanation/packages/pkg-1.gno new file mode 100644 index 00000000000..e68d506612a --- /dev/null +++ b/docs/assets/explanation/packages/pkg-1.gno @@ -0,0 +1,6 @@ +func TotalSupply() uint64 +func BalanceOf(account std.Address) uint64 +func Transfer(to std.Address, amount uint64) +func Approve(spender std.Address, amount uint64) +func TransferFrom(from, to std.Address, amount uint64) +func Allowance(owner, spender std.Address) uint64 diff --git a/docs/assets/explanation/packages/pkg-2.gno b/docs/assets/explanation/packages/pkg-2.gno new file mode 100644 index 00000000000..0054cc95e3d --- /dev/null +++ b/docs/assets/explanation/packages/pkg-2.gno @@ -0,0 +1,11 @@ +// functions that work similarly to those of grc20 +func BalanceOf(owner std.Address) (uint64, error) +func Approve(approved std.Address, tid TokenID) error +func TransferFrom(from, to std.Address, tid TokenID) error + +// functions unique to grc721 +func OwnerOf(tid TokenID) (std.Address, error) +func SafeTransferFrom(from, to std.Address, tid TokenID) error +func SetApprovalForAll(operator std.Address, approved bool) error +func GetApproved(tid TokenID) (std.Address, error) +func IsApprovedForAll(owner, operator std.Address) bool diff --git a/docs/assets/explanation/packages/pkg-3.gno b/docs/assets/explanation/packages/pkg-3.gno new file mode 100644 index 00000000000..f1ba5609d6b --- /dev/null +++ b/docs/assets/explanation/packages/pkg-3.gno @@ -0,0 +1,12 @@ +func TestAddress(name string) std.Address { + if len(name) > std.RawAddressSize { + panic("address name cannot be greater than std.AddressSize bytes") + } + addr := std.RawAddress{} + // TODO: use strings.RepeatString or similar. + // NOTE: I miss python's "".Join(). + blanks := "____________________" + copy(addr[:], []byte(blanks)) + copy(addr[:], []byte(name)) + return std.Address(std.EncodeBech32("g", addr)) +} diff --git a/docs/assets/explanation/packages/pkg-4.gno b/docs/assets/explanation/packages/pkg-4.gno new file mode 100644 index 00000000000..edd34b5cc5d --- /dev/null +++ b/docs/assets/explanation/packages/pkg-4.gno @@ -0,0 +1,8 @@ +admin := users.AddressOrName("g1tntwtvzrkt2gex69f0pttan0fp05zmeg5yykv8") +test2 := users.AddressOrName(testutils.TestAddress("test2")) +recv := users.AddressOrName(testutils.TestAddress("recv")) +normal := users.AddressOrName(testutils.TestAddress("normal")) +owner := users.AddressOrName(testutils.TestAddress("owner")) +spender := users.AddressOrName(testutils.TestAddress("spender")) +recv2 := users.AddressOrName(testutils.TestAddress("recv2")) +mibu := users.AddressOrName(testutils.TestAddress("mint_burn")) diff --git a/docs/assets/getting-started/browsing-gno-source-code/gnoweb-avl.png b/docs/assets/getting-started/browsing-gno-source-code/gnoweb-avl.png new file mode 100644 index 00000000000..3754ccfe88e Binary files /dev/null and b/docs/assets/getting-started/browsing-gno-source-code/gnoweb-avl.png differ diff --git a/docs/assets/getting-started/browsing-gno-source-code/gnoweb-boards-source.png b/docs/assets/getting-started/browsing-gno-source-code/gnoweb-boards-source.png new file mode 100644 index 00000000000..65e0f880bc9 Binary files /dev/null and b/docs/assets/getting-started/browsing-gno-source-code/gnoweb-boards-source.png differ diff --git a/docs/assets/getting-started/browsing-gno-source-code/gnoweb-boards.png b/docs/assets/getting-started/browsing-gno-source-code/gnoweb-boards.png new file mode 100644 index 00000000000..dca226c3ec9 Binary files /dev/null and b/docs/assets/getting-started/browsing-gno-source-code/gnoweb-boards.png differ diff --git a/docs/assets/getting-started/browsing-gno-source-code/gnoweb.png b/docs/assets/getting-started/browsing-gno-source-code/gnoweb.png new file mode 100644 index 00000000000..3ba9035889d Binary files /dev/null and b/docs/assets/getting-started/browsing-gno-source-code/gnoweb.png differ diff --git a/docs/assets/getting-started/creating-a-key-pair/gnokey-add-mnemonic.gif b/docs/assets/getting-started/creating-a-key-pair/gnokey-add-mnemonic.gif new file mode 100644 index 00000000000..641acc9f825 Binary files /dev/null and b/docs/assets/getting-started/creating-a-key-pair/gnokey-add-mnemonic.gif differ diff --git a/docs/assets/getting-started/creating-a-key-pair/gnokey-add-random.gif b/docs/assets/getting-started/creating-a-key-pair/gnokey-add-random.gif new file mode 100644 index 00000000000..dba61a6b287 Binary files /dev/null and b/docs/assets/getting-started/creating-a-key-pair/gnokey-add-random.gif differ diff --git a/docs/assets/getting-started/creating-a-key-pair/gnokey-export.gif b/docs/assets/getting-started/creating-a-key-pair/gnokey-export.gif new file mode 100644 index 00000000000..e56938866f9 Binary files /dev/null and b/docs/assets/getting-started/creating-a-key-pair/gnokey-export.gif differ diff --git a/docs/assets/getting-started/creating-a-key-pair/gnokey-generate.gif b/docs/assets/getting-started/creating-a-key-pair/gnokey-generate.gif new file mode 100644 index 00000000000..ce371487c6c Binary files /dev/null and b/docs/assets/getting-started/creating-a-key-pair/gnokey-generate.gif differ diff --git a/docs/assets/getting-started/creating-a-key-pair/gnokey-import.gif b/docs/assets/getting-started/creating-a-key-pair/gnokey-import.gif new file mode 100644 index 00000000000..8ec80519372 Binary files /dev/null and b/docs/assets/getting-started/creating-a-key-pair/gnokey-import.gif differ diff --git a/docs/assets/getting-started/creating-a-key-pair/gnokey-list.gif b/docs/assets/getting-started/creating-a-key-pair/gnokey-list.gif new file mode 100644 index 00000000000..ad050da585c Binary files /dev/null and b/docs/assets/getting-started/creating-a-key-pair/gnokey-list.gif differ diff --git a/docs/assets/getting-started/local-setup/gno-help.gif b/docs/assets/getting-started/local-setup/gno-help.gif new file mode 100644 index 00000000000..ebd7d4cfcb0 Binary files /dev/null and b/docs/assets/getting-started/local-setup/gno-help.gif differ diff --git a/docs/assets/getting-started/local-setup/gnokey-help.gif b/docs/assets/getting-started/local-setup/gnokey-help.gif new file mode 100644 index 00000000000..d96d2424679 Binary files /dev/null and b/docs/assets/getting-started/local-setup/gnokey-help.gif differ diff --git a/docs/assets/getting-started/local-setup/make-build-gnoland.gif b/docs/assets/getting-started/local-setup/make-build-gnoland.gif new file mode 100644 index 00000000000..fe12670be2c Binary files /dev/null and b/docs/assets/getting-started/local-setup/make-build-gnoland.gif differ diff --git a/docs/assets/getting-started/local-setup/make-build-gnovm.gif b/docs/assets/getting-started/local-setup/make-build-gnovm.gif new file mode 100644 index 00000000000..54f133796d6 Binary files /dev/null and b/docs/assets/getting-started/local-setup/make-build-gnovm.gif differ diff --git a/docs/assets/getting-started/setting-up-a-local-chain/gnoland-start.gif b/docs/assets/getting-started/setting-up-a-local-chain/gnoland-start.gif new file mode 100644 index 00000000000..4da21bc863b Binary files /dev/null and b/docs/assets/getting-started/setting-up-a-local-chain/gnoland-start.gif differ diff --git a/docs/assets/getting-started/setting-up-funds/faucet-page.png b/docs/assets/getting-started/setting-up-funds/faucet-page.png new file mode 100644 index 00000000000..f1a5420659f Binary files /dev/null and b/docs/assets/getting-started/setting-up-funds/faucet-page.png differ diff --git a/docs/assets/getting-started/setting-up-funds/gnofaucet-serve.gif b/docs/assets/getting-started/setting-up-funds/gnofaucet-serve.gif new file mode 100644 index 00000000000..79f46e7563c Binary files /dev/null and b/docs/assets/getting-started/setting-up-funds/gnofaucet-serve.gif differ diff --git a/docs/assets/getting-started/setting-up-funds/gnokey-query.gif b/docs/assets/getting-started/setting-up-funds/gnokey-query.gif new file mode 100644 index 00000000000..9f58c638624 Binary files /dev/null and b/docs/assets/getting-started/setting-up-funds/gnokey-query.gif differ diff --git a/docs/assets/getting-started/setting-up-funds/gnoland-start.gif b/docs/assets/getting-started/setting-up-funds/gnoland-start.gif new file mode 100644 index 00000000000..3c323c40410 Binary files /dev/null and b/docs/assets/getting-started/setting-up-funds/gnoland-start.gif differ diff --git a/docs/assets/getting-started/setting-up-funds/gnoweb.gif b/docs/assets/getting-started/setting-up-funds/gnoweb.gif new file mode 100644 index 00000000000..ce4202dcca4 Binary files /dev/null and b/docs/assets/getting-started/setting-up-funds/gnoweb.gif differ diff --git a/docs/assets/how-to-guides/creating-grc20/mytoken-1.gno b/docs/assets/how-to-guides/creating-grc20/mytoken-1.gno new file mode 100644 index 00000000000..5500f019886 --- /dev/null +++ b/docs/assets/how-to-guides/creating-grc20/mytoken-1.gno @@ -0,0 +1,21 @@ +package mytoken + +import ( + "std" + + "gno.land/p/demo/grc/grc20" +) + +var ( + mytoken *grc20.AdminToken + admin std.Address = "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj" // set admin account +) + +// init is a constructor function that runs only once (at time of deployment) +func init() { + // provision the token's name, symbol and number of decimals + mytoken = grc20.NewAdminToken("Mytoken", "MTKN", 4) + + // set the total supply + mytoken.Mint(admin, 1000000*10000) // @administrator (supply = 1 million) +} diff --git a/docs/assets/how-to-guides/creating-grc20/mytoken-2.gno b/docs/assets/how-to-guides/creating-grc20/mytoken-2.gno new file mode 100644 index 00000000000..25ff85c55ab --- /dev/null +++ b/docs/assets/how-to-guides/creating-grc20/mytoken-2.gno @@ -0,0 +1,83 @@ +func TotalSupply() uint64 { + return mytoken.TotalSupply() +} + +func BalanceOf(owner users.AddressOrName) uint64 { + balance, err := mytoken.BalanceOf(owner.Resolve()) + if err != nil { + panic(err) + } + return balance +} + +func Allowance(owner, spender users.AddressOrName) uint64 { + allowance, err := mytoken.Allowance(owner.Resolve(), spender.Resolve()) + if err != nil { + panic(err) + } + return allowance +} + +func Transfer(to users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + err := mytoken.Transfer(caller, to.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func Approve(spender users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + err := mytoken.Approve(caller, spender.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func TransferFrom(from, to users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + err := mytoken.TransferFrom(caller, from.Resolve(), to.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func Mint(address users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := mytoken.Mint(address.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func Burn(address users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := mytoken.Burn(address.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func Render(path string) string { + parts := strings.Split(path, "/") + c := len(parts) + + switch { + case path == "": + return mytoken.RenderHome() + case c == 2 && parts[0] == "balance": + owner := users.AddressOrName(parts[1]) + balance, _ := mytoken.BalanceOf(owner.Resolve()) + return ufmt.Sprintf("%d\n", balance) + default: + return "404\n" + } +} + +func assertIsAdmin(address std.Address) { + if address != admin { + panic("restricted access") + } +} diff --git a/docs/assets/how-to-guides/creating-grc721/mynonfungibletoken-1.gno b/docs/assets/how-to-guides/creating-grc721/mynonfungibletoken-1.gno new file mode 100644 index 00000000000..14e25bd7264 --- /dev/null +++ b/docs/assets/how-to-guides/creating-grc721/mynonfungibletoken-1.gno @@ -0,0 +1,17 @@ +package mynonfungibletoken + +import ( + "std" + + "gno.land/p/demo/grc/grc721" +) + +var ( + admin std.Address = "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj" // set admin account + // provision the token's name and symbol + mynonfungibletoken = grc721.NewBasicNFT("mynonfungibletoken", "MNFT") +) + +func init() { + mintNNFT(admin, 10) // @administrator (supply = 10) +} diff --git a/docs/assets/how-to-guides/creating-grc721/mynonfungibletoken-2.gno b/docs/assets/how-to-guides/creating-grc721/mynonfungibletoken-2.gno new file mode 100644 index 00000000000..8092596ae0a --- /dev/null +++ b/docs/assets/how-to-guides/creating-grc721/mynonfungibletoken-2.gno @@ -0,0 +1,102 @@ +func mintNNFT(owner std.Address, n uint64) { + count := my.TokenCount() + for i := count; i < count+n; i++ { + tid := grc721.TokenID(ufmt.Sprintf("%d", i)) + mynonfungibletoken.Mint(owner, tid) + } +} + +// Getters + +func BalanceOf(user users.AddressOrName) uint64 { + balance, err := mynonfungibletoken.BalanceOf(user.Resolve()) + if err != nil { + panic(err) + } + + return balance +} + +func OwnerOf(tid grc721.TokenID) std.Address { + owner, err := mynonfungibletoken.OwnerOf(tid) + if err != nil { + panic(err) + } + + return owner +} + +func IsApprovedForAll(owner, user users.AddressOrName) bool { + return mynonfungibletoken.IsApprovedForAll(owner.Resolve(), user.Resolve()) +} + +func GetApproved(tid grc721.TokenID) std.Address { + addr, err := mynonfungibletoken.GetApproved(tid) + if err != nil { + panic(err) + } + + return addr +} + +// Setters + +func Approve(user users.AddressOrName, tid grc721.TokenID) { + err := mynonfungibletoken.Approve(user.Resolve(), tid) + if err != nil { + panic(err) + } +} + +func SetApprovalForAll(user users.AddressOrName, approved bool) { + err := mynonfungibletoken.SetApprovalForAll(user.Resolve(), approved) + if err != nil { + panic(err) + } +} + +func TransferFrom(from, to users.AddressOrName, tid grc721.TokenID) { + err := mynonfungibletoken.TransferFrom(from.Resolve(), to.Resolve(), tid) + if err != nil { + panic(err) + } +} + +// Admin + +func Mint(to users.AddressOrName, tid grc721.TokenID) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := mynonfungibletoken.Mint(to.Resolve(), tid) + if err != nil { + panic(err) + } +} + +func Burn(tid grc721.TokenID) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := mynonfungibletoken.Burn(tid) + if err != nil { + panic(err) + } +} + +// Render + +func Render(path string) string { + switch { + case path == "": + return mynonfungibletoken.RenderHome() + default: + return "404\n" + } +} + +// Util + +func assertIsAdmin(address std.Address) { + if address != admin { + panic("restricted access") + } +} diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-1.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-1.gno new file mode 100644 index 00000000000..1e1dee77a86 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-1.gno @@ -0,0 +1,39 @@ +func shouldEqual(t *testing.T, got interface{}, expected interface{}) { + t.Helper() + + if got != expected { + t.Errorf("expected %v(%T), got %v(%T)", expected, expected, got, got) + } +} + +func shouldErr(t *testing.T, err error) { + t.Helper() + if err == nil { + t.Errorf("expected an error, but got nil.") + } +} + +func shouldNoErr(t *testing.T, err error) { + t.Helper() + if err != nil { + t.Errorf("expected no error, but got err: %s.", err.Error()) + } +} + +func shouldPanic(t *testing.T, f func()) { + defer func() { + if r := recover(); r == nil { + t.Errorf("should have panic") + } + }() + f() +} + +func shouldNoPanic(t *testing.T, f func()) { + defer func() { + if r := recover(); r != nil { + t.Errorf("should not have panic") + } + }() + f() +} diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-10.sol b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-10.sol new file mode 100644 index 00000000000..8d7aff1794b --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-10.sol @@ -0,0 +1,29 @@ +/// End the auction and send the highest bid +/// to the beneficiary. +function auctionEnd() external { + // It is a good guideline to structure functions that interact + // with other contracts (i.e. they call functions or send Ether) + // into three phases: + // 1. checking conditions + // 2. performing actions (potentially changing conditions) + // 3. interacting with other contracts + // If these phases are mixed up, the other contract could call + // back into the current contract and modify the state or cause + // effects (ether payout) to be performed multiple times. + // If functions called internally include interaction with external + // contracts, they also have to be considered interaction with + // external contracts. + + // 1. Conditions + if (block.timestamp < auctionEndTime) + revert AuctionNotYetEnded(); + if (ended) + revert AuctionEndAlreadyCalled(); + + // 2. Effects + ended = true; + emit AuctionEnded(highestBidder, highestBid); + + // 3. Interaction + beneficiary.transfer(highestBid); +} \ No newline at end of file diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-11.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-11.gno new file mode 100644 index 00000000000..e48ebf919a0 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-11.gno @@ -0,0 +1,17 @@ +func AuctionEnd() { + if std.GetHeight() < auctionEndBlock { + panic("Auction hasn't ended") + } + + if ended { + panic("Auction has ended") + + } + ended = true + + // Send the highest bid to the recipient + banker := std.GetBanker(std.BankerTypeRealmSend) + pkgAddr := std.GetOrigPkgAddr() + + banker.SendCoins(pkgAddr, receiver, std.Coins{{"ugnot", int64(highestBid)}}) +} diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-12.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-12.gno new file mode 100644 index 00000000000..55817537298 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-12.gno @@ -0,0 +1,18 @@ +// AuctionEnd() Function Test +func TestAuctionEnd(t *testing.T) { + // Auction is ongoing + shouldPanic(t, AuctionEnd) + + // Auction ends + highestBid = 3 + std.TestSkipHeights(500) + shouldNoPanic(t, AuctionEnd) + shouldEqual(t, ended, true) + + banker := std.GetBanker(std.BankerTypeRealmSend) + shouldEqual(t, banker.GetCoins(receiver).String(), "3ugnot") + + // Auction has already ended + shouldPanic(t, AuctionEnd) + shouldEqual(t, ended, true) +} diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-13.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-13.gno new file mode 100644 index 00000000000..0e5f2d57de9 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-13.gno @@ -0,0 +1,74 @@ +// The whole test +func TestFull(t *testing.T) { + bidder01 := testutils.TestAddress("bidder01") // g1vf5kger9wgcrzh6lta047h6lta047h6lufftkw + bidder02 := testutils.TestAddress("bidder02") // g1vf5kger9wgcryh6lta047h6lta047h6lnhe2x2 + + // Variables test + { + shouldEqual(t, highestBidder, "") + shouldEqual(t, receiver, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") + shouldEqual(t, auctionEndBlock, 423) + shouldEqual(t, highestBid, 0) + shouldEqual(t, pendingReturns.Size(), 0) + shouldEqual(t, ended, false) + } + + // Send two or more types of coins + { + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 0}, {"test", 1}}, nil) + shouldPanic(t, Bid) + } + + // Send less than the highest bid + { + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 0}}, nil) + shouldPanic(t, Bid) + } + + // Send more than the highest bid + { + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldNoPanic(t, Bid) + + shouldEqual(t, pendingReturns.Size(), 0) + shouldEqual(t, highestBid, 1) + shouldEqual(t, highestBidder, "g1vf5kger9wgcrzh6lta047h6lta047h6lufftkw") + } + + // Other participants in the auction + { + + // Send less amount than the current highest bid (current: 1) + std.TestSetOrigCaller(bidder02) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldPanic(t, Bid) + + // Send more amount than the current highest bid (exceeded) + std.TestSetOrigCaller(bidder02) + std.TestSetOrigSend(std.Coins{{"ugnot", 2}}, nil) + shouldNoPanic(t, Bid) + + shouldEqual(t, highestBid, 2) + shouldEqual(t, highestBidder, "g1vf5kger9wgcryh6lta047h6lta047h6lnhe2x2") + + shouldEqual(t, pendingReturns.Size(), 1) // Return to the existing bidder + shouldEqual(t, pendingReturns.Has("g1vf5kger9wgcrzh6lta047h6lta047h6lufftkw"), true) + } + + // Auction ends + { + std.TestSkipHeights(150) + shouldPanic(t, AuctionEnd) + shouldEqual(t, ended, false) + + std.TestSkipHeights(301) + shouldNoPanic(t, AuctionEnd) + shouldEqual(t, ended, true) + + banker := std.GetBanker(std.BankerTypeRealmSend) + shouldEqual(t, banker.GetCoins(receiver).String(), "2ugnot") + } +} diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-2.sol b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-2.sol new file mode 100644 index 00000000000..0040c3ca75f --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-2.sol @@ -0,0 +1,47 @@ +// Parameters of the auction. Times are either +// absolute unix timestamps (seconds since 1970-01-01) +// or time periods in seconds. +address payable public beneficiary; +uint public auctionEndTime; + +// Current state of the auction. +address public highestBidder; +uint public highestBid; + +// Allowed withdrawals of previous bids +mapping(address => uint) pendingReturns; + +// Set to true at the end, disallows any change. +// By default initialized to `false`. +bool ended; + +// Events that will be emitted on changes. +event HighestBidIncreased(address bidder, uint amount); +event AuctionEnded(address winner, uint amount); + +// Errors that describe failures. + +// The triple-slash comments are so-called natspec +// comments. They will be shown when the user +// is asked to confirm a transaction or +// when an error is displayed. + +/// The auction has already ended. +error AuctionAlreadyEnded(); +/// There is already a higher or equal bid. +error BidNotHighEnough(uint highestBid); +/// The auction has not ended yet. +error AuctionNotYetEnded(); +/// The function auctionEnd has already been called. +error AuctionEndAlreadyCalled(); + +/// Create a simple auction with `biddingTime` +/// seconds bidding time on behalf of the +/// beneficiary address `beneficiaryAddress`. +constructor( + uint biddingTime, + address payable beneficiaryAddress +) { + beneficiary = beneficiaryAddress; + auctionEndTime = block.timestamp + biddingTime; +} \ No newline at end of file diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-3.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-3.gno new file mode 100644 index 00000000000..af8137b4044 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-3.gno @@ -0,0 +1,8 @@ +var ( + receiver = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") + auctionEndBlock = std.GetHeight() + uint(300) // in blocks + highestBidder std.Address + highestBid = uint(0) + pendingReturns avl.Tree + ended = false +) diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-4.sol b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-4.sol new file mode 100644 index 00000000000..0e3ab6d7e0d --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-4.sol @@ -0,0 +1,32 @@ +function bid() external payable { + // No arguments are necessary, all + // information is already part of + // the transaction. The keyword payable + // is required for the function to + // be able to receive Ether. + + // Revert the call if the bidding + // period is over. + if (block.timestamp > auctionEndTime) + revert AuctionAlreadyEnded(); + + // If the bid is not higher, send the + // money back (the revert statement + // will revert all changes in this + // function execution including + // it having received the money). + if (msg.value <= highestBid) + revert BidNotHighEnough(highestBid); + + if (highestBid != 0) { + // Sending back the money by simply using + // highestBidder.send(highestBid) is a security risk + // because it could execute an untrusted contract. + // It is always safer to let the recipients + // withdraw their money themselves. + pendingReturns[highestBidder] += highestBid; + } + highestBidder = msg.sender; + highestBid = msg.value; + emit HighestBidIncreased(msg.sender, msg.value); +} \ No newline at end of file diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-5.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-5.gno new file mode 100644 index 00000000000..43f0b43b397 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-5.gno @@ -0,0 +1,30 @@ +func Bid() { + if std.GetHeight() > auctionEndBlock { + panic("Exceeded auction end block") + } + + sentCoins := std.GetOrigSend() + if len(sentCoins) != 1 { + panic("Send only one type of coin") + } + + sentAmount := uint(sentCoins[0].Amount) + if sentAmount <= highestBid { + panic("Too few coins sent") + } + + // A new bid is higher than the current highest bid + if sentAmount > highestBid { + // If the highest bid is greater than 0, + if highestBid > 0 { + // Need to return the bid amount to the existing highest bidder + // Create an AVL tree and save + pendingReturns.Set(highestBidder.String(), highestBid) + } + + // Update the top bidder address + highestBidder = std.GetOrigCaller() + // Update the top bid amount + highestBid = sentAmount + } +} diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-6.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-6.gno new file mode 100644 index 00000000000..b544d0017c4 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-6.gno @@ -0,0 +1,41 @@ +// Bid Function Test - Send Coin +func TestBidCoins(t *testing.T) { + // Sending two types of coins + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 0}, {"test", 1}}, nil) + shouldPanic(t, Bid) + + // Sending lower amount than the current highest bid + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 0}}, nil) + shouldPanic(t, Bid) + + // Sending more amount than the current highest bid (exceeded) + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldNoPanic(t, Bid) +} + +// Bid Function Test - Bid by two or more people +func TestBidCoins(t *testing.T) { + // bidder01 bidding with 1 coin + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldNoPanic(t, Bid) + shouldEqual(t, highestBid, 1) + shouldEqual(t, highestBidder, bidder01) + shouldEqual(t, pendingReturns.Size(), 0) + + // bidder02 bidding with 1 coin + std.TestSetOrigCaller(bidder02) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldPanic(t, Bid) + + // bidder02 bidding with 2 coins + std.TestSetOrigCaller(bidder02) + std.TestSetOrigSend(std.Coins{{"ugnot", 2}}, nil) + shouldNoPanic(t, Bid) + shouldEqual(t, highestBid, 2) + shouldEqual(t, highestBidder, bidder02) + shouldEqual(t, pendingReturns.Size(), 1) +} diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-7.sol b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-7.sol new file mode 100644 index 00000000000..b28ecec1f52 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-7.sol @@ -0,0 +1,20 @@ +/// Withdraw a bid that was overbid. +function withdraw() external returns (bool) { + uint amount = pendingReturns[msg.sender]; + if (amount > 0) { + // It is important to set this to zero because the recipient + // can call this function again as part of the receiving call + // before `send` returns. + pendingReturns[msg.sender] = 0; + + // msg.sender is not of type `address payable` and must be + // explicitly converted using `payable(msg.sender)` in order + // use the member function `send()`. + if (!payable(msg.sender).send(amount)) { + // No need to call throw here, just reset the amount owing + pendingReturns[msg.sender] = amount; + return false; + } + } + return true; +} \ No newline at end of file diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-8.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-8.gno new file mode 100644 index 00000000000..7cb6bbd8d90 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-8.gno @@ -0,0 +1,15 @@ +func Withdraw() { + // Query the return amount to non-highest bidders + amount, _ := pendingReturns.Get(std.GetOrigCaller().String()) + + if amount > 0 { + // If there's an amount, reset the amount first, + pendingReturns.Set(std.GetOrigCaller().String(), 0) + + // Return the exceeded amount + banker := std.GetBanker(std.BankerTypeRealmSend) + pkgAddr := std.GetOrigPkgAddr() + + banker.SendCoins(pkgAddr, std.GetOrigCaller(), std.Coins{{"ugnot", amount.(int64)}}) + } +} diff --git a/docs/assets/how-to-guides/porting-solidity-to-gno/porting-9.gno b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-9.gno new file mode 100644 index 00000000000..fbc06792ce4 --- /dev/null +++ b/docs/assets/how-to-guides/porting-solidity-to-gno/porting-9.gno @@ -0,0 +1,17 @@ +// Withdraw Function Test +func TestWithdraw(t *testing.T) { + // If there's no participants for return + shouldEqual(t, pendingReturns.Size(), 0) + + // If there's participants for return (data generation + returnAddr := bidder01.String() + returnAmount := int64(3) + pendingReturns.Set(returnAddr, returnAmount) + shouldEqual(t, pendingReturns.Size(), 1) + shouldEqual(t, pendingReturns.Has(returnAddr), true) + + banker := std.GetBanker(std.BankerTypeRealmSend) + pkgAddr := std.GetOrigPkgAddr() + banker.SendCoins(pkgAddr, std.Address(returnAddr), std.Coins{{"ugnot", returnAmount}}) + shouldEqual(t, banker.GetCoins(std.Address(returnAddr)).String(), "3ugnot") +} diff --git a/docs/assets/how-to-guides/simple-contract/counter.gno b/docs/assets/how-to-guides/simple-contract/counter.gno new file mode 100644 index 00000000000..cf17b0c6fdc --- /dev/null +++ b/docs/assets/how-to-guides/simple-contract/counter.gno @@ -0,0 +1,17 @@ +package counter + +import "fmt" + +var count int + +func Increment() { + count++ +} + +func Decrement() { + count-- +} + +func Render(_ string) string { + return fmt.Sprintf("Count: %d", count) +} diff --git a/docs/assets/how-to-guides/simple-contract/init.gno b/docs/assets/how-to-guides/simple-contract/init.gno new file mode 100644 index 00000000000..823c394dfa0 --- /dev/null +++ b/docs/assets/how-to-guides/simple-contract/init.gno @@ -0,0 +1,11 @@ +package counter + +var count int + +// ... + +func init() { + count = 2 * 10 // arbitrary value +} + +// ... diff --git a/docs/assets/how-to-guides/simple-library/tapas.gno b/docs/assets/how-to-guides/simple-library/tapas.gno new file mode 100644 index 00000000000..7d8eb184898 --- /dev/null +++ b/docs/assets/how-to-guides/simple-library/tapas.gno @@ -0,0 +1,40 @@ +package tapas + +import ( + "gno.land/p/demo/rand" +) + +// List of tapas suggestions +var listOfTapas = []string{ + "Patatas Bravas", + "Gambas al Ajillo", + "Croquetas", + "Tortilla Española", + "Pimientos de Padrón", + "Jamon Serrano", + "Boquerones en Vinagre", + "Calamares a la Romana", + "Pulpo a la Gallega", + "Tostada con Tomate", + "Mejillones en Escabeche", + "Chorizo a la Sidra", + "Cazón en Adobo", + "Banderillas", + "Espárragos a la Parrilla", + "Huevos Rellenos", + "Tuna Empanada", + "Sardinas a la Plancha", +} + +// GetTapaSuggestion randomly selects and returns a tapa suggestion +func GetTapaSuggestion() string { + // Create a new instance of the random number generator. + // Notice that this is from an imported Gno library + generator := rand.New() + + // Generate a random index + randomIndex := generator.Intn(len(listOfTapas)) + + // Return the random suggestion + return listOfTapas[randomIndex] +} diff --git a/docs/assets/how-to-guides/testing-gno/counter-1.gno b/docs/assets/how-to-guides/testing-gno/counter-1.gno new file mode 100644 index 00000000000..1741f677480 --- /dev/null +++ b/docs/assets/how-to-guides/testing-gno/counter-1.gno @@ -0,0 +1,19 @@ +// counter-app/r/counter/counter.gno + +package counter + +import "fmt" + +var count int + +func Increment() { + count++ +} + +func Decrement() { + count-- +} + +func Render(_ string) string { + return fmt.Sprintf("Count: %d", count) +} diff --git a/docs/assets/how-to-guides/testing-gno/counter-2.gno b/docs/assets/how-to-guides/testing-gno/counter-2.gno new file mode 100644 index 00000000000..1298432bc03 --- /dev/null +++ b/docs/assets/how-to-guides/testing-gno/counter-2.gno @@ -0,0 +1,51 @@ +// counter-app/r/counter/counter_test.gno + +package counter + +import "testing" + +func TestCounter_Increment(t *testing.T) { + // Reset the value + count = 0 + + // Verify the initial value is 0 + if count != 0 { + t.Fatalf("initial value != 0") + } + + // Increment the value + Increment() + + // Verify the initial value is 1 + if count != 1 { + t.Fatalf("initial value != 1") + } +} + +func TestCounter_Decrement(t *testing.T) { + // Reset the value + count = 0 + + // Verify the initial value is 0 + if count != 0 { + t.Fatalf("initial value != 0") + } + + // Decrement the value + Decrement() + + // Verify the initial value is 1 + if count != -1 { + t.Fatalf("initial value != -1") + } +} + +func TestCounter_Render(t *testing.T) { + // Reset the value + count = 0 + + // Verify the Render output + if Render("") != "Count: 0" { + t.Fatalf("invalid Render value") + } +} diff --git a/docs/assets/how-to-guides/write-simple-dapp/poll-1.gno b/docs/assets/how-to-guides/write-simple-dapp/poll-1.gno new file mode 100644 index 00000000000..45ac073a387 --- /dev/null +++ b/docs/assets/how-to-guides/write-simple-dapp/poll-1.gno @@ -0,0 +1,69 @@ +package poll + +import ( + "std" + + "gno.land/p/demo/avl" +) + +// Main struct +type Poll struct { + title string + description string + deadline int64 // block height + voters *avl.Tree // addr -> yes / no (bool) +} + +// Getters +func (p Poll) Title() string { + return p.title +} + +func (p Poll) Description() string { + return p.description +} + +func (p Poll) Deadline() int64 { + return p.deadline +} + +func (p Poll) Voters() *avl.Tree { + return p.voters +} + +// Poll instance constructor +func NewPoll(title, description string, deadline int64) *Poll { + return &Poll{ + title: title, + description: description, + deadline: deadline, + voters: avl.NewTree(), + } +} + +// Vote Votes for a user +func (p *Poll) Vote(voter std.Address, vote bool) { + p.Voters().Set(string(voter), vote) +} + +// HasVoted vote: yes - true, no - false +func (p *Poll) HasVoted(address std.Address) (bool, bool) { + vote, exists := p.Voters().Get(string(address)) + if exists { + return true, vote.(bool) + } + return false, false +} + +// VoteCount Returns the number of yay & nay votes +func (p Poll) VoteCount() (int, int) { + var yay int + + p.Voters().Iterate("", "", func(key string, value interface{}) bool { + vote := value.(bool) + if vote == true { + yay = yay + 1 + } + }) + return yay, p.Voters().Size() - yay +} diff --git a/docs/assets/how-to-guides/write-simple-dapp/poll-2.gno b/docs/assets/how-to-guides/write-simple-dapp/poll-2.gno new file mode 100644 index 00000000000..7720c042f98 --- /dev/null +++ b/docs/assets/how-to-guides/write-simple-dapp/poll-2.gno @@ -0,0 +1,78 @@ +package poll + +import ( + "std" + + "gno.land/p/demo/avl" + "gno.land/p/demo/poll" + "gno.land/p/demo/ufmt" +) + +// state variables +var ( + polls *avl.Tree // id -> Poll + pollIDCounter int +) + +func init() { + polls = avl.NewTree() + pollIDCounter = 0 +} + +// NewPoll - Creates a new Poll instance +func NewPoll(title, description string, deadline int64) string { + // get block height + if deadline <= std.GetHeight() { + return "Error: Deadline has to be in the future." + } + + // convert int ID to string used in AVL tree + id := ufmt.Sprintf("%d", pollIDCounter) + p := poll.NewPoll(title, description, deadline) + + // add new poll in avl tree + polls.Set(id, p) + + // increment ID counter + pollIDCounter = pollIDCounter + 1 + + return ufmt.Sprintf("Successfully created poll #%s!", id) +} + +// Vote - vote for a specific Poll +// yes - true, no - false +func Vote(pollID int, vote bool) string { + // get txSender + txSender := std.GetOrigCaller() + + id := ufmt.Sprintf("%d", pollID) + // get specific Poll from AVL tree + pollRaw, exists := polls.Get(id) + + if !exists { + return "Error: Poll with specified doesn't exist." + } + + // cast Poll into proper format + poll, _ := pollRaw.(*poll.Poll) + + voted, _ := poll.HasVoted(txSender) + if voted { + return "Error: You've already voted!" + } + + if poll.Deadline() <= std.GetHeight() { + return "Error: Voting for this poll is closed." + } + + // record vote + poll.Vote(txSender, vote) + + // update Poll in tree + polls.Set(id, poll) + + if vote == true { + return ufmt.Sprintf("Successfully voted YAY for poll #%s!", id) + } + return ufmt.Sprintf("Successfully voted NAY for poll #%s!", id) +} diff --git a/docs/assets/how-to-guides/write-simple-dapp/poll-3.gno b/docs/assets/how-to-guides/write-simple-dapp/poll-3.gno new file mode 100644 index 00000000000..281c209c1ff --- /dev/null +++ b/docs/assets/how-to-guides/write-simple-dapp/poll-3.gno @@ -0,0 +1,74 @@ +func Render(path string) string { + var b bytes.Buffer + + b.WriteString("# Polls!\n\n") + + if polls.Size() == 0 { + b.WriteString("### No active polls currently!") + return b.String() + } + polls.Iterate("", "", func(key string, value interface{}) bool { + + // cast raw data from tree into Poll struct + p := value.(*poll.Poll) + ddl := p.Deadline() + + yay, nay := p.VoteCount() + yayPercent := 0 + nayPercent := 0 + + if yay+nay != 0 { + yayPercent = yay * 100 / (yay + nay) + nayPercent = nay * 100 / (yay + nay) + } + + b.WriteString( + ufmt.Sprintf( + "## Poll #%s: %s\n", + key, // poll ID + p.Title(), + ), + ) + + dropdown := "
\nPoll details
" + + b.WriteString(dropdown + "Description: " + p.Description()) + + b.WriteString( + ufmt.Sprintf("
Voting until block: %d
Current vote count: %d", + p.Deadline(), + p.Voters().Size()), + ) + + b.WriteString( + ufmt.Sprintf("
YAY votes: %d (%d%%)", yay, yayPercent), + ) + b.WriteString( + ufmt.Sprintf("
NAY votes: %d (%d%%)
", nay, nayPercent), + ) + + dropdown = "
\nVote details" + b.WriteString(dropdown) + + p.Voters().Iterate("", "", func(key string, value interface{}) bool { + + voter := key + vote := value.(bool) + + if vote == true { + b.WriteString( + ufmt.Sprintf("
%s voted YAY!", voter), + ) + } else { + b.WriteString( + ufmt.Sprintf("
%s voted NAY!", voter), + ) + } + return false + }) + + b.WriteString("
\n\n") + return false + }) + return b.String() +} diff --git a/docs/assets/reference/standard-library/std-1.gno b/docs/assets/reference/standard-library/std-1.gno new file mode 100644 index 00000000000..5f5a5d86b76 --- /dev/null +++ b/docs/assets/reference/standard-library/std-1.gno @@ -0,0 +1,14 @@ +// returns the list of coins owned by the address +GetCoins(addr Address) (dst Coins) + +// sends coins from one address to another +SendCoins(from, to Address, amt Coins) + +// returns the total supply of the coin +TotalCoin(denom string) int64 + +// issues coins to the address +IssueCoin(addr Address, denom string, amount int64) + +// burns coins from the address +RemoveCoin(addr Address, denom string, amount int64) diff --git a/docs/assets/reference/standard-library/std-2.gno b/docs/assets/reference/standard-library/std-2.gno new file mode 100644 index 00000000000..1ef9a0a1af1 --- /dev/null +++ b/docs/assets/reference/standard-library/std-2.gno @@ -0,0 +1,4 @@ +type Coin struct { + Denom string `json:"denom"` // the symbol of the coin + Amount int64 `json:"amount"` // the quantity of the coin +} diff --git a/docs/from-go-to-gno.md b/docs/explanation/from-go-to-gno.md similarity index 97% rename from docs/from-go-to-gno.md rename to docs/explanation/from-go-to-gno.md index fc7f28ab73a..41cccc6e971 100644 --- a/docs/from-go-to-gno.md +++ b/docs/explanation/from-go-to-gno.md @@ -1,3 +1,7 @@ +--- +id: from-go-to-gno +--- + # From Go to Gno ## Runtime comparison @@ -69,5 +73,5 @@ TODO ## See also -- [go-gno-compatibility.md](./go-gno-compatibility.md) +- [go-gno-compatibility.md](../reference/go-gno-compatibility.md) - ["go -> gno" presentation by Zack Scholl](https://github.com/gnolang/workshops/tree/main/presentations/2023-06-26--go-to-gno--schollz) diff --git a/docs/explanation/gno-language.md b/docs/explanation/gno-language.md new file mode 100644 index 00000000000..4e0605a6fac --- /dev/null +++ b/docs/explanation/gno-language.md @@ -0,0 +1,68 @@ +--- +id: gno-language +--- + +# The Gno Language + +Gno (Gnolang) is an interpretation of the widely-used Go (Golang) programming language for blockchain created by Cosmos +co-founder Jae Kwon in 2021 to mark a new era in smart contracting. Gno is almost identical to Go, so Go developers can +quickly start using it, with minimal effort. For example, Gno comes with blockchain-specific standard libraries, but any +code that doesn’t use blockchain-specific logic can run in Go with minimal processing. Libraries that could lead to +non-deterministic behaviour when executed by thousands of validators are not available in Gno, such as network access, +or determining system time. Otherwise, Gno loads and uses many standard libraries that power Go, so the experience +writing code feels very similar to Go's. + +Under the hood, the Gno code is parsed into an abstract syntax tree (AST) and the AST itself is used in the interpreter, +rather than bytecode as in many virtual machines such as Java, Python, or Wasm. The design aims to make reading & +understanding the source code of the GnoVM accessible to any Go programmer. The novel design of the intuitive GnoVM +interpreter allows Gno to freeze and resume the program by persisting and loading the memory state automatically. Gno is +deterministic, auto-persisted, and auto-Merkle-ized, allowing programs to be succinct, as the programmer doesn’t have to +serialize and deserialize objects to persist them into a database (unlike programming applications with the Cosmos SDK). + +## How Gno Differs from Go + +The composable nature of Go/Gno allows for type-checked interactions between contracts, making Gno.land safer and more +powerful, as well as operationally cheaper and faster. Smart contracts on Gno.land are light, simple, more focused, and +easily interoperable - they represent a network of interconnected contracts rather than siloed monoliths that limit +interactions with other contracts. + +## Gno Inherits Go’s Built-in Security Features + +Go supports secure programming through exported/non-exported fields, enabling a “least-authority” design. It is easy to +create objects and APIs that expose only what should be accessible to callers while hiding what should not be simply by +the capitalization of letters, thus allowing a succinct representation of secure logic that can be called by multiple +users. + +Another major advantage of Go is that the language comes with an ecosystem of great tooling, like the compiler and +third-party tools that statically analyze code. Gno inherits these advantages from Go directly to create a smart +contract programming language that provides embedding, composability, type-check safety, and garbage collection, helping +developers to write secure code relying on the compiler, parser, and interpreter to give warning alerts for common +mistakes. + +## Gno vs Solidity + +The most widely-adopted smart contract language today is Ethereum’s EVM-compatible Solidity. With bytecode built from +the ground up and Turing complete, Solidity opened up a world of possibilities for decentralized applications (dApps) +and there are currently more than 10 million contracts deployed on Ethereum. However, Solidity provides limited tooling +and its EVM has a stack limit and computational inefficiencies. + +Solidity is designed for one purpose only (writing smart contracts) and is bound by the limitations of the EVM. In +addition, developers have to learn several languages if they want to understand the whole stack or work across different +ecosystems. Gno aspires to exceed Solidity on multiple fronts (and other smart contract languages like CosmWasm or +Substrate) as every part of the stack is written in Go (or Gno!). It’s easy for developers to understand the entire system just +by studying a relatively small code base. + +## Gno Is Essential for the Wider Adoption of Web3 + +Gno makes imports as easy as they are in web2 with runtime-based imports for seamless dependency flow comprehension, and +support for complex structs, beyond primitive types. Gno is ultimately cost-effective as dependencies are loaded once, +enabling remote function calls as local, and providing automatic and independent per-realm state persistence. + +Using Gno, developers can rapidly accelerate application development and adopt a modular structure by reusing and +reassembling existing modules without building from scratch. They can embed one structure inside another in an intuitive +way while preserving localism, and the language specification is simple, successfully balancing practicality and +minimalism. + +Building on top of the excellent design of Go, the aim for Gno programming is to become the new gold standard for smart +contract development, not just in our ecosystem but blockchain as a whole. Combining Go's large success, together with +type safety and composability, Gno aims to kickstart a broader adoption of Web3 and its growth. diff --git a/docs/explanation/gno-modules.md b/docs/explanation/gno-modules.md new file mode 100644 index 00000000000..30f1de7b714 --- /dev/null +++ b/docs/explanation/gno-modules.md @@ -0,0 +1,42 @@ +--- +id: gno-modules +--- + +# Gno Modules + +The packages and realms containing `gno.mod` file can be reffered as Gno modules. `gno.mod` file is introduced to enhance local testing and handle dependency management while testing Gno packages/realms locally. At the time of writing, `gno.mod` is only used by the `gno` tool for local development, and it is disregarded on the Gno.land chain. + +## What is the gno.mod file for? + +`gno.mod` file is very useful for local testing and development. Its primary purposes include: + +- **Working outside of the monorepo**: by adding a `gno.mod` file to your directory, all gno tooling will recognise it and understand the implicit import path of your current directory (marked by the `module` directive in your `gno.mod` file). +- **Local dependency management**: the gno.mod file allows you to manage and download local dependencies effectively when developing Go Modules. +- **Configuration and metadata (WIP)**: while the gno.mod file is currently used for specifying dependencies, it's worth noting that in the future, it might also serve as a container for additional configuration and metadata related to Gno Modules. For more information, see: [issue #498](https://github.com/gnolang/gno/issues/498). + +## Gno Modules and Subdirectories + +It's important to note that Gno Modules do not include subdirectories. Each directory within your project is treated as an individual Gno Module, and each should contain its own gno.mod file, even if it's located within an existing Gno Module directory. + +## Available gno Commands + +The gno command-line tool provides several commands to work with the gno.mod file and manage dependencies in Gno Modules: + +- **gno mod init**: small helper to initialize a new `gno.mod` file. +- **gno mod download**: downloads the dependencies specified in the gno.mod file. This command fetches the required dependencies from chain and ensures they are available for local testing and development. +- **gno mod tidy**: removes any unused dependency and adds any required but not yet listed in the file -- most of the maintenance you'll usually need to do! + +## Sample `gno.mod` file + +``` +module gno.land/p/demo/sample + +require ( + gno.land/p/demo/avl v0.0.0-latest + gno.land/p/demo/testutils v0.0.0-latest +) + +``` + +- **`module gno.land/p/demo/sample`**: specifies the package/realm import path. +- **`require` Block**: lists the required dependencies. Here using the latest available versions of "gno.land/p/demo/avl" and "gno.land/p/demo/testutils". These dependencies should be specified with the version "v0.0.0-latest" since on-chain packages currently do not support versioning. diff --git a/docs/explanation/gno-test.md b/docs/explanation/gno-test.md new file mode 100644 index 00000000000..cd585298b9d --- /dev/null +++ b/docs/explanation/gno-test.md @@ -0,0 +1,82 @@ +--- +id: gno-test +--- + +# Gno Test + +There are two methods for testing a realm or package during the development phase: + +1. Calling the realm/package after deploying it on a local network (or testnet). +2. Using the `test` option within the [`gno`](./gno-tooling/cli/gno.md) CLI. + +While the first method is recommended for its accuracy and similarity to the actual deployment environment, it is more efficient to initially utilize the second method for composing test cases and then proceed to the first method if no errors are detected. + +This section will teach you how to use the second method. + +Writing test cases in Gnolang is similar to that of Golang, with general rules as the following: + +* Test file naming conventions must be adhered to (ex: `xxx_test.gno`). +* Test functions must start with `Test`. +* The `t *testing.T` argument must be included in each test function. + * The `testing` package must be imported. +* Tests must be run with the `gno test` command. + +Let's write a sample code and test it. + +```go +// contract.gno + +package demo + +func Hello(name string) string { + return "Hello " + name + "!" +} +``` + +This is a simple code that returns the string-typed argument in a specific format. + +Next, we'll write a test case that looks like the following: + +```go +// contract_test.gno + +package demo + +import "testing" + +func Test(t *testing.T) { + { + got := Hello("People") + expected := "Hello People!" + if got != expected { + t.Fatalf("expected %q, got %q.", expected, got) + } + } + { + got := Hello("") + expected := "Hello People!" + if got != expected { + t.Fatalf("expected %q, got %q.", expected, got) + } + } +} +``` + +Two conditions exist in the test case above. + +1. "Hello People!" should be returned when calling `Hello("People")`. +2. "Hello People!" should be returned when calling `Hello("")`. + +Upon examination of our realm code and the associated test results, the initial condition exhibited the desired behavior; however, an error was identified in the second condition. Despite the expected outcome of "Hello" being returned, the test case incorrectly specified that the expected output should be "Hello People!" instead. + +Replacing the second test case with the following will successfully fix the issue and allow the test to pass. + +```go + { + got := Hello("") + expected := "Hello !" + if expected != got { + t.Fatalf("expected %q, got %q.", expected, got) + } + } +``` diff --git a/docs/explanation/gno-tooling/cli/gno.md b/docs/explanation/gno-tooling/cli/gno.md new file mode 100644 index 00000000000..3141476f02a --- /dev/null +++ b/docs/explanation/gno-tooling/cli/gno.md @@ -0,0 +1,66 @@ +--- +id: gno-tooling-gno +--- + +# gno + +`gno` is a handy tool for developing and prototyping Gno packages and realms. You may use `gno` to use the GnoVM without an actual blockchain to build or test realms in a local environment. + +## Run `gno` Commands + +The following command will run `gno`. + +```bash +gno {SUB_COMMAND} +``` + +**Subcommands** + +| Name | Description | +| ------------ | ------------------------------------------ | +| `build` | Builds a gno package. | +| `test` | Tests a gno package. | +| `precompile` | Precompiles a `.gno` file to a `.go` file. | +| `repl` | Starts a GnoVM REPL. | + +### `build` + +#### **Options** + +| Name | Type | Description | +| --------- | ------- | ---------------------------------------------- | +| `verbose` | Boolean | Displays extended information. | +| go-binary | String | Go binary to use for building (default: `go`). | + +### `test` + +#### **Options** + +| Name | Type | Description | +| ------------ | ------------- | ------------------------------------------------------------------ | +| `verbose` | Boolean | Displays extended information. | +| `root-dir` | String | Clones location of github.com/gnolang/gno (gno tries to guess it). | +| `run` | String | Test name filtering pattern. | +| `timeout` | time.Duration | The maximum execution time in ns. | +| `precompile` | Boolean | Precompiles a `.gno` file to a `.go` file before testing. | + +### `precompile` + +#### **Options** + +| Name | Type | Description | +| ----------- | ------- | --------------------------------------------------------------- | +| `verbose` | Boolean | Displays extended information. | +| `skip-fmt` | Boolean | Skips the syntax checking of generated `.go` files. | +| `go-binary` | String | The go binary to use for building (default: `go`). | +| `go-binary` | String | The gofmt binary to use for syntax checking (default: `gofmt`). | +| `output` | String | The output directory (default: `.`). | + +### `repl` + +#### **Options** + +| Name | Type | Description | +| ---------- | ------- | ------------------------------------------------------------------ | +| `verbose` | Boolean | Displays extended information. | +| `root-dir` | String | Clones location of github.com/gnolang/gno (gno tries to guess it). | diff --git a/docs/explanation/gno-tooling/cli/gnofaucet.md b/docs/explanation/gno-tooling/cli/gnofaucet.md new file mode 100644 index 00000000000..3e70add89c0 --- /dev/null +++ b/docs/explanation/gno-tooling/cli/gnofaucet.md @@ -0,0 +1,61 @@ +--- +id: gno-tooling-gnofaucet +--- + +# gnofaucet + +`gnofaucet` is a server for distributing GNOT, the gas currency of Gnoland, to specific addresses in a local chain. +Interact with the `gnofaucet` from an address with an empty balance in your locally built testnet to fuel it with GNOT +to pay for transactions. + +## Run `gnofaucet` Commands + +Enable the faucet using the following command. + +```bash +gnofaucet serve +``` + +#### **Options** + +| Name | Type | Description | +|---------------------------|---------|--------------------------------------------------------------------------------------| +| `chain-id` | String | The id of the chain (required). | +| `gas-wanted` | Int64 | The maximum amount of gas to use for the transaction (default: `50000`) | +| `gas-fee` | String | The gas fee to pay for the transaction. | +| `memo` | String | Any descriptive text (default: `""`) | +| `test-to` | String | Test address (optional) | +| `send` | String | Coins to send (default: `"1000000ugnot"`). | +| `captcha-secret` | String | The secret key for the recaptcha. If empty, the captcha is disabled (default: `""`). | +| `is-behind-proxy` | Boolean | Uses X-Forwarded-For IP for throttling (default: `false`). | +| `insecure-password-stdin` | Boolean | INSECURE! Takes password from stdin (default: `false`). | + +## Example + +### Step 1. Create an account named `test1` with the test seed phrase below. + +```bash +gnokey add test1 --recover +``` + +> **Test Seed Phrase:** source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate +> oppose farm nothing bullet exhibit title speed wink action roast + +### **Step 2. Run `gnofaucet`** + +```bash +gnofaucet serve test1 --chain-id dev --send 500000000ugnot +``` + +### **Step 3. Receive GNOTs from the faucet** + +To receive funds through the `gnoweb` form GUI, you can request them on: +`http://localhost:8888/faucet` (given `http://localhost:8888/` is the location where `gnoweb` is serving pages). + +Alternatively, you can request funds from the faucet by directly invoking a CURL command: + +```bash +curl --location --request POST 'http://localhost:5050' \ +--header 'Content-Type: application/x-www-form-urlencoded' \ +--data-urlencode 'toaddr={address to receive}' +``` diff --git a/docs/explanation/gno-tooling/cli/gnokey.md b/docs/explanation/gno-tooling/cli/gnokey.md new file mode 100644 index 00000000000..dffee356509 --- /dev/null +++ b/docs/explanation/gno-tooling/cli/gnokey.md @@ -0,0 +1,290 @@ +--- +id: gno-tooling-gnokey +--- + +# gnokey + +Used for account & key management and general interactions with the Gnoland blockchain. + +## Generate a New Seed Phrase + +Generate a new seed phrase and add it to your keybase with the following command. + +```bash +gnokey generate +``` + +## Add a New Key + +You can add a new private key to the keybase using the following command. + +```bash +gnokey add {KEY_NAME} +``` + +#### **Options** + +| Name | Type | Description | +| ----------- | ---------- | -------------------------------------------------------------------------------------- | +| `account` | UInt | Account number for HD derivation. | +| `dryrun` | Boolean | Performs action, but doesn't add key to local keystore. | +| `index` | UInt | Address index number for HD derivation. | +| `ledger` | Boolean | Stores a local reference to a private key on a Ledger device. | +| `multisig` | String \[] | Constructs and stores a multisig public key (implies `--pubkey`). | +| `nobackup` | Boolean | Doesn't print out seed phrase (if others are watching the terminal). | +| `nosort` | Boolean | Keys passed to `--multisig` are taken in the order they're supplied. | +| `pubkey` | String | Parses a public key in bech32 format and save it to disk. | +| `recover` | Boolean | Provides seed phrase to recover existing key instead of creating. | +| `threshold` | Int | K out of N required signatures. For use in conjunction with --multisig (default: `1`). | + +> **Test Seed Phrase:** source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast + +## List all Known Keys + +List all keys stored in your keybase with the following command. + +```bash +gnokey list +``` + +## Delete a Key + +Delete a key from your keybase with the following command. + +```bash +gnokey delete {KEY_NAME} +``` + +#### **Options** + +| Name | Type | Description | +| ------- | ------- | ---------------------------- | +| `yes` | Boolean | Skips confirmation prompt. | +| `force` | Boolean | Removes key unconditionally. | + + +## Export a Private Key (Encrypted & Unencrypted) + +Export a private key's (encrypted or unencrypted) armor using the following command. + +```bash +gnokey export +``` + +#### **Options** + +| Name | Type | Description | +| ------------- | ------ | ------------------------------------------- | +| `key` | String | Name or Bech32 address of the private key | +| `output-path` | String | The desired output path for the armor file | +| `unsafe` | Bool | Export the private key armor as unencrypted | + + +## Import a Private Key (Encrypted & Unencrypted) + +Import a private key's (encrypted or unencrypted) armor with the following command. + +```bash +gnokey import +``` + +#### **Options** + +| Name | Type | Description | +| ------------ | ------ | ------------------------------------------- | +| `armor-path` | String | The path to the encrypted armor file. | +| `name` | String | The name of the private key. | +| `unsafe` | Bool | Import the private key armor as unencrypted | + + +## Make an ABCI Query + +Make an ABCI Query with the following command. + +```bash +gnokey query {QUERY_PATH} +``` + +#### **Query** + +| Query Path | Description | Example | +| ------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | +| `auth/accounts/{ADDRESS}` | Returns information about an account. | `gnokey query auth/accounts/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5` | +| `bank/balances/{ADDRESS}` | Returns balances of an account. | `gnokey query bank/balances/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5` | +| `vm/qfuncs` | Returns public facing function signatures as JSON. | `gnokey query vm/qfuncs --data "gno.land/r/demo/boards"` | +| `vm/qfile` | Returns the file bytes, or list of files if directory. | `gnokey query vm/qfile --data "gno.land/r/demo/boards"` | +| `vm/qrender` | Calls .Render(path) in readonly mode. | `gnokey query vm/qrender --data "gno.land/r/demo/boards"` | +| `vm/qeval` | Evaluates any expression in readonly mode and returns the results. | `gnokey query vm/qeval --data "gno.land/r/demo/boards GetBoardIDFromName("my_board")"` | +| `vm/store` | (not yet supported) Fetches items from the store. | - | +| `vm/package` | (not yet supported) Fetches a package's files. | - | + +#### **Options** + +| Name | Type | Description | +| -------- | --------- | ---------------------------------------- | +| `data` | UInt8 \[] | Queries data bytes. | +| `height` | Int64 | (not yet supported) Queries height. | +| `prove` | Boolean | (not yet supported) Proves query result. | + + +## Sign and Broadcast a Transaction + +You can sign and broadcast a transaction with the following command. + +```bash +gnokey maketx {SUB_COMMAND} {ADDRESS or KeyName} +``` + +#### **Subcommands** + +| Name | Description | +| -------- | ---------------------------- | +| `addpkg` | Uploads a new package. | +| `call` | Calls a public function. | +| `send` | The amount of coins to send. | + +### `addpkg` + +This subcommand lets you upload a new package. + +```bash +gnokey maketx addpkg \ + -deposit="1ugnot" \ + -gas-fee="1ugnot" \ + -gas-wanted="5000000" \ + -pkgpath={Registered Realm path} \ + -pkgdir={Package folder path} \ + {ADDRESS} \ + > unsigned.tx +``` + +#### **SignBroadcast Options** + +| Name | Type | Description | +| ------------ | ------- | ------------------------------------------------------------------------ | +| `gas-wanted` | Int64 | The maximum amount of gas to use for the transaction. | +| `gas-fee` | String | The gas fee to pay for the transaction. | +| `memo` | String | Any descriptive text. | +| `broadcast` | Boolean | Broadcasts the transaction. | +| `chainid` | String | Defines the chainid to sign for (should only be used with `--broadcast`) | + +#### **makeAddPackageTx Options** + +| Name | Type | Description | +| --------- | ------ | ------------------------------------- | +| `pkgpath` | String | The package path (required). | +| `pkgdir` | String | The path to package files (required). | +| `deposit` | String | The amount of coins to send. | + + +### `call` + +This subcommand lets you call a public function. + +```bash +# Register +gnokey maketx call \ + -gas-fee="1ugnot" \ + -gas-wanted="5000000" \ + -pkgpath="gno.land/r/demo/users" \ + -send="200000000ugnot" \ + -func="Register" \ + -args="" \ + -args={NAME} \ + -args="" \ + {ADDRESS} \ + > unsigned.tx +``` + +#### **SignBroadcast Options** + +| Name | Type | Description | +| ------------ | ------- | ---------------------------------------------------------------- | +| `gas-wanted` | Int64 | The maximum amount of gas to use for the transaction. | +| `gas-fee` | String | The gas fee to pay for the transaction. | +| `memo` | String | Any descriptive text. | +| `broadcast` | Boolean | Broadcasts the transaction. | +| `chainid` | String | The chainid to sign for (should only be used with `--broadcast`) | + +#### **makeCallTx Options** + +| Name | Type | Description | +| --------- | ---------- | -------------------------------- | +| `send` | String | The amount of coins to send. | +| `pkgpath` | String | The package path (required). | +| `func` | String | The contract to call (required). | +| `args` | String \[] | The arguments of the contract. | + + +### `send` + +This subcommand lets you send a native currency to an address. + +```bash +gnokey maketx send \ + -gas-fee="1ugnot" \ + -gas-wanted="5000000" \ + -send={SEND_AMOUNT} \ + -to={TO_ADDRESS} \ + {ADDRESS} \ + > unsigned.tx +``` + +#### **SignBroadcast Options** + +| Name | Type | Description | +| ------------ | ------- | ----------------------------------------------------- | +| `gas-wanted` | Int64 | The maximum amount of gas to use for the transaction. | +| `gas-fee` | String | The gas fee to pay for the transaction. | +| `memo` | String | Any descriptive text. | +| `broadcast` | Boolean | Broadcasts the transaction. | +| `chainid` | String | The chainid to sign for (implies `--broadcast`) | + +#### **makeSendTx Options** + +| Name | Type | Description | +| ------ | ------ | ------------------------ | +| `send` | String | Amount of coins to send. | +| `to` | String | The destination address. | + + +## Sign a Document + +Sign a document with the following command. + +```bash +gnokey sign +``` + +#### **Options** + +| Name | Type | Description | +| ---------------- | ------- | ---------------------------------------------------------- | +| `txpath` | String | The path to file of tx to sign (default: `-`). | +| `chainid` | String | The chainid to sign for (default: `dev`). | +| `number` | UInt | The account number of the account to sign with (required) | +| `sequence` | UInt | The sequence number of the account to sign with (required) | +| `show-signbytes` | Boolean | Shows signature bytes. | + + +## Verify a Document Signature + +Verify a document signature with the following command. + +```bash +gnokey verify +``` + +#### **Options** + +| Name | Type | Description | +| --------- | ------ | ---------------------------------------- | +| `docpath` | String | The path of the document file to verify. | + +## Broadcast a Signed Document + +Broadcast a signed document with the following command. + +```bash +gnokey broadcast {signed transaction file document} +``` diff --git a/docs/explanation/gno-tooling/cli/gnoland.md b/docs/explanation/gno-tooling/cli/gnoland.md new file mode 100644 index 00000000000..3c05897646b --- /dev/null +++ b/docs/explanation/gno-tooling/cli/gnoland.md @@ -0,0 +1,31 @@ +--- +id: gno-tooling-gnoland +--- + +# gnoland + +## Run a Gnoland Node + +Start a node on the Gnoland blockchain with the following command. + +```bash +gnoland +``` + +### **Sub Commands** +| Command | Description | +| --------- | ----------------- | +| `start` | Run the full node | + + +### **Options** + +| Name | Type | Description | +| -------------------------- | ------- | --------------------------------------------------------------------------------------- | +| `chainid` | String | The id of the chain (default: `dev`). | +| `genesis-balances-file` | String | The initial GNOT distribution file (default: `./gnoland/genesis/genesis_balances.txt`). | +| `genesis-remote` | String | Replacement '%%REMOTE%%' in genesis (default: `"localhost:26657"`). | +| `genesis-txs-file` | String | Initial txs to be executed (default: `"./gnoland/genesis/genesis_txs.txt"`). | +| `root-dir` | String | directory for config and data (default: `testdir`). | +| `skip-failing-genesis-txs` | Boolean | Skips transactions that fail from the `genesis-txs-file` | +| `skip-start` | Boolean | Quits after initialization without starting the node. | diff --git a/docs/explanation/gno-tooling/cli/tm2txsync.md b/docs/explanation/gno-tooling/cli/tm2txsync.md new file mode 100644 index 00000000000..e9d616bcea5 --- /dev/null +++ b/docs/explanation/gno-tooling/cli/tm2txsync.md @@ -0,0 +1,45 @@ +--- +id: gno-tooling-tm2txsync +--- + +# tm2txsync + +`tm2txsync` is used for backing up a local node's transactions. + +## Import Transaction Data To (or Export It From) a Node + +You may import or export transaction data with the following command. + +```bash +tm2txsync {SUB_COMMAND} +``` + +#### **Subcommands** + +| Name | Description | +| -------- | -------------------------- | +| `export` | Exports txs from the node. | +| `import` | Imports txs to the node. | + +### Import + +#### **Options** + +| Name | Type | Description | +| -------- | ------ | ----------------------------------------------------------------- | +| `remote` | String | The Remote RPC in `addr:port` format (default: `localhost:26657`) | +| `in` | String | The input file path (default: `txexport.log`) | + +### Export + +#### **Options** + +| Name | Type | Description | +| -------- | ------- | ----------------------------------------------------------------- | +| `remote` | String | The Remote RPC in `addr:port` format (default: `localhost:26657`) | +| `start` | Int64 | Starting height (default: `1`) | +| `tail` | Int64 | Start at LAST - N. | +| `end` | Int64 | End height (optional) | +| `out` | String | The output file path (default: `txexport.log`) | +| `quiet` | Boolean | Quiet mode. | +| `follow` | Boolean | Keep attached and follow new events. | diff --git a/docs/explanation/gnovm.md b/docs/explanation/gnovm.md new file mode 100644 index 00000000000..1d6de14993b --- /dev/null +++ b/docs/explanation/gnovm.md @@ -0,0 +1,27 @@ +--- +id: gnovm +--- + +# GnoVM + +GnoVM is a virtual machine that interprets Gnolang, a custom version of Golang optimized for blockchains, featuring automatic state management, full determinism, and idiomatic Go. +It works with Tendermint2 and enables smarter, more modular, and transparent appchains with embedded smart-contracts. +It can be adapted for use in TendermintCore, forks, and non-Cosmos blockchains. + +Read the ["Intro to Gnoland"](https://test3.gno.land/r/gnoland/blog:p/intro) blogpost. + +This folder focuses on the VM, language, stdlibs, tests, and tools, independent of the blockchain. +This enables non-web3 developers to contribute without requiring an understanding of the broader context. + +## Language Features + +* Like interpreted Go, but more ambitious. +* Completely deterministic, for complete accountability. +* Transactional persistence across data realms. +* Designed for concurrent blockchain smart contracts systems. + +## Getting started + +Install [`gno`](../getting-started/local-setup.md) and refer to the [`examples`](https://github.com/gnolang/gno/tree/master/examples) folder to start developing contracts. + +Check the [Makefile](https://github.com/gnolang/gno/blob/master/gnovm/Makefile) to enhance GnoVM, Gnolang, and stdlibs. diff --git a/docs/explanation/packages.md b/docs/explanation/packages.md new file mode 100644 index 00000000000..85443052a6a --- /dev/null +++ b/docs/explanation/packages.md @@ -0,0 +1,113 @@ +--- +id: packages +--- + +# Packages + +Packages encompass functionalities that are more closely aligned with the characteristics and capabilities of realms, as opposed to standard libraries. + +The full list of available packages can be found in [the demo package](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo). Below are some of the most commonly used packages. + +## `avl` + +In Golang, the classic key/value data type is represented by the `map` construct. However, while Gnolang also supports the use of `map`, it is not a viable option as it lacks determinism due to its non-sequential nature. + +To address this issue, Gnolang implements the [AVL Tree](https://en.wikipedia.org/wiki/AVL\_tree) (Adelson-Velsky-Landis Tree) as a solution. The AVL Tree is a self-balancing binary search tree. + +The `avl` package comprises a set of functions that can manipulate the leaves and nodes of the AVL Tree. + +## `grc20` + +Gnolang includes an implementation of the `erc20` fungible token standard referred to as `grc20`. The interfaces of `grc20` are as follows: + +[embedmd]:# (../assets/explanation/packages/pkg-1.gno go) +```go +func TotalSupply() uint64 +func BalanceOf(account std.Address) uint64 +func Transfer(to std.Address, amount uint64) +func Approve(spender std.Address, amount uint64) +func TransferFrom(from, to std.Address, amount uint64) +func Allowance(owner, spender std.Address) uint64 +``` + +The role of each function is as follows: + +* `TotalSupply`: Returns the total supply of the token. +* `BalanceOf`: Returns the balance of tokens of an account. +* `Transfer`: Transfers specific `amount` of tokens from the `caller` of the function to the `to` address. +* `Approve`: Grants the `spender`(also referred to as `operator`) with the ability to send specific `amount` of the `caller`'s (also referred to as `owner`) tokens on behalf of the `caller`. +* `TransferFrom`: Can be called by the `operator` to send specific `amount` of `owner`'s tokens from the `owner`'s address to the `to` address. +* `Allowance`: Returns the number of tokens approved to the `spender` by the `owner`. + +Two types of contracts exist in`grc20`: + +1. `AdminToken`\ + \- Implements the token factory with `Helper` functions.\ + \- The underlying struct should not be exposed to users. However, it can be typecasted as UserToken using the `GRC20()` method. +2. `UserToken`\ + \- Implements the `IGRC20` interface.\ + \- The underlying struct can be exposed to users. Created with the `GRC20()` method of `adminToken`. + +## `grc721` + +Gnolang includes an implementation of the `erc721` non-fungible token standard referred to as `grc721`. The interfaces of `grc721` are as follows: + +[embedmd]:# (../assets/explanation/packages/pkg-2.gno go) +```go +// functions that work similarly to those of grc20 +func BalanceOf(owner std.Address) (uint64, error) +func Approve(approved std.Address, tid TokenID) error +func TransferFrom(from, to std.Address, tid TokenID) error + +// functions unique to grc721 +func OwnerOf(tid TokenID) (std.Address, error) +func SafeTransferFrom(from, to std.Address, tid TokenID) error +func SetApprovalForAll(operator std.Address, approved bool) error +func GetApproved(tid TokenID) (std.Address, error) +func IsApprovedForAll(owner, operator std.Address) bool +``` + +`grc721` contains a new set of functions: + +* `OwnerOf`: Returns the `owner`'s address of a token specified by its `TokenID`. +* `SafeTransferFrom`: Equivalent to the `TransferFrom` function of `grc20`. + * The `Safe` prefix indicates that the function runs a check to ensure that the `to` address is a valid address that can receive tokens. + * As you can see from the [code](https://github.com/gnolang/gno/blob/master/examples/gno.land/p/demo/grc/grc721/basic\_nft.gno#L341), the concept of `Safe` has yet to be implemented. +* `SetApprovalForAll`: Approves all tokens owned by the `owner` to an `operator`. + * You may not set multiple `operator`s. +* `GetApproved`: Returns the `address` of the `operator` for a token, specified with its `ID`. +* `IsApprovedForAll`: Returns if all NFTs of the `owner` have been approved to the `operator`. + +## `testutils` + +The `testutils` package contains a set of functions that comes in handy when testing realms. The sample function below is the commonly used `TestAddress` function that generates a random address. + +[embedmd]:# (../assets/explanation/packages/pkg-3.gno go) +```go +func TestAddress(name string) std.Address { + if len(name) > std.RawAddressSize { + panic("address name cannot be greater than std.AddressSize bytes") + } + addr := std.RawAddress{} + // TODO: use strings.RepeatString or similar. + // NOTE: I miss python's "".Join(). + blanks := "____________________" + copy(addr[:], []byte(blanks)) + copy(addr[:], []byte(name)) + return std.Address(std.EncodeBech32("g", addr)) +} +``` + +The code takes the `name` as the input and creates a random address. Below is a list of examples where it's used in the test case of the `foo20` realm. + +[embedmd]:# (../assets/explanation/packages/pkg-4.gno go) +```go +admin := users.AddressOrName("g1tntwtvzrkt2gex69f0pttan0fp05zmeg5yykv8") +test2 := users.AddressOrName(testutils.TestAddress("test2")) +recv := users.AddressOrName(testutils.TestAddress("recv")) +normal := users.AddressOrName(testutils.TestAddress("normal")) +owner := users.AddressOrName(testutils.TestAddress("owner")) +spender := users.AddressOrName(testutils.TestAddress("spender")) +recv2 := users.AddressOrName(testutils.TestAddress("recv2")) +mibu := users.AddressOrName(testutils.TestAddress("mint_burn")) +``` diff --git a/docs/proof-of-contribution.md b/docs/explanation/proof-of-contribution.md similarity index 99% rename from docs/proof-of-contribution.md rename to docs/explanation/proof-of-contribution.md index e839a3cdf1f..364a5eb254d 100644 --- a/docs/proof-of-contribution.md +++ b/docs/explanation/proof-of-contribution.md @@ -1,3 +1,7 @@ +--- +id: proof-of-contribution +--- + # Proof of Contribution The gno.land chain utilizes a reputation-based consensus mechanism instead of proof-of-stake. diff --git a/docs/explanation/realms.md b/docs/explanation/realms.md new file mode 100644 index 00000000000..fd6969db3f1 --- /dev/null +++ b/docs/explanation/realms.md @@ -0,0 +1,49 @@ +--- +id: realms +--- + +# Realms + +A realm refers to a specific instance of a smart contract that can be written +in [Gnolang](./gno-language.md). The potentials of realms are endless - you can create virtually any +application in your mind with built-in composability, +transparency, and censorship resistance. Here are some ideas of what you can build with realms: + +* Self-custodial financial exchanges (decentralized exchanges). +* Lending platforms with better rates. +* Transparent insurance systems. +* Fair and accessible voting systems. +* Logistics and supply chain networks. + +## Packages vs Realms + +#### [**Pure Packages**](https://github.com/gnolang/gno/tree/master/examples/gno.land/p) + +* A unit that contains functionalities and utilities that can be used in realms. +* Packages are stateless. +* The default import path is `gno.land/p/~~~`. +* Can be imported to other realms or packages. +* Cannot import realms. + +#### [**Realms**](https://github.com/gnolang/gno/tree/master/examples/gno.land/r) + +* Smart contracts in Gnolang. +* Realms are stateful. +* Realms can own assets (tokens). +* The default import path is `gno.land/r/~~~`. +* Realms can implement `Render(path string) string` to simplify dapp frontend development by allowing users to request + markdown renderings from validators and full nodes without a transaction. + +A notable feature of realms is the `Render()` function. + +```go +package demo + +func Render(path string) string { + return "# Hello Gno!" +} +``` + +Upon calling the realm above, `# Hello Gno!` is printed with a string-typed `path` declared in an argument. It should be +noted that while the `path` argument included in the sample code is not utilized, it serves the purpose of +distinguishing the path during the rendering process. diff --git a/docs/explanation/tendermint2.md b/docs/explanation/tendermint2.md new file mode 100644 index 00000000000..3c86a46922a --- /dev/null +++ b/docs/explanation/tendermint2.md @@ -0,0 +1,122 @@ +--- +id: tendermint2 +--- + +# Tendermint2 + +**Disclaimer: Tendermint2 is currently part of the Gno monorepo for streamlined development.** + +**Once Gno.land is on the mainnet, Tendermint2 will operate independently, including for governance, +on https://github.com/tendermint/tendermint2.** + +## Problems + +* Open source is open for subversion. +* Incentives and mission are misaligned. +* Need directory & forum for Tendermint/SDK forks. + +## Partial Solution: adopt principles + +* Simplicity of design. +* The code is the spec. +* Minimal code - keep total footprint small. +* Minimal dependencies - all dependencies must get audited, and become part of + the repo. +* Modular dependencies - whereever reasonable, make components modular. +* Completeness - software projects that don't become finished are projects + that are forever vulnerable. One of the primary goals of the Gno language + and related works is to become finished within a reasonable timeframe. + +## What is already proposed for Tendermint2: + +* Complete Amino. -> multiplier of productivity for SDK development, to not + have to think about protobuf at all. Use "genproto" to even auto-generate + proto3 for encoding/decoding optimization through protoc. + - MISSION: be the basis for improving the encoding standard from proto3, because + proto3 length-prefixing is slow, and we need "proto4" or "amino2". + - LOOK at the auto-generated proto files! + https://github.com/gnolang/gno/blob/master/pkgs/bft/consensus/types/cstypes.proto + for example. + - There was work to remove this from the CosmosSDK because + Amino wasn't ready, but now that it is, it makes sense to incorporate it into + Tendermint2. + + +* Remove EvidenceReactor, Evidence, Violation: + + We need to make it easy to create alt mempool reactors. + + We "kill two birds with one stone" by implementing evidence as a first-class mempool lane. + + The authors of "ABCI++" have a different set of problems to solve, so we should do both! Tendermint++ + and Tendermint2. + + +* Fix address size to 20 bytes -> 160 is sufficient, and fixing it brings optimizations. + + +* General versionset system for handshake negotiation. -> So Tendermint2 can be + used as basis for other P2P applications. + + +* EventBus -> EventSwitch. -> For indexing, use an external system. + + To ensure Tendermint2 remains minimal and easily integrated with plugin modules, there is no internal implementation. + + The use of an EventSwitch makes the process simpler and synchronous, which maintains the determinism of Tendermint + tests. + + Keeping the Tendermint protocol synchronous is sufficient for optimal performance. + + However, if there is a need for asynchronous processing due to an exceptionally large number of validators, it should + be a separate fork with a unique name under the same taxonomy as Tendermint. + + +* Fix nondeterminism in consensus tests -> in relation to the above. + +* Add "MaxDataBytes" for total tx data size limitation. + + To avoid unexpected behavior caused by changes in validator size, it's best to allocate room for each module + separately instead of limiting the total block size as we did before. + +This way, we can ensure that there's enough space for all modules. + +* Remove external dependencies like prometheus + To ensure accuracy, all metrics and events should be integrated through interfaces. This may require extracting client + logic from Prometheus, but it will be incorporated into Tendermint2 and undergo the same auditing process as + everything else. + +* General consensus/WAL -> a WAL is useful enough to warrant being a re-usable + module. + +* Remove GRPC -> GRPC support should be plugged in (say in a GRPC fork of + Tendermint2), so alternative RPC protocols can likewise be. Tendermint2 aims + to be independent of the Protobuf stack so that it can retain freedom for + improving its codec. + +* Remove dependency on viper/cobra -> I have tried to strip out what we don't + use of viper/cobra for minimalism, but could not; and viper/cobra is one + prime target for malware to be introduced. Rather than audit viper/cobra, + Tendermint2 implements a cli convention for Go-structure-based flags and cli; + so if you still want to use viper/cobra you can do so by translating flags to + an options struct. + +* Question: Which projects use ABCI sockets besides CosmosSDK derived chains? + +## Roadmap + +First, we create a multi-organizational team for Tendermint2 & +TendermintCore/++ development. We will maintain a fork of the Tendermint++ repo +and suggest changes upstream based on our work on Tendermint2, while also +porting necessary fixes from Tendermint++ over to Tendermint2. + +We will also reach out to ecosystem partners and survey and create a +directory/taxonomy for Tendermint and CosmosSDK derivatives and manage a forum +for interfork collaboration. + +Ideally, Tendermint2 and TendermintCore/++ merge into one. + +## Challenge + +Either make a PR to Gaia/CosmosSDK/TendermintCore to be like Tendermint2, or +make a PR to Tendermint2 to import a feature or fix of TendermintCore. diff --git a/docs/getting-started/browsing-gno-source-code.md b/docs/getting-started/browsing-gno-source-code.md new file mode 100644 index 00000000000..24e7c173f95 --- /dev/null +++ b/docs/getting-started/browsing-gno-source-code.md @@ -0,0 +1,96 @@ +--- +id: browsing-gno-source-code +--- + +# Browsing Gno Source Code + +## Overview + +In this tutorial, you will learn how to browse deployed Gno [Realms](../explanation/realms.md) +and [Packages](../explanation/packages.md). Additionally, you will understand how the `Render` method is utilized +to achieve Realm state visibility. + +## Prerequisites + +- **`gnoweb` set up. Reference the [Local Setup](local-setup.md#3-installing-other-gno-tools) guide for steps** + +## 1. Start the local chain + +In order for `gnoweb` to fetch realm and package source code, it needs to connect a running Gno node. For a better +overview on running a local node, please reference the [Starting a Local Chain](setting-up-a-local-chain.md) guide. + +In this guide, we will start a local node with the default configuration. Navigate to the `gno.land` sub-folder and run: + +```bash +gnoland start +``` + +## 2. Start `gnoweb` + +Now that the chain is running, we can start the `gnoweb` tool: + +```bash +gnoweb +``` + +:::info Different JSON-RPC URL + +In case you are running a node on a different JSON-RPC URL from the default one (`http://127.0.0.1:26657`), +you can specify the remote URL with the `gnoweb` flag named `--remote` + +::: + +We should be able to access the website locally on http://127.0.0.1:8888/. + +![gnoweb screen](../assets/getting-started/browsing-gno-source-code/gnoweb.png) + +## 3. Browse Package source code + +Packages in Gno.land usually have names resembling `gno.land/p/`. Since packages do not contain state, we can only +view their source code on-chain. To learn more about Packages, please check out +the [Packages](../explanation/packages.md) explanation document. + +Using `gnoweb`, we can browse the source code in our browser. +For example, the `avl` package is deployed at `gno.land/p/demo/avl`. + +To access the source code of the `avl` package, we can append the `/p/demo/avl` to our browser URL (from the homepage). + +The final URL for the `avl` package source could be viewable at http://127.0.0.1:8888/p/demo/avl, if we followed +default setup params, as we did in this guide. + +![gnoweb avl](../assets/getting-started/browsing-gno-source-code/gnoweb-avl.png) + +From here, we can open any source code file of the deployed on-chain package and inspect its API. + +## 4. Browse Realm source code + +In contrast to Packages, Realms in Gno.land usually have names resembling `gno.land/r/`. + +Realms _do_ contain state, and in addition to being able to view their source code on-chain, users can also view their +internal state representation in the form of the `Render()` output. To learn more about Realms, please +check out the [Realms](../explanation/realms.md) explanation document. + +Using `gnoweb`, we can browse the Realm `Render()` method output and source code in our browser. +For example, the `boards` Realm is deployed at `gno.land/r/demo/boards`. + +To view the internal Realm state of the `boards` package, we can append the `/r/demo/boards` to our browser URL (from +the homepage). + +The final URL for the `boards` Realm internal state could be viewable at http://127.0.0.1:8888/r/demo/boards, if we +followed +default setup params, as we did in this guide. + +![gnoweb boards](../assets/getting-started/browsing-gno-source-code/gnoweb-boards.png) + +:::info Render() is not required + +Internal Realm state does not have to be exposed through the `Render()` method of the realm, as it is +not a requirement for deploying a Realm. + +::: + +Additionally, to view the source code for the realm, we simply need to append the `/` to the full realm path: + +http://127.0.0.1:8888/r/demo/boards/ + +![gnoweb boards source](../assets/getting-started/browsing-gno-source-code/gnoweb-boards-source.png) diff --git a/docs/getting-started/local-setup.md b/docs/getting-started/local-setup.md new file mode 100644 index 00000000000..cbef4522477 --- /dev/null +++ b/docs/getting-started/local-setup.md @@ -0,0 +1,111 @@ +--- +id: local-setup +--- + +# Local Setup + +## Overview + +In this tutorial, you will learn how to set up the Gno development environment locally, so you +can get up and running writing Gno code. You will download and install all the necessary tooling, +and validate that they are correctly configured to run on your machine. + +## Prerequisites + +- **Git** +- **`make` (for running Makefiles)** +- **Go 19+** + +## 1. Cloning the repository + +To get started with a local Gno.land development environment, you must clone the GitHub repository +somewhere on disk: + +```bash +git clone https://github.com/gnolang/gno.git +``` + +## 2. Installing the `gno` development toolkit + +Next, we are going to build and install the `gno` development toolkit. +`gno` provides ample functionality to the user, among which is running, precompiling, testing and building `.gno` files. + +To install the toolkit, navigate to the `gnovm` folder from the repository root, and run the `build` make directive: + +```bash +cd gnovm +make build +``` + +This will build out the necessary `gno` binary into the `gnovm/cmd` sub-folder: + +![gno tool build](../assets/getting-started/local-setup/make-build-gnovm.gif) + +Next, to make development easier, we need to make the binary available system-wide. +From the same `gnovm` sub-folder, you can run: + +```bash +make install +``` + +To verify the `gno` binary is installed system-wide, you can run: + +```bash +gno --help +``` + +You should get the help output from the command: + +![gno help](../assets/getting-started/local-setup/gno-help.gif) + +Alternatively, if you don't want to have the binary callable system-wide, you can run the binary directly: + +```bash +go run ./cmd/gno --help +``` + +## 3. Installing other `gno` tools + +The next step is to install several other tools that are required for the Gno development environment, like + +- `gnoland` - the Gno [blockchain node](setting-up-a-local-chain.md) +- `gnokey` - the Gno [private key manager](working-with-key-pairs.md) +- `gnoweb` - the Gno [source code viewer](browsing-gno-source-code.md) +- `gnofaucet` - the Gno [native currency faucet](setting-up-funds/running-a-faucet.md) + +To build these tools, from the root directory navigate to the `gno.land` sub-folder, and run the `build` make +directive: + +```bash +cd gno.land +make build +``` + +This will build out the necessary binaries into the `gno.land/cmd` sub-folder: + +![gno tools build](../assets/getting-started/local-setup/make-build-gnoland.gif) + +Same as with the `gno` tool, we can make these binaries available system-wide. +From the same `gno.land` sub-folder, you can run: + +```bash +make install +``` + +To verify that, for example, the `gnokey` binary is installed system-wide, you can run: + +```bash +gnokey --help +``` + +You should get the help output from the command: + +![gnokey help](../assets/getting-started/local-setup/gnokey-help.gif) + +## Conclusion + +That's it 🎉 + +You have successfully built out and installed the necessary tools for Gno development! + +In further documents, you will gain a better understanding on how they are used to make Gno work. diff --git a/docs/getting-started/setting-up-a-local-chain.md b/docs/getting-started/setting-up-a-local-chain.md new file mode 100644 index 00000000000..51fe1fd45a6 --- /dev/null +++ b/docs/getting-started/setting-up-a-local-chain.md @@ -0,0 +1,142 @@ +--- +id: setting-up-a-local-chain +--- + +# Setting up a Local Chain + +## Overview + +In this tutorial, you will learn how to start a local Gno node (and chain!). +Additionally, you will see the different options you can use to make your Gno instance unique. + +## Prerequisites + +- [`gnoland` installed](local-setup.md#3-installing-other-gno-tools). + +## Starting a node with a default configuration + +You can start a Gno blockchain node with the default configuration by navigating to the `gno.land` sub-folder and +running the following command: + +```bash +gnoland start +``` + +The command will trigger a chain initialization process (if you haven't run the node before), and start the Gno node, +which is ready to accept transactions and interact with other Gno nodes. + +![gnoland start](../assets/getting-started/setting-up-a-local-chain/gnoland-start.gif) + +To view the command defaults, simply run the `help` command: + +```bash +gnoland start --help +``` + +Let's break down the most important default settings: + +- `chainid` - the ID of the Gno chain. This is used for Gno clients, and distinguishing the chain from other Gno + chains (ex. through IBC) +- `config` - the custom node configuration file + for more details on utilizing this file +- `genesis-balances-file` - the initial premine balances file, which contains initial native currency allocations for + the chain. By default, the genesis balances file is located in `gno.land/genesis/genesis_txs.txt`, this is also the + reason why we need to navigate to the `gno.land` sub-folder to run the command with default settings +- `root-dir` - the working directory for the node configuration and node data (state DB) + +:::info Resetting the chain + +As mentioned, the working directory for the node is located in `root-dir`. To reset the chain, you need +to delete this directory and start the node up again. If you are using the default node configuration, you can run +`make fclean` from the `gno.land` sub-folder to delete the `tempdir` working directory. + +::: + +## Changing the chain ID + +:::info Changing the Gno chain ID has several implications + +- It affects how the Gno node communicates with other Gno nodes / chains +- Gno clients that communicate through JSON-RPC need to match this value + +It's important to configure your node properly before launching it in a distributed network. +Keep in mind that changes may not be applicable once connected. + +::: + +To change the Gno chain ID, run the following command: + +```bash +gnoland start --chainid NewChainID +``` + +We can verify the chain ID has been changed, by fetching the status of the node and seeing the +associated chain ID. By default, the node exposes the JSON-RPC API on `http://127.0.0.1:26657`: + +```bash +curl -H "Content-type: application/json" -d '{ + "jsonrpc": "2.0", + "method": "status", + "params": [], + "id": 1 +}' 'http://127.0.0.1:26657' +``` + +We should get a response similar to this: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "node_info": { + "version_set": [ + // ... + ], + "net_address": "g10g9r37g9xa54a6clttzmhk2gmdkzsntzty0cvr@0.0.0.0:26656", + "network": "NewChainID" + // ... + } + } +} +``` + +:::danger Chain ID can be set only once + +Since the chain ID information is something bound to a chain, you can +only change it once upon chain initialization, and further attempts to change it will +have no effect. + +::: + +## Changing the node configuration + +You can specify a node configuration file using the `--config` flag. + +```bash +gnoland start --config config.toml +``` + +## Changing the premine list + +You do not need to use the `gno.land/genesis/genesis_balances.txt` file as the source of truth for initial network +funds. + +To specify a custom balance sheet for a fresh local chain, you can use the `-genesis-balances-file`: + +```bash +gnoland start -genesis-balances-file custom-balances.txt +``` + +Make sure the balances file follows the following format: + +```text +
=ugnot +``` + +Following this pattern, potential entries into the genesis balances file would look like: + +```text +g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt=10000000000ugnot +g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq=10000000000ugnot +``` diff --git a/docs/getting-started/setting-up-funds/premining-balances.md b/docs/getting-started/setting-up-funds/premining-balances.md new file mode 100644 index 00000000000..00076cdfda1 --- /dev/null +++ b/docs/getting-started/setting-up-funds/premining-balances.md @@ -0,0 +1,106 @@ +--- +id: premining-balances +--- + +# Premining Balances + +## Overview + +In this tutorial, you will gain an understanding on how to premine native currency on a local Gno.land chain. +Additionally, you will understand how to query the account balance after you premine it. + +Premining balance is the process of making sure some accounts (addresses) have specific funds when the chain initially +launches. In the context of local chain deployments, premine balances are used to ensure the user accounts (developers) +have ample funds to interact with the chain and facilitate contract deployments. + +## Prerequisites + +- **`gnoland` and `gnokey` set up. Reference the [Installation](../local-setup.md#3-installing-other-gno-tools) guide + for steps** + +## 1. Clean chain data + +In order for us to premine funds on a fresh chain, we need to make sure we do not have any leftover blockchain data +from previous chain runs. + +The blockchain node, when it runs, works with an embedded DB locally on disk to store execution data (such as +configuration files, or the state DB). For Gno blockchain nodes, this working directory is labeled as `testdir` by +default. + +To clean out old blockchain data, navigate to the `gno.land` folder and run the appropriate make command: + +```bash +cd gno.land +make fclean +``` + +## 2. Change the `genesis_balances.txt` file + +When the Gno node boots up, among other things, it reads a file called `genesis_balances.txt` to generate the initial +balance set for the blockchain. + +An example of how this looks like in the initial `genesis.json` file after the chain starts: + +```bash + "app_state": { + "@type": "/gno.GenesisState", + "balances": [ + "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5=10000000000000ugnot", + "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj=10000000000000ugnot", + "g1f4v282mwyhu29afke4vq5r2xzcm6z3ftnugcnv=1000000000000ugnot", + "g127jydsh6cms3lrtdenydxsckh23a8d6emqcvfa=1000000000000ugnot" + ], +``` + +The `genesis_balances.txt` file is located at `./gno.land/genesis/genesis_balances.txt`. + +To add a new entry to the premine table, simply append a line to the end of the file: + +```bash +g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt=10000000000ugnot # My address +``` + +Replace `g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt` with the address you want balance on, and `10000000000ugnot` with the +desired `ugnot` balance. + +## 3. Start the local chain + +Now that our address and the desired premine balance are located in the `genesis_balances.txt` file, we can start the +local Gno node. + +To run the local Gno node, make sure you are in the `gno.land` sub-folder, and run the appropriate make command: + +```bash +cd gno.land +gnoland start +``` + +This command will initialize the Gno node, generate the `genesis.json` with our newly added premine information, and +start the chain. + +![gnoland start](../../assets/getting-started/setting-up-funds/gnoland-start.gif) + +## 3. Check the account balance + +To check the balance of any account (or the account we just premined), we can use the following ABCI query: + +```bash +gnokey query --remote localhost:26657 bank/balances/g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt +``` + +Let's break down this command: + +- **`--remote`** - the JSON-RPC URL of the running Gno node. In the case of a local deployment, the default value + is `localhost:26657` +- **`bank/balances/g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt`** - the ABCI query targets the `bank` module to find + the `balances` for address `g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt`. Replace the address with your desired address + +![gnokey query](../../assets/getting-started/setting-up-funds/gnokey-query.gif) + +## Conclusion + +That's it 🎉 + +You have successfully premined a native currency balance on a locally-running Gno chain! +Additionally, you have also learned how to query the native currency balance for an address, using built-in ABCI queries +and the `gnokey` tool. diff --git a/docs/getting-started/setting-up-funds/running-a-faucet.md b/docs/getting-started/setting-up-funds/running-a-faucet.md new file mode 100644 index 00000000000..3bd0e55b791 --- /dev/null +++ b/docs/getting-started/setting-up-funds/running-a-faucet.md @@ -0,0 +1,100 @@ +--- +id: running-a-faucet +--- + +# Running a Faucet + +## Overview + +In this tutorial, we will cover how to run a local native currency faucet that works seamlessly with a Gno node. +Using the faucet, any address can get a hold of native currency funds in case they +haven't [premined a balance beforehand](premining-balances.md). + +## Prerequisites + +- **`gnoland`, `gnofaucet` and `gnoweb` set up. Reference + the [Installation](../local-setup.md#3-installing-other-gno-tools) guide for steps** + +## 1. Ensure a topped-up faucet address + +The Gno faucet works by designating a single address as a faucet address that will distribute funds. + +Ensure the faucet account will have enough funds by [premining its balance](premining-balances.md) to a high value. +In case you do not have an existing address added to `gnokey`, you can consult +the [Working with Key Pairs](../working-with-key-pairs.md) guide. + +## 2. Start the local chain + +After ensuring the faucet address will have enough funds in the premine, we +can [run the local blockchain node](../setting-up-a-local-chain.md). +Navigate to the `gno.land` sub-folder and run the appropriate make command: + +```bash +cd gno.land +gnoland start +``` + +## 3. Start the faucet + +After the chain is up and running locally, you can start the faucet by running the following command: + +```bash +gnofaucet serve --chain-id dev MyKey +``` + +The command will prompt you to enter the decryption password for the key you've provided. + +- **`--chain-id`** - the chain ID of the local running node. The default value is `dev` +- **`MyKey`** - the name of the faucet key (you can also use the address) we premined in + the [previous steps](#1-ensure-a-topped-up-faucet-address) + +This will initialize the faucet to listen on port `5050`, by default. + +![gnofaucet serve](../../assets/getting-started/setting-up-funds/gnofaucet-serve.gif) + +## 4. Start the `gnoweb` interface + +To access the faucet UI, we need to start the local `gnoweb` interface. + +Navigate to the `gno.land` subfolder, and run the appropriate binary: + +```bash +cd gno.land +gnoweb +``` + +This will initialize the `gnoweb` interface on `http://127.0.0.1:8888`. + +![gnoweb](../../assets/getting-started/setting-up-funds/gnoweb.gif) + +## 5. Use the deployed faucet + +Once `gnoweb` has been started, you can navigate to http://127.0.0.1:8888/faucet. + +Simply input the desired address you wish to receive funds on (`1 GNOT` by default), and press the `GO` button. + +![gnofaucet page](../../assets/getting-started/setting-up-funds/faucet-page.png) + +After you've added the address, you should see a success message in the browser: + +``` +faucet success +``` + +In the terminal where `gnofaucet` is running, you should see a success message as well, something along the lines of: + +```bash +will deliver: {"msg":[{"@type":"/bank.MsgSend","from_address":"g155n659f89cfak0zgy575yqma64sm4tv6exqk99","to_address":"g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt","amount":"1000000ugnot"}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A10ufcOV5WP71K+KvLagJi+3TSCkx8EWKep3NbjVclU8"},"signature":"7Y0hkdPBruzMiANAHXWx3luAMhQN6SF3AQtstvOSZJI5P4uep8RIntw2c8W5blFiCd9HoMiEZFNf5dgWYwkjmA=="}],"memo":""} + +OK! +GAS WANTED: 50000 +GAS USED: 41971 +127.0.0.1 faucet success +``` + +## Conclusion + +That's it 🎉 + +You have successfully set up a GNOT faucet on a locally-running Gno chain! +Additionally, you have also learned how to utilize the `gnoweb` tool for a visual faucet UI. diff --git a/docs/getting-started/working-with-key-pairs.md b/docs/getting-started/working-with-key-pairs.md new file mode 100644 index 00000000000..5617e8339eb --- /dev/null +++ b/docs/getting-started/working-with-key-pairs.md @@ -0,0 +1,191 @@ +--- +id: working-with-key-pairs +--- + +# Working with Key Pairs + +## Overview + +In this tutorial, you will learn how to manage private user keys, which are required for interacting with the Gno.land +blockchain. You will understand what mnemonics are, how they are used, and how you can make interaction seamless with +Gno. + +## Prerequisites + +- **`gnokey` set up. Reference the [Local Setup](local-setup.md#3-installing-other-gno-tools) guide for steps** + +## Listing available keys + +`gnokey` works by creating a local directory in the filesystem for storing (encrypted!) user private keys. + +You can find this repository by checking the value of the `--home` flag when running the following command: + +```bash +gnokey --help +``` + +Example output: + +```bash +USAGE + [flags] [...] + +Manages private keys for the node + +SUBCOMMANDS + add Adds key to the keybase + delete Deletes a key from the keybase + generate Generates a bip39 mnemonic + export Exports private key armor + import Imports encrypted private key armor + list Lists all keys in the keybase + sign Signs the document + verify Verifies the document signature + query Makes an ABCI query + broadcast Broadcasts a signed document + maketx Composes a tx document to sign + +FLAGS + -config ... config file (optional) + -home $XDG_CONFIG/gno home directory + -insecure-password-stdin=false WARNING! take password from stdin + -quiet=false suppress output during execution + -remote 127.0.0.1:26657 remote node URL + +error parsing commandline arguments: flag: help requested +``` + +In this example, the directory where `gnokey` will store working data +is `/Users/zmilos/Library/Application Support/gno`. + +Keep note of this directory, in case you need to reset the keystore, or migrate it for some reason. +You can provide a specific `gnokey` working directory using the `--home` flag. + +To list keys currently present in the keystore, we can run: + +```bash +gnokey list +``` + +In case there are no keys present in the keystore, the command will simply return an empty response. +Otherwise, it will return the list of keys and their accompanying metadata as a list, for example: + +```bash +0. Manfred (local) - addr: g15uk9d6feap7z078ttcnwc94k60ullrvhmynxjt pub: gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pqvn87u43scec4zfgn4la3nt237nehzydzayqxe43fx63lq6rty9c5almet4, path: +1. Milos (local) - addr: g15lppu0tuxets0c0t80tncs4enqzgxt7v4eftcj pub: gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pqw2kkzujprgrfg7vumg85mccsf790n5ep6htpygkuwedwuumf2g7ydm4vqf, path: +``` + +The key response consists of a few pieces of information: + +- The name of the private key +- The derived address (`addr`) +- The public key (`pub`) + +Using these pieces of information, we can interact with Gno.land tools and write blockchain applications. + +## Generating a BIP39 mnemonic + +Using `gnokey`, we can generate a [mnemonic phrase](https://en.bitcoin.it/wiki/Seed_phrase) based on +the [BIP39 standard](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki). + +To generate the mnemonic phrase in the console, you can run: + +```bash +gnokey generate +``` + +![gnokey generate](../assets/getting-started/creating-a-key-pair/gnokey-generate.gif) + +## Adding a random private key + +If we wanted to add a new private key to the keystore, we can run the following command: + +```bash +gnokey add MyKey +``` + +Of course, you can replace `MyKey` with whatever name you want for your key. + +The `gnokey` tool will prompt you to enter a password to encrypt the key on disk (don't forget this!). +After you enter the password, the `gnokey` tool will add the key to the keystore, and return the accompanying [mnemonic +phrase](https://en.bitcoin.it/wiki/Seed_phrase), which you should remember somewhere if you want to recover the key at a +future point in time. + +![gnokey add random](../assets/getting-started/creating-a-key-pair/gnokey-add-random.gif) + +You can check that the key was indeed added to the keystore, by listing available keys: + +```bash +gnokey list +``` + +![gnokey list](../assets/getting-started/creating-a-key-pair/gnokey-list.gif) + +## Adding a private key using a mnemonic + +To add a private key to the `gnokey` keystore [using an existing mnemonic](#generating-a-bip39-mnemonic), we can run the +following command with the +`--recover` flag: + +```bash +gnokey add --recover MyKey +``` + +Of course, you can replace `MyKey` with whatever name you want for your key. + +By following the prompts to encrypt the key on disk, and providing a BIP39 mnemonic, we can successfully add +the key to the keystore. + +![gnokey add mnemonic](../assets/getting-started/creating-a-key-pair/gnokey-add-mnemonic.gif) + +## Deleting a private key + +To delete a private key from the `gnokey` keystore, we need to know the name or address of the key to remove. +After we have this information, we can run the following command: + +```bash +gnokey delete MyKey +``` + +After entering the key decryption password, the key will be deleted from the keystore. + +:::caution Recovering a private key +In case you delete or lose access to your private key in the `gnokey` keystore, you +can recover it using the key's mnemonic, or by importing it if it was exported at a previous point in time. +::: + +## Exporting a private key + +Private keys stored in the `gnokey` keystore can be exported to a desired place +on the user's filesystem. + +Keys are exported in their original armor, encrypted or unencrypted. + +To export a key from the keystore, you can run: + +```bash +gnokey export -key MyKey -output-path ~/Work/gno-key.asc +``` + +Follow the prompts presented in the terminal. Namely, you will be asked to decrypt the key in the keystore, +and later to encrypt the armor file on disk. It is worth noting that you can also export unencrypted key armor, using +the `--unsafe` flag. + +![gnokey export](../assets/getting-started/creating-a-key-pair/gnokey-export.gif) + +## Importing a private key + +If you have an exported private key file, you can import it into `gnokey` fairly easily. + +For example, if the key is exported at `~/Work/gno-key.asc`, you can run the following command: + +```bash +gnokey import -armor-path ~/Work/gno-key.asc -name ImportedKey +``` + +You will be asked to decrypt the encrypted private key armor on disk (if it is encrypted, if not, use the `--unsafe` +flag), and then to provide an encryption password for storing the key in the keystore. + +After executing the previous command, the `gnokey` keystore will have imported `ImportedKey`. + +![gnokey import](../assets/getting-started/creating-a-key-pair/gnokey-import.gif) diff --git a/docs/go-gno-compatibility.md b/docs/go-gno-compatibility.md deleted file mode 120000 index a15871f0340..00000000000 --- a/docs/go-gno-compatibility.md +++ /dev/null @@ -1 +0,0 @@ -../gnovm/docs/go-gno-compatibility.md \ No newline at end of file diff --git a/docs/how-to-guides/connect-wallet-dapp.md b/docs/how-to-guides/connect-wallet-dapp.md new file mode 100644 index 00000000000..294323b5560 --- /dev/null +++ b/docs/how-to-guides/connect-wallet-dapp.md @@ -0,0 +1,115 @@ +--- +id: connect-wallet-dapp +--- + +# How to connect a wallet to a dApp + +As a dapp developer, you must integrate a web3 wallet with your application to enable users to interact with your +application. Upon integration, you may retrieve account information of the connected user or request to sign & send +transactions from the user's account. + +:::warning Wallets on gno.land + +Here is a list of available wallets for Gnoland. +Note that none of these wallets are official or exclusive, so please +use them at your own diligence: + +- [Adena Wallet](https://adena.app/) + +::: + +## Adena Wallet + +[Adena](https://adena.app/) is a web extension wallet that supports the Gnoland blockchain. Below is the basic Adena +APIs that you can use for your application. For more detailed information, check out +Adena's [developer's docs](https://docs.adena.app/) to integrate Adena to your application. + +### Adena Connect For React App + +Check if Adena wallet exists. + +```javascript +// checks the existence of the adena object in window + +const existsWallet = () => { + if (window.adena) { + return true; + } + return false; +}; + +``` + +Register your website as a trusted domain. + +```javascript +// calls the AddEstablish of the adena object + +const addEstablish = (siteName) => { + return window?.adena?.AddEstablish(siteName); +}; + +``` + +Retrieve information about the connected account. + +```javascript +// calls the GetAccount function of the adena object + +const getAccount = () => { + return window.adena?.GetAccount(); +}; + +``` + +Request approval of a transaction that transfers tokens. + +```javascript +// Execute the DoContract function of the adena object to request transaction. + +const sendToken = (fromAddress, toAddress, sendAmount) => { + const message = { + type: "/bank.MsgSend", + value: { + from_address: fromAddress, + to_address: toAddress, + amount: sendAmount + } + }; + + return window.adena?.DoContract({ + messages: [message], + gasFee: 1, + gasWanted: 3000000 + }); +}; + +``` + +Request approval of a transaction that calls a function from a realm. + +```javascript +// Execute the DoContract function of the adena object to request transaction. + +const doContractPackageFunction = (caller, func, pkgPath, argument) => { + + // Setup Transaction Message + const message = { + type: "/vm.m_call", + value: { + caller, + func, + send: "", + pkg_path: pkgPath, + args: argument.split(',') + } + }; + + // Request Transaction + return window.adena?.DoContract({ + messages: [message], + gasFee: 1, + gasWanted: 3000000 + }); +}; +``` diff --git a/docs/how-to-guides/creating-grc20.md b/docs/how-to-guides/creating-grc20.md new file mode 100644 index 00000000000..437294882c3 --- /dev/null +++ b/docs/how-to-guides/creating-grc20.md @@ -0,0 +1,164 @@ +--- +id: creating-grc20 +--- + +# How to create a GRC20 Token + +## Overview + +This guide shows you how to write a simple _GRC20_ Smart Contract, or rather a [Realm](../explanation/realms.md), in [Gno (Gnolang)](../explanation/gno-language.md). For actually deploying the Realm, please see the [deployment](deploy.md) guide. + +Our _GRC20_ Realm will have the following functionality: + +- Minting a configurable amount of token. +- Keeping track of total token supply. +- Fetching the balance of an account. + +## Prerequisites + +We will proceed using the typical directory structure for a Realm found within the [simple-contract guide](simple-contract.md). It is also worthwhile to consult the [GRC20 interface](https://github.com/gnolang/gno/blob/master/examples/gno.land/p/demo/grc/grc20/igrc20.gno) which we will be importing and utilizing within this guide. + +## 1. Importing token package +For this realm, we'll want to import the `grc20` package as this will include the main functionality of our token factory realm. + +[embedmd]:# (../assets/how-to-guides/creating-grc20/mytoken-1.gno go) +```go +package mytoken + +import ( + "std" + + "gno.land/p/demo/grc/grc20" +) + +var ( + mytoken *grc20.AdminToken + admin std.Address = "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj" // set admin account +) + +// init is a constructor function that runs only once (at time of deployment) +func init() { + // provision the token's name, symbol and number of decimals + mytoken = grc20.NewAdminToken("Mytoken", "MTKN", 4) + + // set the total supply + mytoken.Mint(admin, 1000000*10000) // @administrator (supply = 1 million) +} +``` + +In this code preview, we have: +- Defined a new local variable `mytoken` and assigned that the type of pointer to `grc20.AdminToken`. +- Defined and set the value of local variable `admin` to point to a specific gno.land address of type `std.Address`. +- Set the value of `mytoken` (type `*AdminToken`) to equal the result of creating a new token and configuring its name, symbol + decimal representation. +- Minted 1 million `Mytoken` and set the administrator as the owner of these tokens. + +## 2. Adding token functionality + +The following section will be about introducing Public functions to expose functionality imported from the [grc20 package](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo/grc/grc20). + +[embedmd]:# (../assets/how-to-guides/creating-grc20/mytoken-2.gno go) +```go +func TotalSupply() uint64 { + return mytoken.TotalSupply() +} + +func BalanceOf(owner users.AddressOrName) uint64 { + balance, err := mytoken.BalanceOf(owner.Resolve()) + if err != nil { + panic(err) + } + return balance +} + +func Allowance(owner, spender users.AddressOrName) uint64 { + allowance, err := mytoken.Allowance(owner.Resolve(), spender.Resolve()) + if err != nil { + panic(err) + } + return allowance +} + +func Transfer(to users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + err := mytoken.Transfer(caller, to.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func Approve(spender users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + err := mytoken.Approve(caller, spender.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func TransferFrom(from, to users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + err := mytoken.TransferFrom(caller, from.Resolve(), to.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func Mint(address users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := mytoken.Mint(address.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func Burn(address users.AddressOrName, amount uint64) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := mytoken.Burn(address.Resolve(), amount) + if err != nil { + panic(err) + } +} + +func Render(path string) string { + parts := strings.Split(path, "/") + c := len(parts) + + switch { + case path == "": + return mytoken.RenderHome() + case c == 2 && parts[0] == "balance": + owner := users.AddressOrName(parts[1]) + balance, _ := mytoken.BalanceOf(owner.Resolve()) + return ufmt.Sprintf("%d\n", balance) + default: + return "404\n" + } +} + +func assertIsAdmin(address std.Address) { + if address != admin { + panic("restricted access") + } +} +``` + +Detailing what is happening in the above code: +- Calling the `TotalSupply` method would return the total number of tokens minted. +- Calling the `BalanceOf` method would return the total balance of an account. +- Calling the `Allowance` method would set an account as an allowed spender to serve on behalf of the owner. +- Calling the `transfer` method would transfer a configurable amount of token from the calling account to another account, either owned or unowned. +- Calling the `Approve` method would approve a calling account to spend a configurable amount of token on behalf of the token owner. +- Calling the `TransferFrom` method would transfer a configurable amount of token from an account that granted approval to another account, either owned or unowned. +- Calling the `Mint` method would create a configurable number of tokens by the administrator. +- Calling the `Burn` method would destroy a configurable number of tokens by the administrator. +- Calling the `Render` method would return a user's `balance` as a formatted string. Learn more about the `Render` + method and how it's used [here](../explanation/realms.md). +- Finally, we provide a local function to assert that the calling account is in fact the owner, otherwise panic. This is a very important function that serves to prevent abuse by non-administrators. + +## Conclusion + +That's it 🎉 + +You have successfully built a simple GRC20 Realm that is ready to be deployed on the Gno chain and called by users. +In the upcoming guides, we will see how we can develop more complex Realm logic and have them interact with outside tools like a wallet application. diff --git a/docs/how-to-guides/creating-grc721.md b/docs/how-to-guides/creating-grc721.md new file mode 100644 index 00000000000..e4ac695a71b --- /dev/null +++ b/docs/how-to-guides/creating-grc721.md @@ -0,0 +1,199 @@ +--- +id: creating-grc721 +--- + +# How to create a GRC721 Token (NFT) + +## Overview + +This guide shows you how to write a simple _GRC721_ Smart Contract, or rather a [Realm](../explanation/realms.md), +in [Gno (Gnolang)](../explanation/gno-language.md). For actually deploying the Realm, please see +the [deployment](deploy.md) guide. + +Our _GRC721_ Realm will have the following functionality: + +- Minting a configurable amount of token. +- Keeping track of total token supply. +- Fetching the balance of an account. + +## Prerequisites + +We will proceed using the typical directory structure for a Realm found within +the [simple-contract guide](simple-contract.md). It is also worthwhile to consult +the [GRC721 interface](https://github.com/gnolang/gno/blob/master/examples/gno.land/p/demo/grc/grc721/igrc721.gno) which we will be borrowing from within +this guide. + +## 1. Importing token package + +For this realm, we'll want to import the `grc20` package as this will include the main functionality of our token +factory realm. + +[embedmd]:# (../assets/how-to-guides/creating-grc721/mynonfungibletoken-1.gno go) +```go +package mynonfungibletoken + +import ( + "std" + + "gno.land/p/demo/grc/grc721" +) + +var ( + admin std.Address = "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj" // set admin account + // provision the token's name and symbol + mynonfungibletoken = grc721.NewBasicNFT("mynonfungibletoken", "MNFT") +) + +func init() { + mintNNFT(admin, 10) // @administrator (supply = 10) +} +``` + +In this code preview, we have: + +- Defined and set the value of `mynonfungibletoken` (type `*grc721.basicNFT`) to equal the result of creating a new + token and configuring its name and symbol. +- Defined and set the value of local variable `admin` to point to a specific gno.land address of type `std.Address`. +- Minted 5 `mynonfungibletoken (MNFT)` and set the administrator as the owner of these tokens + +## 2. Adding token functionality + +The following section will be about introducing Public functions to expose functionality imported from +the [grc721 package](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo/grc/grc721). + +[embedmd]:# (../assets/how-to-guides/creating-grc721/mynonfungibletoken-2.gno go) +```go +func mintNNFT(owner std.Address, n uint64) { + count := my.TokenCount() + for i := count; i < count+n; i++ { + tid := grc721.TokenID(ufmt.Sprintf("%d", i)) + mynonfungibletoken.Mint(owner, tid) + } +} + +// Getters + +func BalanceOf(user users.AddressOrName) uint64 { + balance, err := mynonfungibletoken.BalanceOf(user.Resolve()) + if err != nil { + panic(err) + } + + return balance +} + +func OwnerOf(tid grc721.TokenID) std.Address { + owner, err := mynonfungibletoken.OwnerOf(tid) + if err != nil { + panic(err) + } + + return owner +} + +func IsApprovedForAll(owner, user users.AddressOrName) bool { + return mynonfungibletoken.IsApprovedForAll(owner.Resolve(), user.Resolve()) +} + +func GetApproved(tid grc721.TokenID) std.Address { + addr, err := mynonfungibletoken.GetApproved(tid) + if err != nil { + panic(err) + } + + return addr +} + +// Setters + +func Approve(user users.AddressOrName, tid grc721.TokenID) { + err := mynonfungibletoken.Approve(user.Resolve(), tid) + if err != nil { + panic(err) + } +} + +func SetApprovalForAll(user users.AddressOrName, approved bool) { + err := mynonfungibletoken.SetApprovalForAll(user.Resolve(), approved) + if err != nil { + panic(err) + } +} + +func TransferFrom(from, to users.AddressOrName, tid grc721.TokenID) { + err := mynonfungibletoken.TransferFrom(from.Resolve(), to.Resolve(), tid) + if err != nil { + panic(err) + } +} + +// Admin + +func Mint(to users.AddressOrName, tid grc721.TokenID) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := mynonfungibletoken.Mint(to.Resolve(), tid) + if err != nil { + panic(err) + } +} + +func Burn(tid grc721.TokenID) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := mynonfungibletoken.Burn(tid) + if err != nil { + panic(err) + } +} + +// Render + +func Render(path string) string { + switch { + case path == "": + return mynonfungibletoken.RenderHome() + default: + return "404\n" + } +} + +// Util + +func assertIsAdmin(address std.Address) { + if address != admin { + panic("restricted access") + } +} +``` + +Detailing what is happening in the above code: + +- Calling the **local** `mintNNFT` method would mint a configurable number of tokens to the provided owner's account. +- Calling the `BalanceOf` method would return the total balance of an account. +- Calling the `OwnerOf` method would return the owner of the token based on the ID that is passed into the method. +- Calling the `IsApprovedByAll` method will return true if an operator is approved for all operations by the owner; + otherwise, returns false. +- Calling the `GetApproved` method will return the address approved to operate on the token. +- Calling the `Approve` method would approve the input address for a particular token. +- Calling the `SetApprovalForAll` method would approve an operating account to operate on all tokens. +- Calling the `TransferFrom` method would transfer a configurable amount of token from an account that granted approval + to another account, either owned or unowned. +- Calling the `Mint` method would create a configurable number of tokens by the administrator. +- Calling the `Burn` method would destroy a configurable number of tokens by the administrator. +- Calling the `Render` method on success would invoke + a [`RenderHome`](https://github.com/gnolang/gno/blob/master/examples/gno.land/p/demo/grc/grc721/basic_nft.gno#L353) + method on the `grc721` instance we instantiated at the top of the file; this method returns a formatted string that + includes the token: symbol, supply and account balances (`balances avl.Tree`) which is a mapping denoted + as: `OwnerAddress -> TokenCount`; otherwise returns false and renders a `404`; you can find more information about + this `Render` method and how it's used [here](../explanation/realms.md). +- Finally, we provide a local function to assert that the calling account is in fact the owner, otherwise panic. This is + a very important function that serves to prevent abuse by non-administrators. + +## Conclusion + +That's it 🎉 + +You have successfully built a simple GRC721 Realm that is ready to be deployed on the Gno chain and called by users. +In the upcoming guides, we will see how we can develop more complex Realm logic and have them interact with outside +tools like a wallet application. diff --git a/docs/how-to-guides/deploy.md b/docs/how-to-guides/deploy.md new file mode 100644 index 00000000000..ab31716f014 --- /dev/null +++ b/docs/how-to-guides/deploy.md @@ -0,0 +1,74 @@ +--- +id: deploy +--- + +# How to deploy a Realm / Package + +## Overview + +This guide shows you how to deploy any realm or package to the Gno chain. Deployment is be done by utilizing `gnokey`'s `maketx addpkg` API. + +:::info +Regardless of whether you're deploying a realm or a package, you will be using `gnokey`'s `maketx addpkg` - the usage of `maketx addpkg` in both cases is identical. +::: + +## Prerequisites + +- **Have `gnokey` installed** +- **Have access to a `gnoland` node (local or remote)** +- **Have generated a keypair with `gnokey` & funded it with `gnot`** +- **Have a Realm or Package ready to deploy** + +## Deploying + +To illustrate deployment, we will use a realm. Consider the following folder structure: + +``` +counter-app/ +├─ r/ +│ ├─ counter/ +│ │ ├─ counter.gno +``` + +We would like to deploy the realm found in `counter.gno`. To do this, open a terminal at `counter-app/` and use the following `gnokey` command: + +```bash +gnokey maketx addpkg \ +--pkgpath "gno.land/r/demo/counter" \ +--pkgdir "./r/counter" \ +--gas-fee 10000000ugnot \ +--gas-wanted 800000 \ +--broadcast \ +--chainid dev \ +--remote localhost:26657 \ +MyKey +``` + +Let's analyze all of the flags in detail: +- `--pkgpath` - path where the package/realm will be placed on-chain +- `--pkgdir` - local path where the package/realm is located +- `--gas-wanted` - the upper limit for units of gas for the execution of the transaction - similar to Solidity's gas limit +- `--gas-fee` - similar to Solidity's gas-price +- `--broadcast` - broadcast the transaction on-chain +- `--chain-id` - id of the chain to connect to - local or remote +- `--remote` - `gnoland` node endpoint - local or remote +- `MyKey` - the keypair to use for the transaction + +:::info +As of October 2023, `--gas-fee` is fixed to 1gnot (10000000ugnot), with plans to change it down the line. +::: + +Next, confirm the transaction with your keypair passphrase. If deployment was successful, you will be presented with a message similar to the following: + +``` +OK! +GAS WANTED: 800000 +GAS USED: 775097 +``` +Depending on the size of the package/realm, you might need to increase amount given in the `--gas-wanted` flag to cover the deployment cost. + +## Conclusion + +That's it 🎉 + +You have now successfully deployed a realm/package to a Gno.land chain. diff --git a/docs/how-to-guides/interact-with-gnoland.md b/docs/how-to-guides/interact-with-gnoland.md new file mode 100644 index 00000000000..dacfead2957 --- /dev/null +++ b/docs/how-to-guides/interact-with-gnoland.md @@ -0,0 +1,94 @@ +--- +id: interact-with-gnoland +--- + +# Interact with Gno.land + +This tutorial will teach you how to interact with the gno.land blockchain by creating an account and calling various realms to send transactions on the network. + +## Prerequisites + +- [Installation](../getting-started/local-setup.md) + +## Create an Account + +In order to interact with Gnoland, you need an account that you will use to sign and send transactions. You may create a new account with `gnokey generate` or recover an existing one with `gnokey add`. Confirm that your account was successfully added with `gnokey list` to display all accounts registered in the key base of your device. + +```bash +gnokey generate # create a new seed phrase (mnemonic) + +gnokey add -recover {your_account_name} # registers a key with the name set as the value you put in {your_account_name} with a seed phrase + +gnokey list # check the list of keys +``` + +## Register As a User + +```bash +gnokey maketx call \ + -gas-fee="1ugnot" \ + -gas-wanted="5000000" \ + -broadcast="true" \ + -remote="staging.gno.land:36657" \ + -chainid="test3" \ + -pkgpath="gno.land/r/demo/users" \ + -func="Register" \ + -args="" \ + -args="my_account" \ # (must be at least 6 characters, lowercase alphanumeric with underscore) + -args="" \ + -send="200000000ugnot" \ + my-account + +# username: must be at least 6 characters, lowercase alphanumeric with underscore +``` + +> **Note:** With a user registration fee of 200 GNOT and a gas fee that ranges up to 2 GNOT, you must have around 202 GNOT to complete this transaction. After registering as a user, you may replace your address with your `username` when developing or publishing a realm package. + +## Get Account Information + +```bash +# Get account information +gnokey query -remote="staging.gno.land:36657" "auth/accounts/{address}" + +# Get account balance +gnokey query -remote="staging.gno.land:36657" "bank/balances/{address}" + +# Get /r/demo/boards user information +gnokey query -remote="staging.gno.land:36657" -data "gno.land/r/demo/users +my_account" "vm/qrender" +``` + +## Send Tokens + +The following command will send 1,000,000 ugnot (= 1 GNOT) to the address specified in the `to` argument. + +```bash +# Creates and broadcast a token transfer transaction +gnokey maketx send \ + -gas-fee="1ugnot" \ + -gas-wanted="5000000" \ + -broadcast="true" \ + -remote="staging.gno.land:36657" \ + -chainid="test3" \ + -to="{address}" \ # g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 + -send="{amount}{denom}" \ # 1234ugnot + my-account +``` + +## Create a Board + +Try creating a board called `my_board` on the `gno.land/r/demo/boards` realm with the following command: + +```bash +# Calls the CreateBoard function of gno.land/r/demo/boards +gnokey maketx call \ + -gas-fee="1ugnot" \ + -gas-wanted="5000000" \ + -broadcast="true" \ + -remote "staging.gno.land:36657" \ + -chainid="test3" \ + -pkgpath="gno.land/r/demo/boards" \ + -func="CreateBoard" \ + -args="my_board" \ + my-account +``` diff --git a/docs/how-to-guides/porting-solidity-to-gno.md b/docs/how-to-guides/porting-solidity-to-gno.md new file mode 100644 index 00000000000..39c6910eda6 --- /dev/null +++ b/docs/how-to-guides/porting-solidity-to-gno.md @@ -0,0 +1,680 @@ +--- +id: port-solidity-to-gno +--- + +# Port a Solidity Contract to a Gnolang Realm + + +## Overview + +This guide shows you how to port a Solidity contract `Simple Auction` to a Gnolang Realm `auction.gno` with test cases (Test Driven Development (TDD) approach). + +You can check the Solidity contract in this [link](https://docs.soliditylang.org/en/latest/solidity-by-example.html#simple-open-auction), and here's the code for porting. + +```solidity +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.4; +contract SimpleAuction { + // Parameters of the auction. Times are either + // absolute unix timestamps (seconds since 1970-01-01) + // or time periods in seconds. + address payable public beneficiary; + uint public auctionEndTime; + + // Current state of the auction. + address public highestBidder; + uint public highestBid; + + // Allowed withdrawals of previous bids + mapping(address => uint) pendingReturns; + + // Set to true at the end, disallows any change. + // By default initialized to `false`. + bool ended; + + // Events that will be emitted on changes. + event HighestBidIncreased(address bidder, uint amount); + event AuctionEnded(address winner, uint amount); + + // Errors that describe failures. + + // The triple-slash comments are so-called natspec + // comments. They will be shown when the user + // is asked to confirm a transaction or + // when an error is displayed. + + /// The auction has already ended. + error AuctionAlreadyEnded(); + /// There is already a higher or equal bid. + error BidNotHighEnough(uint highestBid); + /// The auction has not ended yet. + error AuctionNotYetEnded(); + /// The function auctionEnd has already been called. + error AuctionEndAlreadyCalled(); + + /// Create a simple auction with `biddingTime` + /// seconds bidding time on behalf of the + /// beneficiary address `beneficiaryAddress`. + constructor( + uint biddingTime, + address payable beneficiaryAddress + ) { + beneficiary = beneficiaryAddress; + auctionEndTime = block.timestamp + biddingTime; + } + + /// Bid on the auction with the value sent + /// together with this transaction. + /// The value will only be refunded if the + /// auction is not won. + function bid() external payable { + // No arguments are necessary, all + // information is already part of + // the transaction. The keyword payable + // is required for the function to + // be able to receive Ether. + + // Revert the call if the bidding + // period is over. + if (block.timestamp > auctionEndTime) + revert AuctionAlreadyEnded(); + + // If the bid is not higher, send the + // money back (the revert statement + // will revert all changes in this + // function execution including + // it having received the money). + if (msg.value <= highestBid) + revert BidNotHighEnough(highestBid); + + if (highestBid != 0) { + // Sending back the money by simply using + // highestBidder.send(highestBid) is a security risk + // because it could execute an untrusted contract. + // It is always safer to let the recipients + // withdraw their money themselves. + pendingReturns[highestBidder] += highestBid; + } + highestBidder = msg.sender; + highestBid = msg.value; + emit HighestBidIncreased(msg.sender, msg.value); + } + + /// Withdraw a bid that was overbid. + function withdraw() external returns (bool) { + uint amount = pendingReturns[msg.sender]; + if (amount > 0) { + // It is important to set this to zero because the recipient + // can call this function again as part of the receiving call + // before `send` returns. + pendingReturns[msg.sender] = 0; + + // msg.sender is not of type `address payable` and must be + // explicitly converted using `payable(msg.sender)` in order + // use the member function `send()`. + if (!payable(msg.sender).send(amount)) { + // No need to call throw here, just reset the amount owing + pendingReturns[msg.sender] = amount; + return false; + } + } + return true; + } + + /// End the auction and send the highest bid + /// to the beneficiary. + function auctionEnd() external { + // It is a good guideline to structure functions that interact + // with other contracts (i.e. they call functions or send Ether) + // into three phases: + // 1. checking conditions + // 2. performing actions (potentially changing conditions) + // 3. interacting with other contracts + // If these phases are mixed up, the other contract could call + // back into the current contract and modify the state or cause + // effects (ether payout) to be performed multiple times. + // If functions called internally include interaction with external + // contracts, they also have to be considered interaction with + // external contracts. + + // 1. Conditions + if (block.timestamp < auctionEndTime) + revert AuctionNotYetEnded(); + if (ended) + revert AuctionEndAlreadyCalled(); + + // 2. Effects + ended = true; + emit AuctionEnded(highestBidder, highestBid); + + // 3. Interaction + beneficiary.transfer(highestBid); + } +} +``` + +These are the basic concepts of the Simple Auction contract: + +* Everyone can send their bids during a bidding period. +* The bids already include sending money / Ether in order to bind the bidders to their bids. +* If the highest bid is raised, the previous highest bidder gets their money back. +* After the end of the bidding period, the contract has to be called manually for the beneficiary to receive their money - contracts cannot activate themselves. + +The contract consists of: + +* A variable declaration +* Initialization by a constructor +* Three functions + +Let's dive into the details of the role of each function, and learn how to port each function into Gnolang with test cases. + +When writing a test case, the following conditions are often used to determine whether the function has been properly executed: + +* Value matching +* Error status +* Panic status + +Below is a test case helper that will help implement each condition. + +### Gnolang - Testcase Helper + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-1.gno go) +```go +func shouldEqual(t *testing.T, got interface{}, expected interface{}) { + t.Helper() + + if got != expected { + t.Errorf("expected %v(%T), got %v(%T)", expected, expected, got, got) + } +} + +func shouldErr(t *testing.T, err error) { + t.Helper() + if err == nil { + t.Errorf("expected an error, but got nil.") + } +} + +func shouldNoErr(t *testing.T, err error) { + t.Helper() + if err != nil { + t.Errorf("expected no error, but got err: %s.", err.Error()) + } +} + +func shouldPanic(t *testing.T, f func()) { + defer func() { + if r := recover(); r == nil { + t.Errorf("should have panic") + } + }() + f() +} + +func shouldNoPanic(t *testing.T, f func()) { + defer func() { + if r := recover(); r != nil { + t.Errorf("should not have panic") + } + }() + f() +} +``` + +## Variable init - Solidity + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-2.sol solidity) +```solidity +// Parameters of the auction. Times are either +// absolute unix timestamps (seconds since 1970-01-01) +// or time periods in seconds. +address payable public beneficiary; +uint public auctionEndTime; + +// Current state of the auction. +address public highestBidder; +uint public highestBid; + +// Allowed withdrawals of previous bids +mapping(address => uint) pendingReturns; + +// Set to true at the end, disallows any change. +// By default initialized to `false`. +bool ended; + +// Events that will be emitted on changes. +event HighestBidIncreased(address bidder, uint amount); +event AuctionEnded(address winner, uint amount); + +// Errors that describe failures. + +// The triple-slash comments are so-called natspec +// comments. They will be shown when the user +// is asked to confirm a transaction or +// when an error is displayed. + +/// The auction has already ended. +error AuctionAlreadyEnded(); +/// There is already a higher or equal bid. +error BidNotHighEnough(uint highestBid); +/// The auction has not ended yet. +error AuctionNotYetEnded(); +/// The function auctionEnd has already been called. +error AuctionEndAlreadyCalled(); + +/// Create a simple auction with `biddingTime` +/// seconds bidding time on behalf of the +/// beneficiary address `beneficiaryAddress`. +constructor( + uint biddingTime, + address payable beneficiaryAddress +) { + beneficiary = beneficiaryAddress; + auctionEndTime = block.timestamp + biddingTime; +} +``` + +* `address payable public beneficiary;` : Address to receive the amount after the auction's ending. +* `uint public auctionEndTime;` : Auction ending time. +* `address public highestBidder;` : The highest bidder. +* `uint public highestBid;` : The highest bid. +* `mapping(address => uint) pendingReturns;` : Bidder's address and amount to be returned (in case of the highest bid changes). +* `bool ended;` : Whether the auction is closed. + +### Variable init - Gnolang + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-3.gno go) +```go +var ( + receiver = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") + auctionEndBlock = std.GetHeight() + uint(300) // in blocks + highestBidder std.Address + highestBid = uint(0) + pendingReturns avl.Tree + ended = false +) +``` + +> **Note:** In Solidity, the Auction ending time is set by a time basis, but in the above case, it's set by a block basis. + +### + +## bid() - Solidity + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-4.sol solidity) +```solidity +function bid() external payable { + // No arguments are necessary, all + // information is already part of + // the transaction. The keyword payable + // is required for the function to + // be able to receive Ether. + + // Revert the call if the bidding + // period is over. + if (block.timestamp > auctionEndTime) + revert AuctionAlreadyEnded(); + + // If the bid is not higher, send the + // money back (the revert statement + // will revert all changes in this + // function execution including + // it having received the money). + if (msg.value <= highestBid) + revert BidNotHighEnough(highestBid); + + if (highestBid != 0) { + // Sending back the money by simply using + // highestBidder.send(highestBid) is a security risk + // because it could execute an untrusted contract. + // It is always safer to let the recipients + // withdraw their money themselves. + pendingReturns[highestBidder] += highestBid; + } + highestBidder = msg.sender; + highestBid = msg.value; + emit HighestBidIncreased(msg.sender, msg.value); +} +``` + +`bid()` function is for participating in an auction and includes: + +* Determining whether an auction is closed. +* Comparing a new bid with the current highest bid. +* Prepare data to return the bid amount to the existing highest bidder in case of the highest bid is increased. +* Update variables with the top bidder & top bid amount. + +### bid() - Gnolang + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-5.gno go) +```go +func Bid() { + if std.GetHeight() > auctionEndBlock { + panic("Exceeded auction end block") + } + + sentCoins := std.GetOrigSend() + if len(sentCoins) != 1 { + panic("Send only one type of coin") + } + + sentAmount := uint(sentCoins[0].Amount) + if sentAmount <= highestBid { + panic("Too few coins sent") + } + + // A new bid is higher than the current highest bid + if sentAmount > highestBid { + // If the highest bid is greater than 0, + if highestBid > 0 { + // Need to return the bid amount to the existing highest bidder + // Create an AVL tree and save + pendingReturns.Set(highestBidder.String(), highestBid) + } + + // Update the top bidder address + highestBidder = std.GetOrigCaller() + // Update the top bid amount + highestBid = sentAmount + } +} +``` + +### bid() - Gnolang Testcase + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-6.gno go) +```go +// Bid Function Test - Send Coin +func TestBidCoins(t *testing.T) { + // Sending two types of coins + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 0}, {"test", 1}}, nil) + shouldPanic(t, Bid) + + // Sending lower amount than the current highest bid + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 0}}, nil) + shouldPanic(t, Bid) + + // Sending more amount than the current highest bid (exceeded) + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldNoPanic(t, Bid) +} + +// Bid Function Test - Bid by two or more people +func TestBidCoins(t *testing.T) { + // bidder01 bidding with 1 coin + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldNoPanic(t, Bid) + shouldEqual(t, highestBid, 1) + shouldEqual(t, highestBidder, bidder01) + shouldEqual(t, pendingReturns.Size(), 0) + + // bidder02 bidding with 1 coin + std.TestSetOrigCaller(bidder02) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldPanic(t, Bid) + + // bidder02 bidding with 2 coins + std.TestSetOrigCaller(bidder02) + std.TestSetOrigSend(std.Coins{{"ugnot", 2}}, nil) + shouldNoPanic(t, Bid) + shouldEqual(t, highestBid, 2) + shouldEqual(t, highestBidder, bidder02) + shouldEqual(t, pendingReturns.Size(), 1) +} +``` + +### + +## withdraw() - Solidity + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-7.sol solidity) +```solidity +/// Withdraw a bid that was overbid. +function withdraw() external returns (bool) { + uint amount = pendingReturns[msg.sender]; + if (amount > 0) { + // It is important to set this to zero because the recipient + // can call this function again as part of the receiving call + // before `send` returns. + pendingReturns[msg.sender] = 0; + + // msg.sender is not of type `address payable` and must be + // explicitly converted using `payable(msg.sender)` in order + // use the member function `send()`. + if (!payable(msg.sender).send(amount)) { + // No need to call throw here, just reset the amount owing + pendingReturns[msg.sender] = amount; + return false; + } + } + return true; +} +``` + +`withdraw()` is to return the bid amount to the existing highest bidder in case of the highest bid changes and includes: + +* When called, determine if there's a bid amount to be returned to the address. +* (If there's an amount to be returned) Before returning, set the previously recorded amount to `0` and return the actual amount. + +### withdraw() - Gnolang + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-8.gno go) +```go +func Withdraw() { + // Query the return amount to non-highest bidders + amount, _ := pendingReturns.Get(std.GetOrigCaller().String()) + + if amount > 0 { + // If there's an amount, reset the amount first, + pendingReturns.Set(std.GetOrigCaller().String(), 0) + + // Return the exceeded amount + banker := std.GetBanker(std.BankerTypeRealmSend) + pkgAddr := std.GetOrigPkgAddr() + + banker.SendCoins(pkgAddr, std.GetOrigCaller(), std.Coins{{"ugnot", amount.(int64)}}) + } +} +``` + +### + +### withdraw() - Gnolang Testcase + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-9.gno go) +```go +// Withdraw Function Test +func TestWithdraw(t *testing.T) { + // If there's no participants for return + shouldEqual(t, pendingReturns.Size(), 0) + + // If there's participants for return (data generation + returnAddr := bidder01.String() + returnAmount := int64(3) + pendingReturns.Set(returnAddr, returnAmount) + shouldEqual(t, pendingReturns.Size(), 1) + shouldEqual(t, pendingReturns.Has(returnAddr), true) + + banker := std.GetBanker(std.BankerTypeRealmSend) + pkgAddr := std.GetOrigPkgAddr() + banker.SendCoins(pkgAddr, std.Address(returnAddr), std.Coins{{"ugnot", returnAmount}}) + shouldEqual(t, banker.GetCoins(std.Address(returnAddr)).String(), "3ugnot") +} +``` + +## auctionEnd() - Solidity + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-10.sol solidity) +```solidity +/// End the auction and send the highest bid +/// to the beneficiary. +function auctionEnd() external { + // It is a good guideline to structure functions that interact + // with other contracts (i.e. they call functions or send Ether) + // into three phases: + // 1. checking conditions + // 2. performing actions (potentially changing conditions) + // 3. interacting with other contracts + // If these phases are mixed up, the other contract could call + // back into the current contract and modify the state or cause + // effects (ether payout) to be performed multiple times. + // If functions called internally include interaction with external + // contracts, they also have to be considered interaction with + // external contracts. + + // 1. Conditions + if (block.timestamp < auctionEndTime) + revert AuctionNotYetEnded(); + if (ended) + revert AuctionEndAlreadyCalled(); + + // 2. Effects + ended = true; + emit AuctionEnded(highestBidder, highestBid); + + // 3. Interaction + beneficiary.transfer(highestBid); +} +``` + +`auctionEnd()` function is for ending the auction and includes: + +* Determines if the auction should end by comparing the end time. +* Determines if the auction has already ended or not. + * (If not ended) End the auction. + * (If not ended) Send the highest bid amount to the recipient. + +### auctionEnd() - Gnolang + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-11.gno go) +```go +func AuctionEnd() { + if std.GetHeight() < auctionEndBlock { + panic("Auction hasn't ended") + } + + if ended { + panic("Auction has ended") + + } + ended = true + + // Send the highest bid to the recipient + banker := std.GetBanker(std.BankerTypeRealmSend) + pkgAddr := std.GetOrigPkgAddr() + + banker.SendCoins(pkgAddr, receiver, std.Coins{{"ugnot", int64(highestBid)}}) +} +``` + +### auctionEnd() - Gnolang Testcase + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-12.gno go) +```go +// AuctionEnd() Function Test +func TestAuctionEnd(t *testing.T) { + // Auction is ongoing + shouldPanic(t, AuctionEnd) + + // Auction ends + highestBid = 3 + std.TestSkipHeights(500) + shouldNoPanic(t, AuctionEnd) + shouldEqual(t, ended, true) + + banker := std.GetBanker(std.BankerTypeRealmSend) + shouldEqual(t, banker.GetCoins(receiver).String(), "3ugnot") + + // Auction has already ended + shouldPanic(t, AuctionEnd) + shouldEqual(t, ended, true) +} +``` + +## Precautions for Running Test Cases + +* Each test function should be executed separately one by one, to return all passes without any errors. +* Same as Golang, Gnolang doesn't support `setup()` & `teardown()` functions. So running two or more test functions simultaneously can result in tainted data. +* If you want to do the whole test at once, make it into a single function as below: + +[embedmd]:# (../assets/how-to-guides/porting-solidity-to-gno/porting-13.gno go) +```go +// The whole test +func TestFull(t *testing.T) { + bidder01 := testutils.TestAddress("bidder01") // g1vf5kger9wgcrzh6lta047h6lta047h6lufftkw + bidder02 := testutils.TestAddress("bidder02") // g1vf5kger9wgcryh6lta047h6lta047h6lnhe2x2 + + // Variables test + { + shouldEqual(t, highestBidder, "") + shouldEqual(t, receiver, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") + shouldEqual(t, auctionEndBlock, 423) + shouldEqual(t, highestBid, 0) + shouldEqual(t, pendingReturns.Size(), 0) + shouldEqual(t, ended, false) + } + + // Send two or more types of coins + { + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 0}, {"test", 1}}, nil) + shouldPanic(t, Bid) + } + + // Send less than the highest bid + { + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 0}}, nil) + shouldPanic(t, Bid) + } + + // Send more than the highest bid + { + std.TestSetOrigCaller(bidder01) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldNoPanic(t, Bid) + + shouldEqual(t, pendingReturns.Size(), 0) + shouldEqual(t, highestBid, 1) + shouldEqual(t, highestBidder, "g1vf5kger9wgcrzh6lta047h6lta047h6lufftkw") + } + + // Other participants in the auction + { + + // Send less amount than the current highest bid (current: 1) + std.TestSetOrigCaller(bidder02) + std.TestSetOrigSend(std.Coins{{"ugnot", 1}}, nil) + shouldPanic(t, Bid) + + // Send more amount than the current highest bid (exceeded) + std.TestSetOrigCaller(bidder02) + std.TestSetOrigSend(std.Coins{{"ugnot", 2}}, nil) + shouldNoPanic(t, Bid) + + shouldEqual(t, highestBid, 2) + shouldEqual(t, highestBidder, "g1vf5kger9wgcryh6lta047h6lta047h6lnhe2x2") + + shouldEqual(t, pendingReturns.Size(), 1) // Return to the existing bidder + shouldEqual(t, pendingReturns.Has("g1vf5kger9wgcrzh6lta047h6lta047h6lufftkw"), true) + } + + // Auction ends + { + std.TestSkipHeights(150) + shouldPanic(t, AuctionEnd) + shouldEqual(t, ended, false) + + std.TestSkipHeights(301) + shouldNoPanic(t, AuctionEnd) + shouldEqual(t, ended, true) + + banker := std.GetBanker(std.BankerTypeRealmSend) + shouldEqual(t, banker.GetCoins(receiver).String(), "2ugnot") + } +} +``` diff --git a/docs/how-to-guides/simple-contract.md b/docs/how-to-guides/simple-contract.md new file mode 100644 index 00000000000..0e77a6a75e1 --- /dev/null +++ b/docs/how-to-guides/simple-contract.md @@ -0,0 +1,149 @@ +--- +id: simple-contract +--- + +# How to write a simple Gno Smart Contract (Realm) + +## Overview + +This guide shows you how to write a simple _Counter_ Smart Contract, or rather a [Realm](../explanation/realms.md), +in [Gno (Gnolang)](../explanation/gno-language.md). For actually deploying the Realm, please see +the [deployment](deploy.md) guide. + +Our _Counter_ Realm will have the following functionality: + +- Keeping track of the current count. +- Incrementing / decrementing the count. +- Fetching the current count value. + +## Prerequisites + +- **Text editor** + +:::info Editor support +The Gno language is based on Golang, but it does not have all the bells and whistles in major text editors like Go. +Advanced language features like IntelliSense are still in the works. + +Currently, we officially have language support +for [ViM](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support), +[Emacs](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#emacs-support) +and [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=harry-hov.gno). +::: + +## 1. Setting up the work directory + +Gno Realms can be typically written anywhere, under any structure, just like regular Go code. +However, Gno developers have adopted a standard of organizing Gno logic under a specific directory hierarchy, which we +will explore here. + +Create the main working directory for our Realm: + +```bash +mkdir counter-app +``` + +Since we are building a simple _Counter_ Realm, inside our created `counter-app` directory, we can create another +directory named `r`, which stands for `realm`: + +```bash +cd counter-app +mkdir r +``` + +Alternatively, if we were writing a [Gno Package](../explanation/packages.md), we would denote this directory name +as `p` (for `package`). You can learn more about Packages in our [Package development guide](simple-library.md). + +Additionally, we will create another sub-folder that will house our Realm code, named `counter`: + +```bash +cd r +mkdir counter +``` + +After setting up our work directory structure, we should have something like this: + +```text +counter-app/ +├─ r/ +│ ├─ counter/ +│ │ ├─ // source code here +``` + +## 2. Create `counter.gno` + +Now that the work directory structure is set up, we can go into the `counter` sub-folder, and actually create +our _Counter_ Smart Contract: + +```bash +cd counter +touch counter.gno +``` + +:::info Gno file extension +All Gno (Gnolang) source code has the file extension `.gno`. + +This file extension is required for existing gno tools and processes to work. +::: + +We can finally write out the logic of the _Counter_ Smart Contract in `counter.gno`: + +[embedmd]:# (../assets/how-to-guides/simple-contract/counter.gno go) +```go +package counter + +import "fmt" + +var count int + +func Increment() { + count++ +} + +func Decrement() { + count-- +} + +func Render(_ string) string { + return fmt.Sprintf("Count: %d", count) +} +``` + +There are a few things happening here, so let's dissect them: + +- We defined the logic of our Realm into a package called `counter`. +- The package-level `count` variable stores the active count for the Realm (it is stateful). +- `Increment` and `Decrement` are public Realm (Smart Contract) methods, and as such are callable by users. +- `Increment` and `Decrement` directly modify the `count` value by making it go up or down (change state). +- Calling the `Render` method would return the `count` value as a formatted string. Learn more about the `Render` + method and how it's used [here](../explanation/realms.md). + +:::info A note on constructors +Gno Realms support a concept taken from other programming languages - _constructors_. + +For example, to initialize the `count` variable with custom logic, we can specify that +logic within an `init` method, that is run **only once** on Realm deployment: + +[embedmd]:# (../assets/how-to-guides/simple-contract/init.gno go) +```go +package counter + +var count int + +// ... + +func init() { + count = 2 * 10 // arbitrary value +} + +// ... +``` + +::: + +## Conclusion + +That's it 🎉 + +You have successfully built a simple _Counter_ Realm that is ready to be deployed on the Gno chain and called by users. +In the upcoming guides, we will see how we can develop more complex Realm logic and have them interact +with outside tools like a wallet application. diff --git a/docs/how-to-guides/simple-library.md b/docs/how-to-guides/simple-library.md new file mode 100644 index 00000000000..3ed4ad11754 --- /dev/null +++ b/docs/how-to-guides/simple-library.md @@ -0,0 +1,133 @@ +--- +id: simple-library +--- + +# How to write a simple Gno Library (Package) + +## Overview + +This guide shows you how to write a simple library (Package) in Gnolang, which can be used by other Packages and Realms. +Packages are _stateless_, meaning they do not hold state like regular Realms (Smart Contracts). To learn more about the +intricacies of Packages, please see the [Packages reference](../explanation/packages.md). + +The Package we will be writing today will be a simple library for suggesting a random tapas dish. +We will define a set list of tapas, and define a method that randomly selects a dish from the list. + +## Prerequisites + +- **Text editor** + +:::info Editor support +The Gno language is based on Golang, but it does not have all the bells and whistles in major text editors like Go. +Advanced language features like IntelliSense are still in the works. + +Currently, we officially have language support +for [ViM](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support), +[Emacs](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#emacs-support) +and [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=harry-hov.gno). +::: + +## 1. Setting up the work directory + +We discussed Gno folder structures more in detail in +the [simple Smart Contract guide](simple-contract.md#1-setting-up-the-work-directory). +For now, we will just follow some rules outlined there. + +Create the main working directory for our Package: + +```bash +mkdir tapas-lib +``` + +Since we are building a simple tapas Package, inside our created `tapas-lib` directory, we can create another +directory named `p`, which stands for `package`: + +```bash +cd tapas-lib +mkdir p +``` + +Additionally, we will create another subdirectory that will house our Package code, named `tapas`: + +```bash +cd p +mkdir tapas +``` + +After setting up our work directory structure, we should have something like this: + +```text +tapas-lib/ +├─ p/ +│ ├─ tapas/ +│ │ ├─ // source code here +``` + +## 2. Create `tapas.gno` + +Now that the work directory structure is set up, we can go into the `tapas` sub-folder, and actually create +our tapas suggestion library logic: + +```bash +cd tapas +touch tapas.gno +``` + +Inside `tapas.gno`, we will define our library logic: + +[embedmd]:# (../assets/how-to-guides/simple-library/tapas.gno go) +```go +package tapas + +import ( + "gno.land/p/demo/rand" +) + +// List of tapas suggestions +var listOfTapas = []string{ + "Patatas Bravas", + "Gambas al Ajillo", + "Croquetas", + "Tortilla Española", + "Pimientos de Padrón", + "Jamon Serrano", + "Boquerones en Vinagre", + "Calamares a la Romana", + "Pulpo a la Gallega", + "Tostada con Tomate", + "Mejillones en Escabeche", + "Chorizo a la Sidra", + "Cazón en Adobo", + "Banderillas", + "Espárragos a la Parrilla", + "Huevos Rellenos", + "Tuna Empanada", + "Sardinas a la Plancha", +} + +// GetTapaSuggestion randomly selects and returns a tapa suggestion +func GetTapaSuggestion() string { + // Create a new instance of the random number generator. + // Notice that this is from an imported Gno library + generator := rand.New() + + // Generate a random index + randomIndex := generator.Intn(len(listOfTapas)) + + // Return the random suggestion + return listOfTapas[randomIndex] +} +``` + +There are a few things happening here, so let's dissect them: + +- We defined the logic of our library into a package called `tapas`. +- The package imports another gno package, which is deployed at `gno.land/p/demo/rand` +- We use the imported package inside of `GetTapaSuggestion` to generate a random index value for a tapa + +## Conclusion + +That's it 🎉 + +You have successfully built a simple tapas suggestion Package that is ready to be deployed on the Gno chain and imported +by other Packages and Realms. diff --git a/docs/how-to-guides/testing-gno.md b/docs/how-to-guides/testing-gno.md new file mode 100644 index 00000000000..8bb6f1bf451 --- /dev/null +++ b/docs/how-to-guides/testing-gno.md @@ -0,0 +1,185 @@ +--- +id: testing-gno +--- + +# How to test Gno Code + +## Overview + +In this guide, we will explore the available tooling in testing out the Gno Realms and Packages we write. +We will go over different CLI tools available to developers, gno testing libraries as well as +testing techniques that involve data mocking. + +## Prerequisites + +- **`gno` set up. Reference the [Installation](../getting-started/local-setup.md#3-installing-other-gno-tools) guide + for steps** + +## Example Realm + +For the purpose of this guide, we will be testing the simple *Counter* Realm created in +the [How to write a simple Gno Smart Contract (Realm)](simple-contract.md) guide. + +[embedmd]:# (../assets/how-to-guides/testing-gno/counter-1.gno go) +```go +// counter-app/r/counter/counter.gno + +package counter + +import "fmt" + +var count int + +func Increment() { + count++ +} + +func Decrement() { + count-- +} + +func Render(_ string) string { + return fmt.Sprintf("Count: %d", count) +} +``` + +## 1. Writing the Gno test + +Gno tests are written in the same manner and format as regular Go tests, just in `_test.gno` files. + +We can place the Gno tests for the `Counter` Realm in the same directory as `counter.gno`: + +```text +counter-app/ +├─ r/ +│ ├─ counter/ +│ │ ├─ counter.gno +│ │ ├─ counter_test.gno <--- the test source code +``` + +```bash +cd counter +touch counter_test.gno +``` + +What should be tested in this _Counter_ Realm example? +Mainly, we want to verify that: + +- Increment increments the value. +- Decrement decrements the value. +- Render returns a valid formatted value. + +Let's write the required unit tests: + +[embedmd]:# (../assets/how-to-guides/testing-gno/counter-2.gno go) +```go +// counter-app/r/counter/counter_test.gno + +package counter + +import "testing" + +func TestCounter_Increment(t *testing.T) { + // Reset the value + count = 0 + + // Verify the initial value is 0 + if count != 0 { + t.Fatalf("initial value != 0") + } + + // Increment the value + Increment() + + // Verify the initial value is 1 + if count != 1 { + t.Fatalf("initial value != 1") + } +} + +func TestCounter_Decrement(t *testing.T) { + // Reset the value + count = 0 + + // Verify the initial value is 0 + if count != 0 { + t.Fatalf("initial value != 0") + } + + // Decrement the value + Decrement() + + // Verify the initial value is 1 + if count != -1 { + t.Fatalf("initial value != -1") + } +} + +func TestCounter_Render(t *testing.T) { + // Reset the value + count = 0 + + // Verify the Render output + if Render("") != "Count: 0" { + t.Fatalf("invalid Render value") + } +} +``` + +:::warning Testing package-level variables + +In practice, it is not advisable to test and validate package level variables like this, as their value is mutated +between test runs. For the sake of keeping this guide simple, we went ahead and reset the variable value for each test, +however, +you should employ more robust test strategies. + +::: + +## 2. Running the Gno test + +To run the prepared Gno tests, we can utilize the `gno test` CLI tool. + +Simply point it to the location containing our testing source code, and the tests will execute. +For example, we can run the following command from the `counter-app/r/counter` directory: + +```bash +gno test -verbose -root-dir /Users/zmilos/Work/gno . +``` + +Let's look into the different parts of this command: + +- `-verbose` enables the verbose output. +- `-root-dir` specifies the root directory to our cloned `gno` GitHub repository +- `.` specifies the location containing our test files. Since we are already located in that directory, we specify + a `.`. + +Running the test command should produce a successful output: + +```bash +=== RUN TestCounter_Increment +--- PASS: TestCounter_Increment (0.00s) +=== RUN TestCounter_Decrement +--- PASS: TestCounter_Decrement (0.00s) +=== RUN TestCounter_Render +--- PASS: TestCounter_Render (0.00s) +ok ./. 1.00s +``` + +## Additional test support + +As we grow more familiar with Gno development, our Realm / Package logic can become more complex. As such, we need +more robust testing support in the form of mocking values ahead of time that would normally be only available on a +live (deployed) Realm / Package. + +Luckily, the Gno standard library provides ample support for functionality such as setting predefined values ahead of +time, such as the request caller address, or the calling package address. + +You can learn more about these methods, that are importable using the `std` import declaration, +in the [Standard Library](../reference/standard-library.md) reference section. + +## Conclusion + +That's it 🎉 + +You have successfully written and tested Gno code. Additionally, you have utilized the `gno test` tool, and understood +how it can be configured to make the developer experience smooth. diff --git a/docs/how-to-guides/write-simple-dapp.md b/docs/how-to-guides/write-simple-dapp.md new file mode 100644 index 00000000000..4c5c5fce032 --- /dev/null +++ b/docs/how-to-guides/write-simple-dapp.md @@ -0,0 +1,301 @@ +--- +id: write-simple-dapp +--- + +# How to write a simple dApp on Gno.land + +## Overview + +This guide will show you how to write a complete dApp that combines both a package and a realm. +Our app will allow any user to create a poll, and subsequently vote +YAY or NAY for any poll that has not exceeded the voting deadline. + +## Prerequisites + +- **Text editor** + +## Defining dApp functionality + +Our dApp will consist of a Poll package, which will handle all things related to the Poll struct, +and a Poll Factory realm, which will handle the user-facing functionality and rendering. + +For simplicity, we will define the functionality in plain text, and leave comments explaining the code. + +### Poll Package + +- Defines a `Poll` struct +- Defines a `NewPoll` constructor +- Defines `Poll` field getters +- Defines a `Vote` function +- Defines a `HasVoted` check method +- Defines a `VoteCount` getter method + +[embedmd]:# (../assets/how-to-guides/write-simple-dapp/poll-1.gno go) +```go +package poll + +import ( + "std" + + "gno.land/p/demo/avl" +) + +// Main struct +type Poll struct { + title string + description string + deadline int64 // block height + voters *avl.Tree // addr -> yes / no (bool) +} + +// Getters +func (p Poll) Title() string { + return p.title +} + +func (p Poll) Description() string { + return p.description +} + +func (p Poll) Deadline() int64 { + return p.deadline +} + +func (p Poll) Voters() *avl.Tree { + return p.voters +} + +// Poll instance constructor +func NewPoll(title, description string, deadline int64) *Poll { + return &Poll{ + title: title, + description: description, + deadline: deadline, + voters: avl.NewTree(), + } +} + +// Vote Votes for a user +func (p *Poll) Vote(voter std.Address, vote bool) { + p.Voters().Set(string(voter), vote) +} + +// HasVoted vote: yes - true, no - false +func (p *Poll) HasVoted(address std.Address) (bool, bool) { + vote, exists := p.Voters().Get(string(address)) + if exists { + return true, vote.(bool) + } + return false, false +} + +// VoteCount Returns the number of yay & nay votes +func (p Poll) VoteCount() (int, int) { + var yay int + + p.Voters().Iterate("", "", func(key string, value interface{}) bool { + vote := value.(bool) + if vote == true { + yay = yay + 1 + } + }) + return yay, p.Voters().Size() - yay +} +``` + +A few remarks: + +- We are using the `std` library for accessing blockchain-related functionality and types, such as `std.Address`. +- Since the `map` data type is not deterministic in Go, we need to use the AVL tree structure, defined + under `p/demo/avl`. + It behaves similarly to a map; it maps a key of type `string` onto a value of any type - `interface{}`. +- We are importing the `p/demo/avl` package directly from on-chain storage, which can be accessed through the + path `gno.land/`. + As of October 2023, you can find already-deployed packages & libraries which provide additional Gno functionality in + the [monorepo](https://github.com/gnolang/gno), under the `examples/gno.land` folder. + +:::info +After testing the `Poll` package, we need to deploy it in order to use it in our realm. +Check out the [deployment](deploy.md) guide to learn how to do this. +::: + +### Poll Factory Realm + +Moving on, we can create the Poll Factory realm. + +The realm will contain the following functionality: + +- An exported `NewPoll` method, to allow users to create polls +- An exported `Vote` method, to allow users to pledge votes for any active poll +- A `Render` function to display the realm state + +[embedmd]:# (../assets/how-to-guides/write-simple-dapp/poll-2.gno go) +```go +package poll + +import ( + "std" + + "gno.land/p/demo/avl" + "gno.land/p/demo/poll" + "gno.land/p/demo/ufmt" +) + +// state variables +var ( + polls *avl.Tree // id -> Poll + pollIDCounter int +) + +func init() { + polls = avl.NewTree() + pollIDCounter = 0 +} + +// NewPoll - Creates a new Poll instance +func NewPoll(title, description string, deadline int64) string { + // get block height + if deadline <= std.GetHeight() { + return "Error: Deadline has to be in the future." + } + + // convert int ID to string used in AVL tree + id := ufmt.Sprintf("%d", pollIDCounter) + p := poll.NewPoll(title, description, deadline) + + // add new poll in avl tree + polls.Set(id, p) + + // increment ID counter + pollIDCounter = pollIDCounter + 1 + + return ufmt.Sprintf("Successfully created poll #%s!", id) +} + +// Vote - vote for a specific Poll +// yes - true, no - false +func Vote(pollID int, vote bool) string { + // get txSender + txSender := std.GetOrigCaller() + + id := ufmt.Sprintf("%d", pollID) + // get specific Poll from AVL tree + pollRaw, exists := polls.Get(id) + + if !exists { + return "Error: Poll with specified doesn't exist." + } + + // cast Poll into proper format + poll, _ := pollRaw.(*poll.Poll) + + voted, _ := poll.HasVoted(txSender) + if voted { + return "Error: You've already voted!" + } + + if poll.Deadline() <= std.GetHeight() { + return "Error: Voting for this poll is closed." + } + + // record vote + poll.Vote(txSender, vote) + + // update Poll in tree + polls.Set(id, poll) + + if vote == true { + return ufmt.Sprintf("Successfully voted YAY for poll #%s!", id) + } + return ufmt.Sprintf("Successfully voted NAY for poll #%s!", id) +} +``` + +With that we have written the core functionality of the realm, and all that is left is +the [Render function](http://localhost:3000/explanation/realms). +Its purpose is to help us display the state of the realm in Markdown, by formatting the state into a string buffer: + +[embedmd]:# (../assets/how-to-guides/write-simple-dapp/poll-3.gno go) +```go +func Render(path string) string { + var b bytes.Buffer + + b.WriteString("# Polls!\n\n") + + if polls.Size() == 0 { + b.WriteString("### No active polls currently!") + return b.String() + } + polls.Iterate("", "", func(key string, value interface{}) bool { + + // cast raw data from tree into Poll struct + p := value.(*poll.Poll) + ddl := p.Deadline() + + yay, nay := p.VoteCount() + yayPercent := 0 + nayPercent := 0 + + if yay+nay != 0 { + yayPercent = yay * 100 / (yay + nay) + nayPercent = nay * 100 / (yay + nay) + } + + b.WriteString( + ufmt.Sprintf( + "## Poll #%s: %s\n", + key, // poll ID + p.Title(), + ), + ) + + dropdown := "
\nPoll details
" + + b.WriteString(dropdown + "Description: " + p.Description()) + + b.WriteString( + ufmt.Sprintf("
Voting until block: %d
Current vote count: %d", + p.Deadline(), + p.Voters().Size()), + ) + + b.WriteString( + ufmt.Sprintf("
YAY votes: %d (%d%%)", yay, yayPercent), + ) + b.WriteString( + ufmt.Sprintf("
NAY votes: %d (%d%%)
", nay, nayPercent), + ) + + dropdown = "
\nVote details" + b.WriteString(dropdown) + + p.Voters().Iterate("", "", func(key string, value interface{}) bool { + + voter := key + vote := value.(bool) + + if vote == true { + b.WriteString( + ufmt.Sprintf("
%s voted YAY!", voter), + ) + } else { + b.WriteString( + ufmt.Sprintf("
%s voted NAY!", voter), + ) + } + return false + }) + + b.WriteString("
\n\n") + return false + }) + return b.String() +} +``` + +## Conclusion + +That's it 🎉 + +You have successfully built a simple but fully-fledged dApp using Gno! +Now you're ready to conquer new, more complex dApps in Gno. diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 00000000000..50e07442ea0 --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,45 @@ +--- +id: overview +slug: / +--- + +# Overview + +## What is Gno.land? + +Gno.land is a Layer 1 blockchain platform that enables the execution of Smart Contracts using an interpreted +version of the Go programming language called Gnolang (Gno for short). + +### Key Features and Technology + +1. **Interpreted Gnolang**: Gno.land utilizes the Gnolang programming language, which is based on Go. It is executed + through a specialized virtual machine called the GnoVM, purpose-built for blockchain development with built-in + determinism and a modified standard library. While Gnolang + shares similarities with Go in terms of syntax, it currently lacks go routine support. However, this feature is + planned for future development, ensuring deterministic GnoVM executions. +2. **Consensus Protocol - Tendermint2**: Gno.land achieves consensus between blockchain nodes using the Tendermint2 + consensus protocol. This approach ensures secure and reliable network operation. +3. **Inter-Blockchain Communication (IBC)**: In the future, Gno.land will be able to communicate and exchange data with + other blockchain networks within the Cosmos ecosystem through the Inter-Blockchain Communication (IBC) protocol. + +### Why Go-based? + +The decision to base Gno.land's language on Go was influenced by the following factors: + +1. **Standard and Secure Language**: Go is a well-established and secure programming language, widely adopted in the + software development community. By leveraging Go's features, Gno.land benefits from a robust and proven foundation. +2. **User-Friendly**: Go's simplicity and ease of understanding make it beginner-friendly. This accessibility lowers the + entry barrier for developers to create Smart Contracts on the Gno.land platform. + +### How does it compare with Ethereum? + +In comparison to Ethereum, Gno.land offers distinct advantages: + +1. **Transparent and Auditable Smart Contracts**: Gno.land Smart Contracts are fully transparent and auditable by users + because the actual source code is uploaded to the blockchain. In contrast, Ethereum requires contracts to be + precompiled into bytecode, leading to less transparency as bytecode is stored on the blockchain, not the + human-readable source code. + +2. **General-Purpose Language**: Gno.land's Gnolang is a general-purpose language, similar to Go, extending its + usability beyond the context of blockchain. In contrast, Solidity is designed specifically for Smart Contracts on the + Ethereum platform. diff --git a/docs/peace.md b/docs/peace.md deleted file mode 100644 index e76faae1ca3..00000000000 --- a/docs/peace.md +++ /dev/null @@ -1,242 +0,0 @@ -# Peace! - -_or, Everyone is Invited to Gno.land, if you want!_ - -I've never been put in such a difficult position, of having information that I -cannot reveal. And if you know me, you know that I like to speak my mind. But -I cannot say the things that I would rather say, because you get a lot of flack -for saying anything bad about a public chain. - -So I have been sitting on this issue, losing sleep about it for years, because -it leads me to worry about the safety of the hub. From an external person's -point of view, the solution is obvious -- reveal the information for the -betterment of everyone, no matter the consequences, because that is the right -thing to do. As a stakeholder, and I agree with the majority of the community -that peace and silence is better, with exceptions. - -So without turning this into a war of accusations bringing back past drama, -let's just do this: dear core contributors, Ethan Buchman, Zaki Manian, Jack -Zampolin, and everyone, here is my peace plan. - ----------------------------------------- - -## On Prop 69 - -Prop 69 is about adding CosmWASM to the hub. I have repeatedly talked about -the dangers of adding CosmWASM to the hub, including a document shared two -years ago. - -https://github.com/jaekwon/cosmos_roadmap/tree/master/shape_of_cosmos#smart-contracts - -Even before prop 69, I had declared publicly that stakers voting yes to adding -WASM on the hub would not receive airdrops. Primarily, because it increases -the surface area for attack by an order of magnitude. CosmWASM adds two layers -of new complexity to the hub. WASM itself, as well as CosmWASM. WASM as a spec -and its implementations are still maturing, and though available on browsers, -and some blockchains, it still hasn't gone through the gauntlet of time. All -new complex technologies like WASM, Java, Linux, and even Go, in hindsight -have numerous bugs that could have or were used maliciously. The same will be -true of any WASM integration with the hub, and this potential for exploits -combined with the massive potential rewards (especially of pegged PoW tokens) -makes such exploits an inevitability. - -In Juno recently there was a bug that halted the chain for three days. Worse -can happen on the Cosmos Hub. The very identity of the Cosmos Hub (its most -valuable asset is specifically a schelling point brand, of being a "common IBC -hub") is threatened if a bug were to result in the theft or loss of coins. On -platforms like Ethereum or Polkadot, perhaps they would have a better time -rolling back the chain to undo a hack as in the DAO hack. The major difference -with an *IBC hub* is that it cannot simply reverse the transactions of other -chains. - -We have yet to experience such a bug in any of our zones on a major scale, and -have yet to learn how to coordinate in the case of such in an interconnected -web of zones. Where are the planning documents for disaster scenarios? Between -PoS chains with good governance, we will learn how to roll back transactions -across connections, if need be in exceptional circumstances, but we aren't -there yet. This option isn't even available with pegged PoW coins. - -Yes, the contracts that are approved to run will be governance gated, but this -is not enough. For one, even with perfect governance, there are two new pieces -of complexity that will see more zero day bugs in the future for exploitation. -In terms of governance, the contracts are probably going to be written in Rust, -and so suddenly the validators that joined the project by inspecting the Go -code are now required to also audit Rust code. But also, we are now truly -opening the doors to all kinds of contracts to be run, because while governance -does sometimes reject proposals, it is generally accommodating to new features -especially endorsed by core contributors. - -I know of three alternatives: - -(1) we can use IBC to offload features to other zones. For liquid staking -(which should not be the focus of the hub) the hub could allow validators to -restrict the destination of unbonded ATOMs, and smart contracts running on -other zones can distribute those ATOMs according to the logic of whatever -liquid staking contract. This ensures separation of concerns, and a minimal -hub. - -(2) we can use Go plugins to extend the functionality of the chain. _UPDATE_ -Some have said that Go plugins are not mature enough. There are options like -https://github.com/hashicorp/go-plugin. Spawning a sub-process is superior to -running it under a new virtual machine, on top of a new framework, written in a -different language than the rest of the stack. One uses the operating system. -The other invents a new one. - -(3) we can do nothing. if liquid staking is such a big deal, something is wrong -about priorities for a cosmic "hub". If the liquid staking market is larger -than the base non-liquid staking market, the system is open for manipulation -and is insecure. The focus should not be on self-limiting use-cases, but the -infinite market of running validators with replicated security, perhaps running -a simple dex, and most of all innovating on and offering interchain security, -the business of judging validation faults as related to Tendermint, and perhaps -the interpretation and enforcement of self-enforced customs (law) of a -blockchain as defined by its shareholders who defer validation (and perhaps -judicial services) to the Cosmos Hub because it has a reputation for being the -longest ever running proof of stake hub that has never gone down, even as -compared to the upcoming Ethereum2.0. - -And note, I'm not proposing that the ATOM stakers forgo the benefits of -supporting contracts with CosmWASM. I support Juno and Tardigrade and Ethan -Frey’s work, but I also support the Hub running shared security, especially -simple replicated shared security where the validators also validate other -chains. I think this, and interchain staking, are the only profit models needed -for the hub (besides being a hub). NOTE: But those "consumer chains" ought to -be provided with full disclosures that the Cosmos Hub validators do not -maintain their respective software (as it would be impossible to audit all -zones that would benefit from the hub's security) but only offering validation -services as-is. This would force the hub validators to solve process isolation -(and I would much prefer building the protocol to NOT require particular -solutions like Docker, but allows validator choice), or else they would quickly -get slashed from malware (and that would be good to prune those validators from -the hub). - -So many options that don't require putting WASM on the Cosmos Hub. - ------------------------------------- - -## On Incentivized Votes - -In corporations, you can buy shares to influence the outcome of governance -votes. In democracy, this is not allowed because the vote could be bought to -infringe upon the rights of other people. - -What do you do when the chain's own core contributors propose a proposal that -you judge damages the integrity of the system? I think that's a good time to -create a fork of the hub's ATOM distribution led by a new development team. -Sometimes this option is the only option because of safety concerns, and this -is the case for me here. - -### Why is the snapshot date 5/19/2022? - -A snapshot in the past is more vulnerable to insider gaming, because there is -an imbalance of information--only the coordinator knows, and so can game the -premine. - -It is good to give many people the advantage of participating in a snapshot. -Excluding anyone who would have been an ally of a chain, in turn creates -animosity that would rather see another project succeed where they are -included. - -Even before the proposal I had pre-declared that anyone who votes for WASM on -the hub would not receive a gno.land airdrop. The proposer probably knew this -when the proposal was submitted. - -The snapshot date would have been 7/4/2022, because that is Independence Day in -the United States. I originally chose Independence Day because of the general -original mission of Tendermint, Cosmos, Bitcoin, and the crypto spirit; and -because the United States (as flawed as it is) is the best historic ideal of -human liberty we've had since before the days of Rome. - -Then prop 69 was submitted. I had said previously that we would exclude those -who vote in favor of WASM on the hub, but we don't have the tools yet to tally -the movement of tainted ATOMs after the unbonding period for the hub. So I -decided to move the snapshot date to 5/19/2022. - -Now with prop 69, I see that to me, 21 days after the beginning of proposal -\#69, 5/20/2022 (but 5/19/2022 PDT) is a chance to create a new community within -the Cosmos ecosystem that champions safety with a zero tolerance policy and a -mission to develop social coordination tools like the GNO smart contract VM, to -create even better governing bodies than the one we have today. - -### Gno.land and Cosmos Hub - -Now, I feel compelled to exit should prop \#69 pass. But as it is now, 16.57% -are voting YES, while NO and NO WITH VETO have 70.73% and 8.38% of the votes -with turnout at 30%. If the proposal does not pass, I would feel no need to -exit. For as long as the Cosmos Hub remains minimal and secure, we will favor -it as the dominant or only token hub connected to gno.land via the current IBC -implementations for the purpose of interchain token transfers. It's a job that -we'd rather not solve, as specialization is what will get us to the finish line -before other platforms do, and also I'm quite hooked on gnolang programming and -just want to make gnolang apps. Not everybody wants to build a DTCC, but many -would prefer to use it. - -### Airdrop distribution - -When I was asked on Cryptocito what I would have changed if I were to do it all -again, well, I would put the ICF in the hands of the chain. So in gno.land, the -ICF's portion of $GNOT will go to DAOs on gno.land. As for me, I have a -significant amount of ATOMs that voted for NO WITH VETO, but most of my tokens -by far are with the company that I previously founded, then called All in Bits, -Inc. AIB will not receive any $GNOT except by completing negotiations with me, -which is taking a lot longer than is reasonable--or not. - -For reference, for the genesis of the Cosmos Hub, the total distribution for -both entities was 20% of all ATOMs, and today it is still significant. The -total premine that I control directly or indirectly will not exceed 1/3 of the -total $GNOT distribution, but I am considering 20% again. - -Some more guidelines, which may change, so don't take anything here as -financial advice: - - * NO with VETO is slightly better than NO. - * NO is better than ABSTAIN. - * ABSTAIN is better than not voting at all. - * Delegators inherit the votes of the validators (unless delegators override). - * If you vote YES on \#69, you will not receive gno.land $GNOTs. - -Regarding ATOMs locked in IBC channels, those will count as not voting, -which is fine, and corresponding $GNOT will be released once the respective -zone communities create a provable audited distribution given the snapshot date, -which is defined to be exactly when those who voted on #69 can unbond and move their -tokens, which is 21 days from the start of the proposal. Soon we will be more precise -about what that is, but communities please prepare accordingly. If you aren't sure, -leave ATOMs on the hub. - -$ATOM in centralized exchanges will not result in $GNOT in the airdrop. Centralized -exchanges will not be allowed to redeem them even after genesis, even if they are -included. We will try to distinguish between custodial $ATOM vs non-custodial $ATOM -for all centralized exchanges with legally binding attestations, with good faith effort; -and so centralized exchanges would be welcome with their own capital, but not with client -funds. Nothing is guaranteed. - -We reserve the right to change our minds. This project is highly experimental and has -non-zero chances of failure. Nothing I tweet should be construed as financial -advice. And finally, what you do with $ATOM is not my responsibility; I don't have -control of the Cosmos Hub. - -NOTE: If you don't like my airdrop rules, you are free to make your own, and if -you're nice you can even run gno.land contracts if you so want there, or you -can just run a fork of gaia. - -If you have a better ideal for such an exit-drop by tweaking the governance -module, I'd love to hear your feedback, or generally how you think I could have -done this better. Some say that they don't want to see more of this kind of -forking, but I think we ought to celebrate it instead. - ----------------------------------------- - -## Conclusion - -Here's a peace offering. - -Just change your vote from YES to NO, and I will not intervene upon the second -submission of the proposal (and I would even fund its deposit if need be). But -if you instead feel strongly about signaling in favor of CosmWASM, here you can -express it, and I celebrate you, for being different than I, and wish you the -best of luck. That is equivalent to a no-confidence vote on gno.land, and is a -proper way to diss me. Again, I salute you. - -If you can reconsider your vote to be a NO, or even better, a NO WITH VETO, I -welcome you to gno.land. Happy 5/19/2022 (5/20/2022 Europe) Gno.land -Independence Day! diff --git a/docs/reference/gno-js-client/getting-started.md b/docs/reference/gno-js-client/getting-started.md new file mode 100644 index 00000000000..188f084bd56 --- /dev/null +++ b/docs/reference/gno-js-client/getting-started.md @@ -0,0 +1,25 @@ +--- +id: gno-js-getting-started +--- + +# Getting Started + +[@gnolang/gno-js-client](https://github.com/gnolang/gno-js-client) is a JavaScript/TypeScript client implementation for Gno chains. It is an extension of the +[tm2-js-client](https://github.com/gnolang/tm2-js-client), but with Gno-specific functionality. + +## Key Features + +- Provides the ability to interact with Gno Realms / Packages +- Easy interaction with VM-specific ABCI queries + +## Installation + +To install `@gnolang/gno-js-client`, use your preferred package manager: + +```bash +yarn add @gnolang/gno-js-client +``` + +```bash +npm install @gnolang/gno-js-client +``` diff --git a/docs/reference/gno-js-client/gno-provider.md b/docs/reference/gno-js-client/gno-provider.md new file mode 100644 index 00000000000..a5248349d35 --- /dev/null +++ b/docs/reference/gno-js-client/gno-provider.md @@ -0,0 +1,124 @@ +--- +id: gno-js-provider +--- + +# Gno Provider + +The `Gno Provider` is an extension on the `tm2-js-client` `Provider`, +outlined [here](../tm2-js-client/Provider/provider.md). Both JSON-RPC and WS providers are included with the package. + +## Realm Methods + +### getRenderOutput + +Executes the Render(path) method in read-only mode + +#### Parameters + +* `packagePath` **string** the gno package path +* `path` **string** the render path +* `height` **number** the height for querying. + If omitted, the latest height is used (optional, default `0`) + +Returns **Promise** + +#### Usage + +```ts +await provider.getRenderOutput('gno.land/r/demo/demo_realm', ''); +// ## Hello World! +``` + +### getFunctionSignatures + +Fetches public facing function signatures + +#### Parameters + +* `packagePath` **string** the gno package path +* `height` **number** the height for querying. + If omitted, the latest height is used (optional, default `0`) + +Returns **Promise** + +#### Usage + +```ts +await provider.getFunctionSignatures('gno.land/r/demo/foo20'); +/* +[ + { FuncName: 'TotalSupply', Params: null, Results: [ [Object] ] }, + { + FuncName: 'BalanceOf', + Params: [ [Object] ], + Results: [ [Object] ] + }, + { + FuncName: 'Allowance', + Params: [ [Object], [Object] ], + Results: [ [Object] ] + }, + { + FuncName: 'Transfer', + Params: [ [Object], [Object] ], + Results: null + }, + { + FuncName: 'Approve', + Params: [ [Object], [Object] ], + Results: null + }, + { + FuncName: 'TransferFrom', + Params: [ [Object], [Object], [Object] ], + Results: null + }, + { FuncName: 'Faucet', Params: null, Results: null }, + { FuncName: 'Mint', Params: [ [Object], [Object] ], Results: null }, + { FuncName: 'Burn', Params: [ [Object], [Object] ], Results: null }, + { FuncName: 'Render', Params: [ [Object] ], Results: [ [Object] ] } +] + */ +``` + +### evaluateExpression + +Evaluates any expression in readonly mode and returns the results + +#### Parameters + +* `packagePath` **string** the gno package path +* `expression` **string** the expression to be evaluated +* `height` **number** the height for querying. + If omitted, the latest height is used (optional, default `0`) + +Returns **Promise** + +#### Usage + +```ts +await provider.evaluateExpression('gno.land/r/demo/foo20', 'TotalSupply()') +// (10100000000 uint64) +``` + +### getFileContent + +Fetches the file content, or the list of files if the path is a directory + +#### Parameters + +* `packagePath` **string** the gno package path +* `height` **number** the height for querying. + If omitted, the latest height is used (optional, default `0`) + +Returns **Promise** + +#### Usage + +```ts +await provider.getFileContent('gno.land/r/demo/foo20', 'TotalSupply()') +/* +foo20.gno +foo20_test.gno + */ +``` diff --git a/docs/reference/gno-js-client/gno-wallet.md b/docs/reference/gno-js-client/gno-wallet.md new file mode 100644 index 00000000000..7f7c44cd9b0 --- /dev/null +++ b/docs/reference/gno-js-client/gno-wallet.md @@ -0,0 +1,78 @@ +--- +id: gno-js-wallet +--- + +# Gno Wallet + +The `Gno Wallet` is an extension on the `tm2-js-client` `Wallet`, outlined [here](../tm2-js-client/wallet.md). + +## Account Methods + +### transferFunds + +Initiates a native currency transfer transaction between accounts + +#### Parameters + +* `to` **string** the bech32 address of the receiver +* `funds` **Map** the denomination -> value map for funds +* `fee` **TxFee** the custom transaction fee, if any + +Returns **Promise** + +#### Usage + +```ts +let fundsMap = new Map([ + ["ugnot", 10], +]); + +await wallet.transferFunds('g1flk9z2qmkgqeyrl654r3639rzgz7xczdfwwqw7', fundsMap); +// returns the transaction hash +``` + +### callMethod + +Invokes the specified method on a GNO contract + +#### Parameters + +* `path` **string** the gno package / realm path +* `method` **string** the method name +* `args` **string[]** the method arguments, if any +* `funds` **Map** the denomination -> value map for funds +* `fee` **TxFee** the custom transaction fee, if any + +Returns **Promise** + +#### Usage + +```ts +let fundsMap = new Map([ + ["ugnot", 10], +]); + +await wallet.callMethod('gno.land/r/demo/foo20', 'TotalBalance', []); +// returns the transaction hash +``` + +### deployPackage + +Deploys the specified package / realm + +#### Parameters + +* `gnoPackage` **MemPackage** the package / realm to be deployed +* `funds` **Map** the denomination -> value map for funds +* `fee` **TxFee** the custom transaction fee, if any + +Returns **Promise** + +#### Usage + +```ts +const memPackage: MemPackage = // ... + + await wallet.deployPackage(memPackage); +// returns the transaction hash +``` diff --git a/gnovm/docs/go-gno-compatibility.md b/docs/reference/go-gno-compatibility.md similarity index 99% rename from gnovm/docs/go-gno-compatibility.md rename to docs/reference/go-gno-compatibility.md index 6ff433c056f..42ebe3c8ff7 100644 --- a/gnovm/docs/go-gno-compatibility.md +++ b/docs/reference/go-gno-compatibility.md @@ -1,4 +1,8 @@ -# Go<>Gno compatibility +--- +id: go-gno-compatibility +--- + +# Go - Gno compatibility ## Native keywords @@ -190,9 +194,9 @@ Legend: | log/slog | `tbd` | | log/syslog | `nondet` | | maps | `gnics` | -| math | `part` | +| math | `full` | | math/big | `tbd` | -| math/bits | `todo` | +| math/bits | `full` | | math/cmplx | `tbd` | | math/rand | `todo` | | mime | `tbd` | diff --git a/docs/reference/rpc-endpoints.md b/docs/reference/rpc-endpoints.md new file mode 100644 index 00000000000..790e4c49142 --- /dev/null +++ b/docs/reference/rpc-endpoints.md @@ -0,0 +1,502 @@ +--- +id: rpc-endpoints +--- + +# Gno RPC Endpoints + +## Common Parameters + +#### Response + +| Name | Type | Description | +| --------------- | ------ | --------------------------------- | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | Object | (upon success) The result object. | +| `error` | Object | (upon failure) The error object. | +| `error.code` | Number | The error code. | +| `error.message` | String | The error message. | +| `error.data` | String | The error data. | + +## Health Check + +Call with the `/health` path when verifying that the node is running. + +#### Response + +| Name | Type | Description | +| --------- | ------ | ---------------- | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | Object | {} | + +## Check Node Server Status + +Call with the `/status` path to check the information from a node. + +#### Response + +| Name | Type | Description | +| --------- | ---------------- | ------------------------------------- | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Status Result] | The result of the node server status. | + +#### Status Result + +| Name | Type | Description | +| ---------------- | ------ | ----------------------------------- | +| `node_info` | Object | General information about the node. | +| `sync_info` | Object | The sync information. | +| `validator_info` | Object | The validator information. | + +## Get Network Information + +Call with the `/net_info` path to check the network information from the node. + +#### Response + +| Name | Type | Description | +| --------- | ----------------- | ------------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[NetInfo Result] | The network information. | + +#### NetInfo Result + +| Name | Type | Description | +| ----------- | ---------- | ------------------ | +| `listening` | Boolean | Enables listening. | +| `listeners` | String \[] | List of listeners. | +| `n_peers` | String | Number of peers. | +| `peers` | String \[] | List of peers. | + +## Get Genesis Block Information + +Call with the `/genesis` path to retrieve information about the Genesis block from the node. + +#### Response + +| name | Type | Description | +| --------- | ------ | ------------------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | Object | The Genesis block information. | + +## Get Consensus Parameters + +Call with the /consensus\_params path to check the consensus algorithm parameters at the specified height. + +#### Parameters + +| Name | Description | +| -------- | ----------------- | +| `height` | The block height. | + +#### Response + +| Name | Type | Description | +| --------- | -------------------------- | ------------------------------------ | +| `jsonrpc` | String | The RPC Version. | +| `id` | String | The response ID. | +| `result` | \[Consensus Params Result] | The consensus parameter information. | + +#### Consensus Params Result + +| Name | Type | Description | +| ----------------------------- | ------ | -------------------------- | +| `block_height` | String | The block height. | +| `consensus_params` | Object | The parameter information. | +| `consensus_params.Block` | Object | The block parameters. | +| `consensus_params.Validattor` | Object | The validator parameters. | + +## Get Consensus State + +Call with the `/consensus_state` to get the consensus state of the Gnoland blockchain + +#### Response + +| Name | Type | Description | +| ------- | --------------------------- | -------------------------------- | +| jsonrpc | String | The RPC version. | +| id | String | The response ID. | +| result | \[Consensus State Response] | The consensus state information. | + +#### Consensus State Response + +| Name | Type | Description | +| --------------------------------- | ------ | -------------------------------- | +| `round_state` | Object | The consensus state object. | +| `round_state.height/round/step` | String | The block height / round / step. | +| `round_state.start_time` | String | The round start time. | +| `round_state.proposal_block_hash` | String | The proposal block hash. | +| `round_state.locked_block_hash` | String | The locked block hash. | +| `round_state.valid_block_hash` | String | The valid block hash. | +| `round_state.height_vote_set` | Object | - | + +## Get Commit + +Call with the `/commit` path to retrieve commit information at the specified block height. + +#### Parameters + +| Name | Description | +| -------- | ----------------- | +| `height` | The block height. | + +#### Response + +| Name | Type | Description | +| --------- | ---------------- | ----------------------- | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Commit Result] | The commit information. | + +#### Commit Result + +| Name | Type | Description | +| -------------- | ------- | ------------------------- | +| signed\_header | Object | The signed header object. | +| canonical | Boolean | Returns commit state. | + +## Get Block Information + +Call with the `/block` path to retrieve block information at the specified height. + +#### Parameters + +| Name | Description | +| -------- | ----------------- | +| `height` | The block height. | + +#### Response + +| Name | Type | Description | +| --------- | --------------- | ----------------------- | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Block Result] | The commit information. | + +#### Block Result + +| Name | Type | Description | +| ------------ | ------ | ---------------------- | +| `block_meta` | Object | The block metadata. | +| `block` | Object | The block information. | + +## Get Block Results + +Call with the `/block_results` path to retrieve block processing information at the specified height. + +#### Parameters + +| Name | Description | +| -------- | ----------------- | +| `height` | The block height. | + +#### Response + +| Name | Type | Description | +| --------- | --------------- | ------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Block Result] | The result object. | + +#### Block Result + +| Name | Type | Description | +| --------- | ------------------------ | ------------------------------------- | +| `height` | Object | The block height. | +| `results` | \[Block Result Info] \[] | The list of block processing results. | + +#### Block Result Info + +| Name | Type | Description | +| --------------------------- | ---------- | -------------------------------- | +| `deliver_tx` | Object \[] | The list of transaction results. | +| `deliver_tx[].ResponseBase` | Object | The transaction response object. | +| `deliver_tx[].GasWanted` | String | Maximum amount of gas to use. | +| `deliver_tx[].GasUsed` | String | Actual gas used. | +| `begin_block` | Object | Previous block information. | +| `end_block` | Object | Next block information. | + +## Get Block List + +Call with the `/blockchain` path to retrieve information about blocks within a specified range. + +#### Parameters + +| Name | Description | +| ----------- | ------------------------- | +| `minHeight` | The minimum block height. | +| `maxHeight` | The maximum block height. | + +#### Response + +| Name | Type | Description | +| --------- | -------------------- | ------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Blockchain Result] | The result object. | + +#### Blockchain Result + +| Name | Type | Description | +| ------------- | ---------- | --------------------------- | +| `last_height` | String | The latest block height. | +| `block_meta` | Object \[] | The list of block metadata. | + +## Get a No. of Unconfirmed Transactions + +Call with the `/num_unconfirmed_txs` path to get data about unconfirmed transactions. + +#### Response + +| Name | Type | Description | +| --------- | ----------------------------- | ------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Num Unconfirmed Txs Result] | The result object. | + +#### Num Unconfirmed Txs Result + +| Name | Type | Description | +| ------------- | ------ | --------------------------- | +| `n_txs` | String | The number of transactions. | +| `total` | String | The total number. | +| `total_bytes` | String | Total bytes. | +| `txs` | null | - | + +## Get a List of Unconfirmed Transactions + +Call with the `/unconfirmed_txs` path to get a list of unconfirmed transactions. + +#### Parameters + +| Name | Description | +| ------- | --------------------------------------- | +| `limit` | The maximum transaction numbers to get. | + +#### Response + +| Name | Type | Description | +| --------- | ------------------------- | ------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Unconfirmed Txs Result] | The result object. | + +#### Unconfirmed Txs Result + +| Name | Type | Description | +| ------------- | ---------- | ----------------------------------- | +| `n_txs` | String | The number of transactions. | +| `total` | String | The total number. | +| `total_bytes` | String | Total bytes. | +| `txs` | Object \[] | A list of unconfirmed transactions. | + +## Get a List of Validators + +Call with the `/validators` path to get a list of validators at a specific height. + +#### Parameters + +| Name | Description | +| -------- | ----------------------------------------- | +| `height` | The block height (default: newest block). | + +#### Response + +| Name | Type | Description | +| --------- | -------------------- | ------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Validators Result] | The result object. | + +#### Validators Result + +| Name | Type | Description | +| -------------- | ---------------- | ----------------------- | +| `block_height` | Object | The block height. | +| `validators` | \[Validator] \[] | The list of validators. | + +#### Validator + +| Name | Type | Description | +| ------------------- | ---------- | ---------------------------------------- | +| `address` | String | The address of the validator. | +| `pub_key` | Object \[] | The public key object of the validator. | +| `pub_key.@type` | String | The type of validator's public key. | +| `pub_key.value` | String | The value of the validator's public key. | +| `voting_power` | String | Voting power of the validator. | +| `proposer_priority` | String | The priority of the proposer. | + +## Broadcast a Transaction - Asynchronous + +Call with the `/broadcast_tx_async` path to create and broadcast a transaction without waiting for the transaction response. + +#### Parameters + +| Name | Description | +| ---- | ------------------------------------------- | +| `tx` | The value of the signed transaction binary. | + +#### Response + +| Name | Type | Description | +| --------- | --------------------- | ------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Transaction Result] | The result object. | + +#### Transaction Result + +| Name | Type | Description | +| ----- | ------ | ---------------------------- | +| hash | String | The transaction hash. | +| data | Object | The transaction data object. | +| error | Object | The error object. | +| log | String | The log information. | + +## Broadcast a Transaction - Synchronous + +Call with the `/broadcast_tx_sync` path to create and broadcast a transaction, then wait for the transaction response. + +#### Parameters + +| Name | Description | +| ---- | ------------------------------------------- | +| `tx` | The value of the signed transaction binary. | + +#### Response + +| Name | Type | Description | +| --------- | --------------------- | ------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Transaction Result] | The result object. | + +#### Transaction Result + +| Name | Type | Description | +| ----- | ------ | ---------------------------- | +| hash | String | The transaction hash. | +| data | Object | The transaction data object. | +| error | Object | The error object. | +| log | String | The log information. | + +## (NOT RECOMMENDED) Broadcast Transaction and Get Commit Information + +Call with the `/broadcast_tx_commit` path to create and broadcast a transaction, then wait for the transaction response and the commit response. + +#### Parameters + +| Name | Description | +| ---- | ------------------------------------------- | +| `tx` | The value of the signed transaction binary. | + +#### Response + +| Name | Type | Description | +| --------- | ---------------------------- | ------------------ | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[Transaction Commit Result] | The result object. | + +#### Transaction Commit Result + +| Name | Type | Description | +| ------------ | ------ | ----------------------------------------------------------- | +| `height` | String | The height of the block when the transaction was committed. | +| hash | String | The transaction hash. | +| `deliver_tx` | Object | The delivered transaction information. | +| `check_tx` | Object | The committed transaction information. | + +## ABCI + +### Get ABCI Information + +Call with the `/abci_info` path to get the latest information about the ABCI. + +#### Response + +| Name | Type | Description | +| --------- | ------------------- | ----------------------- | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[ABCI Info Result] | The commit information. | + +#### ABCI Info Result + +| Name | Type | Description | +| --------------------------- | ---------------- | -------------------------- | +| `response` | Object | The metadata of the block. | +| `response.ResponseBase` | \[ABCI Response] | The ABCI response data. | +| `response.ABCIVersion` | String | The ABCI version. | +| `response.AppVersion` | String | The app version. | +| `response.LastBlockHeight` | String | The latest block height. | +| `response.LastBlockAppHash` | String | The latest block hash. | + +#### ABCI Response + +| Name | Type | Description | +| ------ | ---------- | --------------------------------- | +| Data | String | The Base64-encoded response data. | +| Error | Object | The ABCI response error object. | +| Events | Object \[] | The list of event objects. | +| Log | String | The ABCI response log. | +| Info | String | The ABCI response information. | + +### Get ABCI Query + +Call with the `/abci_query` to get information via the ABCI Query. + +#### Query + +| Name | Description | +| ------------------------- | ------------------------------------------------------------------ | +| `auth/accounts/{ADDRESS}` | Returns the account information. | +| `bank/balances/{ADDRESS}` | Returns the balance information about the account. | +| `vm/qfuncs` | Returns public facing function signatures as JSON. | +| `vm/qfile` | Returns the file bytes, or list of files if directory. | +| `vm/qrender` | Calls `.Render()` in readonly mode. | +| `vm/qeval` | Evaluates any expression in readonly mode and returns the results. | +| `vm/store` | (not yet supported) Fetches items from the store. | +| `vm/package` | (not yet supported) Fetches a package's files. | + +#### Parameters + +| Name | Description | +| ------------------- | ------------------------------------------------ | +| `path` | The query path. | +| `data` | The data from the query path. | +| (optional) `height` | The block height (default: latest block height). | +| (optional) `prove` | The validation status. | + +#### Response + +| Name | Type | Description | +| --------- | -------------------- | ----------------------- | +| `jsonrpc` | String | The RPC version. | +| `id` | String | The response ID. | +| `result` | \[ABCI Query Result] | The commit information. | + +#### ABCI Query Result + +| Name | Type | Description | +| ----------------------- | ---------------- | -------------------------- | +| `response` | Object | The metadata of the block. | +| `response.ResponseBase` | \[ABCI Response] | The ABCI response data. | +| `response.Key` | String | The key. | +| `response.Value` | String | The value. | +| `response.Proof` | String | The validation ID. | +| `response.Height` | String | The block height. | + +#### ABCI Response + +| Name | Type | Description | +| ------ | ---------- | --------------------------------- | +| Data | String | The Base64-encoded response data. | +| Error | Object | The ABCI response error object. | +| Events | Object \[] | The list of event objects. | +| Log | String | The ABCI response log. | +| Info | String | The ABCI response information. | diff --git a/docs/reference/standard-library.md b/docs/reference/standard-library.md new file mode 100644 index 00000000000..71fad4943e6 --- /dev/null +++ b/docs/reference/standard-library.md @@ -0,0 +1,68 @@ +--- +id: standard-library +--- + +# Gno Standard Library + +When developing a realm in Gnolang, developers may utilize libraries in [stdlibs](https://github.com/gnolang/gno/tree/master/stdlibs). These are the core standard packages provided for Gnolang [Realms ](../explanation/realms.md)& [Packages](../explanation/packages.md). + +Libraries can be imported in a manner similar to how libraries are imported in Golang. + +An example of importing a `std` library in Gnolang is demonstrated in the following command: + +```go +import "std" +``` + +Let's explore some of the most commonly used modules in the library. + +## `stdshim` + +### `banker.gno` + +A library for manipulating `Coins`. Interfaces that must be implemented when using this library are as follows: + +[embedmd]:# (../assets/reference/standard-library/std-1.gno go) +```go +// returns the list of coins owned by the address +GetCoins(addr Address) (dst Coins) + +// sends coins from one address to another +SendCoins(from, to Address, amt Coins) + +// returns the total supply of the coin +TotalCoin(denom string) int64 + +// issues coins to the address +IssueCoin(addr Address, denom string, amount int64) + +// burns coins from the address +RemoveCoin(addr Address, denom string, amount int64) +``` + +### `coins.gno` + +A library that declares structs for expressing `Coins`. The struct looks like the following: + +[embedmd]:# (../assets/reference/standard-library/std-2.gno go) +```go +type Coin struct { + Denom string `json:"denom"` // the symbol of the coin + Amount int64 `json:"amount"` // the quantity of the coin +} +``` + +### `testing` + +A library that declares `*testing`, which is a tool used for the creation and execution of test cases during the development and testing phase of realms utilizing the `gno` CLI tool with the `test` option. + +There are 3 types of testing in `gno`. + +* Type `T` + * Type passed to Test functions to manage test state and support formatted test logs. +* Type `B` + * Type passed to Benchmark functions. + * Manage benchmark timing. + * Specify the number of iterations to run. +* Type `PB` + * Used by `RunParallel` for running parallel benchmarks. diff --git a/docs/reference/tm2-js-client/Provider/json-rpc-provider.md b/docs/reference/tm2-js-client/Provider/json-rpc-provider.md new file mode 100644 index 00000000000..b7700e1d97c --- /dev/null +++ b/docs/reference/tm2-js-client/Provider/json-rpc-provider.md @@ -0,0 +1,22 @@ +--- +id: tm2-js-json-rpc-provider +--- + +# JSON-RPC Provider + +Provider based on JSON-RPC HTTP requests. + +### new JSONRPCProvider + +Creates a new instance of the JSON-RPC Provider + +#### Parameters + +* `baseURL` **string** the JSON-RPC URL of the node + +#### Usage + +```ts +new JSONRPCProvider('http://staging.gno.land:36657'); +// provider is created +``` diff --git a/docs/reference/tm2-js-client/Provider/provider.md b/docs/reference/tm2-js-client/Provider/provider.md new file mode 100644 index 00000000000..da6168eb6c2 --- /dev/null +++ b/docs/reference/tm2-js-client/Provider/provider.md @@ -0,0 +1,443 @@ +--- +id: tm2-js-provider +--- + +# Overview + +A `Provider` is an interface that abstracts the interaction with the Tendermint2 chain, making it easier for users to +communicate with it. Rather than requiring users to understand which endpoints are exposed, what their return types are, +and how they are parsed, the `Provider` abstraction handles all of this behind the scenes. It exposes useful API methods +that users can use and expects concrete types in return. + +Currently, the `tm2-js-client` package provides support for two Provider implementations: + +- [JSON-RPC Provider](json-rpc-provider.md): executes each call as a separate HTTP RPC call. +- [WS Provider](ws-provider.md): executes each call through an active WebSocket connection, which requires closing when + not needed anymore. + +## Account Methods + +### getBalance + +Fetches the denomination balance of the account + +#### Parameters + +* `address` **string** the bech32 address of the account +* `denomination` **string** the balance denomination (optional, default `ugnot`) +* `height` **number** the height for querying. + If omitted, the latest height is used (optional, default `0`) + +Returns **Promise** + +#### Usage + +```ts +await provider.getBalance('g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq', 'atom'); +// 100 +``` + +### getAccountSequence + +Fetches the account sequence + +#### Parameters + +* `address` **string** the bech32 address of the account +* `height` **number** the height for querying. + If omitted, the latest height is used. (optional, default `0`) + +Returns **Promise** + +#### Usage + +```ts +await provider.getAccountSequence('g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq'); +// 42 +``` + +### getAccountNumber + +Fetches the account number. Errors out if the account +is not initialized + +#### Parameters + +* `address` **string** the bech32 address of the account +* `height` **number** the height for querying. + If omitted, the latest height is used (optional, default `0`) + +Returns **Promise** + +#### Usage + +```ts +await provider.getAccountNumber('g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq'); +// 100 +``` + +## Block methods + +### getBlock + +Fetches the block at the specific height, if any + +#### Parameters + +* `height` **number** the height for querying + +Returns **Promise** + +#### Usage + +```ts +await provider.getBlock(1); +/* +{ + block_meta: { + block_id: { + hash: "TxHKEGxFm/4+D7gxOJdVUaR+xTDZzlPrCVXuVm7SqHw=", + parts: { + total: "1", + hash: "+dqI9oyngnnlKyno7y+RxCLEPA9FxWA/MmXyJ4uoJAY=" + } + }, + header: { + version: "v1.0.0-rc.0", + chain_id: "dev", + height: "1", + time: "2023-05-01T10:32:20.807541Z", + num_txs: "0", + total_txs: "0", + app_version: "", + last_block_id: { + hash: null, + parts: { + total: "0", + hash: null + } + }, + last_commit_hash: null, + data_hash: null, + validators_hash: "FnuBaDvDLg4FotGRcZAFvhLkEjkb+kNLaAZrAVhL5Aw=", + next_validators_hash: "FnuBaDvDLg4FotGRcZAFvhLkEjkb+kNLaAZrAVhL5Aw=", + consensus_hash: "uKhnXFmGUkxgQSJf17ogbYLNXDo3UEPwQvzddo4Vkuw=", + app_hash: null, + last_results_hash: null, + proposer_address: "g1vsqzyy9a4h9ah8cxzkaw09rpzy369mkl70lfdk" + } + }, + block: { + header: { + version: "v1.0.0-rc.0", + chain_id: "dev", + height: "1", + time: "2023-05-01T10:32:20.807541Z", + num_txs: "0", + total_txs: "0", + app_version: "", + last_block_id: { + hash: null, + parts: { + total: "0", + hash: null + } + }, + last_commit_hash: null, + data_hash: null, + validators_hash: "FnuBaDvDLg4FotGRcZAFvhLkEjkb+kNLaAZrAVhL5Aw=", + next_validators_hash: "FnuBaDvDLg4FotGRcZAFvhLkEjkb+kNLaAZrAVhL5Aw=", + consensus_hash: "uKhnXFmGUkxgQSJf17ogbYLNXDo3UEPwQvzddo4Vkuw=", + app_hash: null, + last_results_hash: null, + proposer_address: "g1vsqzyy9a4h9ah8cxzkaw09rpzy369mkl70lfdk" + }, + data: { + txs: null + }, + last_commit: { + block_id: { + hash: null, + parts: { + total: "0", + hash: null + } + }, + precommits: null + } + } +} +*/ +``` + +### getBlockResult + +Fetches the block at the specific height, if any + +#### Parameters + +* `height` **number** the height for querying + +Returns **Promise** + +#### Usage + +```ts +await provider.getBlockResult(1); +/* +{ + height: "1", + results: { + deliver_tx: null, + end_block: { + ResponseBase: { + Error: null, + Data: null, + Events: null, + Log: "", + Info: "" + }, + ValidatorUpdates: null, + ConsensusParams: null, + Events: null + }, + begin_block: { + ResponseBase: { + Error: null, + Data: null, + Events: null, + Log: "", + Info: "" + } + } + } +} +*/ +``` + +### getBlockNumber + +Fetches the latest block number from the chain + +Returns **Promise** + +#### Usage + +```ts +await provider.getBlockNumber(); +// 1300 +``` + +## Network methods + +### getNetwork + +Fetches the network information + +Returns **Promise** + +#### Usage + +```ts +await provider.getNetwork(); +/* +{ + listening: true, + listeners: [ + "Listener(@)" + ], + n_peers: "0", + peers: [] +} +*/ +``` + +### getConsensusParams + +Fetches the consensus params for the specific block height + +#### Parameters + +* `height` **number** the height for querying + +Returns **Promise** + +#### Usage + +```ts +await provider.getConsensusParams(1); +/* +{ + block_height: "1", + consensus_params: { + Block: { + MaxTxBytes: "1000000", + MaxDataBytes: "2000000", + MaxBlockBytes: "0", + MaxGas: "10000000", + TimeIotaMS: "100" + }, + Validator: { + PubKeyTypeURLs: [ + "/tm.PubKeyEd25519" + ] + } + } +} +*/ +``` + +### getStatus + +Fetches the current node status + +Returns **Promise** + +#### Usage + +```ts +await provider.getStatus(); +/* +{ + node_info: { + version_set: [ + { + Name: "abci", + Version: "v1.0.0-rc.0", + Optional: false + }, + { + Name: "app", + Version: "", + Optional: false + }, + { + Name: "bft", + Version: "v1.0.0-rc.0", + Optional: false + }, + { + Name: "blockchain", + Version: "v1.0.0-rc.0", + Optional: false + }, + { + Name: "p2p", + Version: "v1.0.0-rc.0", + Optional: false + } + ], + net_address: "g1z0wa6rspsshkm2k7jlqvnjs8jdt4kvg4e9j640@0.0.0.0:26656", + network: "dev", + software: "", + version: "v1.0.0-rc.0", + channels: "QCAhIiMw", + moniker: "voyager.lan", + other: { + tx_index: "off", + rpc_address: "tcp://127.0.0.1:26657" + } + }, + sync_info: { + latest_block_hash: "x5ewEBhf9+MGXbEFkUdOm3RsE40D+plUia2u0PuVfHs=", + latest_app_hash: "7dB/+EmqLqEX2RkH2Zx+GcFo8c2vTs2ttW8urYyyFT4=", + latest_block_height: "55", + latest_block_time: "2023-05-06T11:28:35.643575Z", + catching_up: false + }, + validator_info: { + address: "g1vsqzyy9a4h9ah8cxzkaw09rpzy369mkl70lfdk", + pub_key: { + "@type": "/tm.PubKeyEd25519", + value: "X8ZS1DYu1eJ3HYnZ0OWk+0GgCdI7zA++kgWiprWMs3w=" + }, + voting_power: "0" + } +} +*/ +``` + +### getGasPrice + +**NOTE: Not supported yet** + +Fetches the current (recommended) average gas price + +Returns **Promise** + +### estimateGas + +**NOTE: Not supported yet** + +Estimates the gas limit for the transaction + +#### Parameters + +* `tx` **Tx** the transaction that needs estimating + +Returns **Promise** + +## Transaction methods + +### sendTransaction + +Sends the transaction to the node for committing and returns the transaction hash. +The transaction needs to be signed beforehand. + +#### Parameters + +* `tx` **string** the base64-encoded signed transaction + +Returns **Promise** + +#### Usage + +```ts +await provider.sendTransaction('ZXhhbXBsZSBzaWduZWQgdHJhbnNhY3Rpb24'); +// "dHggaGFzaA==" +``` + +### waitForTransaction + +Waits for the transaction to be committed on the chain. +NOTE: This method will not take in the fromHeight parameter once +proper transaction indexing is added - the implementation should +simply try to fetch the transaction first to see if it's included in a block +before starting to wait for it; Until then, this method should be used +in the sequence: +get latest block -> send transaction -> waitForTransaction(block before send) + +#### Parameters + +* `hash` **string** The transaction hash +* `fromHeight` **number** The block height used to begin the search (optional, default `latest`) +* `timeout` **number** Optional wait timeout in MS (optional, default `15000`) + +Returns **Promise** + +#### Usage + +```ts +await provider.waitForTransaction('ZXhhbXBsZSBzaWduZWQgdHJhbnNhY3Rpb24'); +/* +{ + messages:[], // should be filled with the appropriate message type + fee:{ + gasWanted: "100", + gasFee: "1ugnot" + }, + signatures:[ + { + pubKey:[ + { + type: "/tm.PubKeySecp256k1" + value: "X8ZS1DYu1eJ3HYnZ0OWk+0GgCdI7zA++kgWiprWMs3w=" + } + ], + signature: "X8ZS1DYu1eJ3HYnZ0OWk+0GgCdI7zA++kgWiprWMs3w=" + } + ], + memo: "check out gno.land!" +} +*/ +``` diff --git a/docs/reference/tm2-js-client/Provider/utility.md b/docs/reference/tm2-js-client/Provider/utility.md new file mode 100644 index 00000000000..3f0181ccc39 --- /dev/null +++ b/docs/reference/tm2-js-client/Provider/utility.md @@ -0,0 +1,116 @@ +--- +id: tm2-js-utility +--- + +# Utility Helpers + +## Provider Helpers + +### extractBalanceFromResponse + +Extracts the specific balance denomination from the ABCI response + +#### Parameters + +* `abciData` **(string | null)** the base64-encoded ABCI data +* `denomination` **string** the required denomination + +### extractSequenceFromResponse + +Extracts the account sequence from the ABCI response + +#### Parameters + +* `abciData` **(string | null)** the base64-encoded ABCI data + +Returns **number** + +### extractAccountNumberFromResponse + +Extracts the account number from the ABCI response + +#### Parameters + +* `abciData` **(string | null)** the base64-encoded ABCI data + +Returns **number** + +### waitForTransaction + +Waits for the transaction to be committed to a block in the chain +of the specified provider. This helper does a search for incoming blocks +and checks if a transaction + +#### Parameters + +* `provider` **Provider** the provider instance +* `hash` **string** the base64-encoded hash of the transaction +* `fromHeight` **number** the starting height for the search. If omitted, it is the latest block in the chain ( + optional, default `latest`) +* `timeout` **number** the timeout in MS for the search (optional, default `15000`) + +Returns **Promise** + +## Request Helpers + +### newRequest + +Creates a new JSON-RPC 2.0 request + +#### Parameters + +* `method` **string** the requested method +* `params` **Array?** the requested params, if any + +Returns **RPCRequest** + +### newResponse + +Creates a new JSON-RPC 2.0 response + +#### Parameters + +* `result` **Result** the response result, if any +* `error` **RPCError** the response error, if any + +Returns **RPCResponse** + +### parseABCI + +Parses the base64 encoded ABCI JSON into a concrete type + +#### Parameters + +* `data` **string** the base64-encoded JSON + +Returns **Result** + +### stringToBase64 + +Converts a string into base64 representation + +#### Parameters + +* `str` **string** the raw string + +Returns **string** + +### base64ToUint8Array + +Converts a base64 string into a Uint8Array representation + +#### Parameters + +* `str` **string** the base64-encoded string + +Returns **Uint8Array** + +### uint8ArrayToBase64 + +Converts a Uint8Array into base64 representation + +#### Parameters + +* `data` **Uint8Array** the Uint8Array to be encoded + +Returns **string** diff --git a/docs/reference/tm2-js-client/Provider/ws-provider.md b/docs/reference/tm2-js-client/Provider/ws-provider.md new file mode 100644 index 00000000000..ef91f45d4e2 --- /dev/null +++ b/docs/reference/tm2-js-client/Provider/ws-provider.md @@ -0,0 +1,95 @@ +--- +id: tm2-js-ws-provider +--- + +# WebSocket Provider + +Provider based on WS JSON-RPC requests. + +### new WSProvider + +Creates a new instance of the WebSocket Provider + +#### Parameters + +* `baseURL` **string** the WS URL of the node +* `requestTimeout` **number** the timeout for the WS request (in MS) + +#### Usage + +```ts +new WSProvider('ws://staging.gno.land:36657/ws'); +// provider with WS connection is created +``` + +### closeConnection + +Closes the WS connection. Required when done working +with the WS provider + +#### Usage + +```ts +const wsProvider = new WSProvider('ws://staging.gno.land:36657/ws'); + +wsProvider.closeConnection(); +// WS connection is now closed +``` + +### sendRequest + +Sends a request to the WS connection, and resolves +upon receiving the response + +#### Parameters + +* `request` **RPCRequest** the RPC request + +Returns **Promise>** + +#### Usage + +```ts +const request: RPCRequest = // ... + +const wsProvider = new WSProvider('ws://staging.gno.land:36657/ws'); + +wsProvider.sendRequest(request); +// request is sent over the open WS connection +``` + +### parseResponse + +Parses the result from the response + +#### Parameters + +* `response` **RPCResponse** the response to be parsed + +Returns **Result** + +#### Usage + +```ts +const response: RPCResponse = // ... + +const wsProvider = new WSProvider('ws://staging.gno.land:36657/ws'); + +wsProvider.parseResponse(response); +// response is parsed +``` + +### waitForOpenConnection + +Waits for the WS connection to be established + +Returns **Promise** + +#### Usage + +```ts +const wsProvider = new WSProvider('ws://staging.gno.land:36657/ws'); + +await wsProvider.waitForOpenConnection() +// status of the connection is: CONNECTED +``` diff --git a/docs/reference/tm2-js-client/Signer/key.md b/docs/reference/tm2-js-client/Signer/key.md new file mode 100644 index 00000000000..3c40fa427d2 --- /dev/null +++ b/docs/reference/tm2-js-client/Signer/key.md @@ -0,0 +1,30 @@ +--- +id: tm2-js-key +--- + +# Key Signer + +Private key-based signer instance + +### new KeySigner + +Creates a new instance of the private-key KeySigner + +#### Parameters + +* `privateKey` **Uint8Array** the raw Secp256k1 private key +* `publicKey` **Uint8Array** the raw Secp256k1 public key +* `addressPrefix` **string** the address prefix + +#### Usage + +```ts +// Generate the public / private key from somewhere +const {publicKey, privateKey} = await generateKeyPair( + entropyToMnemonic(generateEntropy()), + index ? index : 0 +); + +new KeySigner(privateKey, publicKey); +// new Secp256k1 key signer created +``` diff --git a/docs/reference/tm2-js-client/Signer/ledger.md b/docs/reference/tm2-js-client/Signer/ledger.md new file mode 100644 index 00000000000..71a7682c3e3 --- /dev/null +++ b/docs/reference/tm2-js-client/Signer/ledger.md @@ -0,0 +1,27 @@ +--- +id: tm2-js-ledger +--- + +# Ledger Signer + +Ledger device-based signer instance + +### new LedgerSigner + +Creates a new instance of the Ledger device signer, using the provided `LedgerConnector` + +#### Parameters + +* `connector` **LedgerConnector** the Ledger connector +* `accountIndex` **number** the desired account index +* `addressPrefix` **string** the address prefix + +#### Usage + +```ts +const accountIndex: number = 10 // for ex. 10th account in the derivation +const connector: LedgerConnector = // ... + +new LedgerSigner(connector, accountIndex); +// new Ledger device signer created +``` diff --git a/docs/reference/tm2-js-client/Signer/signer.md b/docs/reference/tm2-js-client/Signer/signer.md new file mode 100644 index 00000000000..fd3945cc2ae --- /dev/null +++ b/docs/reference/tm2-js-client/Signer/signer.md @@ -0,0 +1,96 @@ +--- +id: tm2-js-signer +--- + +# Overview + +A `Signer` is an interface that abstracts the interaction with a single Secp256k1 key pair. It exposes methods for +signing data, verifying signatures, and getting metadata associated with the key pair, such as the address. + +Currently, the `tm2-js-client` package provides support for two `Signer` implementations: + +- [Key](key.md): a signer that is based on a raw Secp256k1 key pair. +- [Ledger](ledger.md): a signer that is based on a Ledger device, with all interaction flowing through the user's + device. + +## API + +### getAddress + +Returns the address associated with the signer's public key + +Returns **Promise** + +#### Usage + +```ts +await signer.getAddress(); +// "g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq" +``` + +### getPublicKey + +Returns the signer's Secp256k1-compressed public key + +Returns **Promise** + +#### Usage + +```ts +await signer.getPublicKey(); +// +``` + +### getPrivateKey + +Returns the signer's actual raw private key + +Returns **Promise** + +#### Usage + +```ts +await signer.getPrivateKey(); +// +``` + +### signData + +Generates a data signature for arbitrary input + +#### Parameters + +* `data` **Uint8Array** the data to be signed + +Returns **Promise** + +#### Usage + +```ts +const dataToSign: Uint8Array = // ... + + await signer.signData(dataToSign); +// +``` + +### verifySignature + +Verifies if the signature matches the provided raw data + +#### Parameters + +* `data` **Uint8Array** the raw data (not-hashed) +* `signature` **Uint8Array** the hashed-data signature + +Returns **Promise** + +#### Usage + +```ts +const signedData: Uint8Array = // ... +const rawData: Uint8Array = // ... + + await signer.verifySignature(rawData, signedData); +// +``` + diff --git a/docs/reference/tm2-js-client/getting-started.md b/docs/reference/tm2-js-client/getting-started.md new file mode 100644 index 00000000000..4a20ce2684f --- /dev/null +++ b/docs/reference/tm2-js-client/getting-started.md @@ -0,0 +1,65 @@ +--- +id: tm2-js-getting-started +--- + +# Getting Started + +[@gnolang/tm2-js-client](https://github.com/gnolang/tm2-js-client) is a JavaScript/TypeScript client implementation for +Tendermint2-based chains. It is designed to make it +easy for developers to interact with TM2 chains, providing a simplified API for account and transaction management. By +doing all the heavy lifting behind the scenes, `@gnolang/tm2-js-client` enables developers to focus on what really +matters - +building their dApps. + +## Key Features + +- JSON-RPC and WebSocket client support via a `Provider` +- Simple account and transaction management API with a `Wallet` +- Designed for easy extension for custom TM2 chains, such as [Gnoland](https://gno.land) + +## Installation + +To install `@gnolang/tm2-js-client`, use your preferred package manager: + +```bash +yarn add @gnolang/tm2-js-client +``` + +```bash +npm install @gnolang/tm2-js-client +``` + +## Common Terminology + +### Provider + +A `Provider` is an interface that abstracts the interaction with the Tendermint2 chain, making it easier for users to +communicate with it. Rather than requiring users to understand which endpoints are exposed, what their return types are, +and how they are parsed, the `Provider` abstraction handles all of this behind the scenes. It exposes useful API methods +that users can use and expects concrete types in return. + +Currently, the `@gnolang/tm2-js-client` package provides support for two Provider implementations: + +- `JSON-RPC Provider`: executes each call as a separate HTTP RPC call. +- `WS Provider`: executes each call through an active WebSocket connection, which requires closing when not needed + anymore. + +### Signer + +A `Signer` is an interface that abstracts the interaction with a single Secp256k1 key pair. It exposes methods for +signing data, verifying signatures, and getting metadata associated with the key pair, such as the address. + +Currently, the `@gnolang/tm2-js-client` package provides support for two `Signer` implementations: + +- `Key`: a signer that is based on a raw Secp256k1 key pair. +- `Ledger`: a signer that is based on a Ledger device, with all interaction flowing through the user's device. + +### Wallet + +A `Wallet` is a user-facing API that is used to interact with an account. A `Wallet` instance is tied to a single key +pair and essentially wraps the given `Provider` for that specific account. + +A wallet can be generated from a randomly generated seed, a private key, or instantiated using a Ledger device. + +Using the `Wallet`, users can easily interact with the Tendermint2 chain using their account without having to worry +about account management. diff --git a/docs/reference/tm2-js-client/wallet.md b/docs/reference/tm2-js-client/wallet.md new file mode 100644 index 00000000000..8a6943dfc9a --- /dev/null +++ b/docs/reference/tm2-js-client/wallet.md @@ -0,0 +1,275 @@ +--- +id: tm2-js-wallet +--- + +# Wallet + +A `Wallet` is a user-facing API that is used to interact with an account. A `Wallet` instance is tied to a single key +pair and essentially wraps the given `Provider` for that specific account. + +A wallet can be generated from a randomly generated seed, a private key, or instantiated using a Ledger device. + +Using the `Wallet`, users can easily interact with the Tendermint2 chain using their account without having to worry +about account management. + +## Initialization + +### createRandom + +Generates a private key-based wallet, using a random seed + +#### Parameters + +* `options?` **AccountWalletOption** the account options + +Returns **Promise** + +#### Usage + +```ts +const wallet: Wallet = await Wallet.createRandom(); +// random wallet created +``` + +### fromMnemonic + +Generates a bip39 mnemonic-based wallet + +#### Parameters + +* `mnemonic` **string** the bip39 mnemonic +* `options?` **CreateWalletOptions** the wallet generation options + +Returns **Promise** + +#### Usage + +```ts +const mnemonic: string = // ... +const wallet: Wallet = await Wallet.fromMnemonic(mnemonic); +// wallet created from mnemonic +``` + +### fromPrivateKey + +Generates a private key-based wallet + +#### Parameters + +* `privateKey` **string** the private key +* `options?` **AccountWalletOption** the wallet generation options + +Returns **Promise** + +#### Usage + +```ts +// Generate the private key from somewhere +const {publicKey, privateKey} = await generateKeyPair( + entropyToMnemonic(generateEntropy()), + index ? index : 0 +); + +const wallet: Wallet = await Wallet.fromPrivateKey(privateKey); +// wallet created from private key +``` + +### fromLedger + +Creates a Ledger-based wallet + +#### Parameters + +* `connector` **LedgerConnector** the Ledger device connector +* `options?` **CreateWalletOptions** the wallet generation options + +Returns **Wallet** + +#### Usage + +```ts +const connector: LedgerConnector = // ... + +const wallet: Wallet = await Wallet.fromLedger(connector); +// wallet created from Ledger device connection +``` + +## Provider Methods + +### connect + +Connects the wallet to the specified Provider + +#### Parameters + +* `provider` **Provider** the active Provider, if any + +#### Usage + +```ts +const provider: Provider = // ... + + wallet.connect(provider); +// Provider connected to Wallet +``` + +### getProvider + +Returns the connected provider, if any + +Returns **Provider** + +#### Usage + +```ts +wallet.getProvider(); +// connected provider, if any (undefined if not) +``` + +## Account Methods + +### getAddress + +Fetches the address associated with the wallet + +Returns **Promise** + +#### Usage + +```ts +await wallet.getAddress(); +// "g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq" +``` + +### getSequence + +Fetches the account sequence for the wallet + +#### Parameters + +* `height` **number** the block height (optional, default `latest`) + +#### Usage + +```ts +await wallet.getSequence(); +// 42 +``` + +Returns **Promise** + +### getAccountNumber + +Fetches the account number for the wallet. Errors out if the +account is not initialized + +#### Parameters + +* `height` **number** the block height (optional, default `latest`) + +Returns **Promise** + +#### Usage + +```ts +await wallet.getAccountNumber(); +// 10 +``` + +### getBalance + +Fetches the account balance for the specific denomination + +#### Parameters + +* `denomination` **string** the fund denomination (optional, default `ugnot`) + +Returns **Promise** + +#### Usage + +```ts +await wallet.getBalance('ugnot'); +// 5000 +``` + +### getGasPrice + +Fetches the current (recommended) average gas price + +Returns **Promise** + +#### Usage + +```ts +await wallet.getGasPrice(); +// 63000 +``` + +### estimateGas + +Estimates the gas limit for the transaction + +#### Parameters + +* `tx` **Tx** the transaction that needs estimating + +Returns **Promise** + +#### Usage + +```ts +const tx: Tx = // ... + + await wallet.estimateGas(tx); +// 120000 +``` + +### signTransaction + +Generates a transaction signature, and appends it to the transaction + +#### Parameters + +* `tx` **Tx** the transaction to be signed + +Returns **Promise** + +#### Usage + +```ts +const tx: Tx = // ... + + await wallet.signTransaction(tx); +// transaction with appended signature +``` + +### sendTransaction + +Signs and sends the transaction. Returns the transaction hash (base-64) + +#### Parameters + +* `tx` **Tx** the unsigned transaction + +Returns **Promise** + +#### Usage + +```ts +await wallet.sendTransaction(tx); +// returns the transaction hash +``` + +### getSigner + +Returns the associated signer + +Returns **Signer** + +#### Usage + +```ts +wallet.getSigner(tx); +// Signer instance +``` diff --git a/examples/README.md b/examples/README.md index d0fd8d02952..b112e564d13 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,15 +1,21 @@ # Gnolang examples -Folder contains Gnolang realms and libraries demos. -Share contracts here to improve engine testing, although it's not required. -Consider separate repository for contracts, but this may limit experience due to ongoing gnomod support work. -Main repository can't reference separate code, causing potential development issues. +This folder showcases Gnolang realms and library demos. These examples not only aid in engine testing but also provide a glimpse into the potential of Gnolang's capabilities. + +While sharing contracts here can enhance engine testing, it's not mandatory. If considering a separate repository for contracts, be aware that this might restrict the experience due to the continuous efforts around `gno mod` support. A key point to note is that the main repository cannot reference separate code, which might pose developmental challenges. + +## Personal Realms & Shared Content + +**Prioritizing Shared Content:** As we expand our examples and use-cases, it's essential to prioritize shared content that benefits the broader community. These examples serve as a foundation and reference for all users. + +**Personal Realms Inclusion:** We're open to personal realms, but they must exemplify best practices and inspire others. To maintain our repository's organization, we may decline some realms. If so, consider uploading onchain and keeping source code separately. For higher acceptance odds, offer useful or original examples. + +**Recommended Approach:** +- Use `r/demo` and `p/demo` for generic examples and components that can be imported by others. These are meant to be easily referenced and utilized by the community. +- Personal realms are welcomed if they are easily maintainable with the Continuous Integration (CI) system. If a personal realm becomes cumbersome to maintain or doesn't align with the CI's checks, it might be relocated to a less prominent location or even removed. ## Usage -Our recommendation is to use the [gno](../gnovm/cmd/gno) utility to develop contracts locally before publishing them on-chain. -This approach offers a faster and streamlined workflow, along with additional debugging features. -Simply fork or create new contracts and refer to the Makefile. -Once everything looks good locally, you can then publish it on a localnet or testnet. +Our recommendation is to use the [gno](../gnovm/cmd/gno) utility to develop contracts locally before publishing them on-chain. This approach offers a faster and streamlined workflow, along with additional debugging features. Simply fork or create new contracts and refer to the Makefile. Once everything looks good locally, you can then publish it on a localnet or testnet. -See [`awesome-gno` tutorials](https://github.com/gnolang/awesome-gno#tutorials). +For further guidance and insights, please refer to the [`awesome-gno` tutorials](https://github.com/gnolang/awesome-gno#tutorials). diff --git a/examples/gno.land/p/demo/seqid/README.md b/examples/gno.land/p/demo/seqid/README.md new file mode 100644 index 00000000000..8b96f99cfed --- /dev/null +++ b/examples/gno.land/p/demo/seqid/README.md @@ -0,0 +1,36 @@ +# seqid + +``` +package seqid // import "gno.land/p/demo/seqid" + +Package seqid provides a simple way to have sequential IDs which will be ordered +correctly when inserted in an AVL tree. + +Sample usage: + + var id seqid.ID + var users avl.Tree + + func NewUser() { + users.Set(id.Next().Binary(), &User{ ... }) + } + +TYPES + +type ID uint64 + An ID is a simple sequential ID generator. + +func FromBinary(b string) (ID, bool) + FromBinary creates a new ID from the given string. + +func (i ID) Binary() string + Binary returns a big-endian binary representation of the ID, suitable to be + used as an AVL key. + +func (i *ID) Next() ID + Next advances the ID i. It will panic if increasing ID would overflow. + +func (i *ID) TryNext() (ID, bool) + TryNext increases i by 1 and returns its value. It returns true if + successful, or false if the increment would result in an overflow. +``` diff --git a/examples/gno.land/p/demo/seqid/gno.mod b/examples/gno.land/p/demo/seqid/gno.mod new file mode 100644 index 00000000000..63e6a1fb551 --- /dev/null +++ b/examples/gno.land/p/demo/seqid/gno.mod @@ -0,0 +1 @@ +module gno.land/p/demo/seqid diff --git a/examples/gno.land/p/demo/seqid/seqid.gno b/examples/gno.land/p/demo/seqid/seqid.gno new file mode 100644 index 00000000000..8cb5366ef44 --- /dev/null +++ b/examples/gno.land/p/demo/seqid/seqid.gno @@ -0,0 +1,57 @@ +// Package seqid provides a simple way to have sequential IDs which will be +// ordered correctly when inserted in an AVL tree. +// +// Sample usage: +// +// var id seqid.ID +// var users avl.Tree +// +// func NewUser() { +// users.Set(id.Next().Binary(), &User{ ... }) +// } +package seqid + +import "encoding/binary" + +// An ID is a simple sequential ID generator. +type ID uint64 + +// Next advances the ID i. +// It will panic if increasing ID would overflow. +func (i *ID) Next() ID { + next, ok := i.TryNext() + if !ok { + panic("seqid: next ID overflows uint64") + } + return next +} + +const maxID ID = 1<<64 - 1 + +// TryNext increases i by 1 and returns its value. +// It returns true if successful, or false if the increment would result in +// an overflow. +func (i *ID) TryNext() (ID, bool) { + if *i == maxID { + // Addition will overflow. + return 0, false + } + *i++ + return *i, true +} + +// Binary returns a big-endian binary representation of the ID, +// suitable to be used as an AVL key. +func (i ID) Binary() string { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(i)) + return string(buf) +} + +// FromBinary creates a new ID from the given string. +func FromBinary(b string) (ID, bool) { + if len(b) != 8 { + return 0, false + } + return ID(binary.BigEndian.Uint64([]byte(b))), true +} diff --git a/examples/gno.land/p/demo/seqid/seqid_test.gno b/examples/gno.land/p/demo/seqid/seqid_test.gno new file mode 100644 index 00000000000..c6f57960177 --- /dev/null +++ b/examples/gno.land/p/demo/seqid/seqid_test.gno @@ -0,0 +1,43 @@ +package seqid + +import ( + "fmt" + "strings" + "testing" +) + +func TestID(t *testing.T) { + var i ID + + for j := 0; j < 100; j++ { + i.Next() + } + if i != 100 { + t.Fatalf("invalid: wanted %d got %d", 100, i) + } +} + +func TestID_Overflow(t *testing.T) { + i := ID(maxID) + + defer func() { + err := recover() + if !strings.Contains(fmt.Sprint(err), "next ID overflows") { + t.Errorf("did not overflow") + } + }() + + i.Next() +} + +func TestID_Binary(t *testing.T) { + var i ID + prev := i.Binary() + + for j := 0; j < 1000; j++ { + cur := i.Next().Binary() + if cur <= prev { + t.Fatalf("cur %x <= prev %x", cur, prev) + } + } +} diff --git a/examples/gno.land/r/demo/boards/README.md b/examples/gno.land/r/demo/boards/README.md index 2729df055b1..849998b04e9 100644 --- a/examples/gno.land/r/demo/boards/README.md +++ b/examples/gno.land/r/demo/boards/README.md @@ -9,7 +9,7 @@ name ["gno.land/r/demo/boards"](https://gno.land/r/demo/boards/) NOTE: Where you see `-remote localhost:26657` here, that flag can be replaced with `-remote test3.gno.land:36657` if you have $GNOT on the testnet. -(To use the testnet, also replace `-chainid dev` with `-chainid testchain` .) +(To use the testnet, also replace `-chainid dev` with `-chainid test3` .) ### Build `gnokey` (and other tools). diff --git a/examples/gno.land/r/manfred/README.md b/examples/gno.land/r/manfred/README.md new file mode 100644 index 00000000000..e562f6eeb70 --- /dev/null +++ b/examples/gno.land/r/manfred/README.md @@ -0,0 +1,41 @@ +# Manfred's Personal Realms on gno.land + +## Introduction + +Welcome to the root directory of Manfred's personal realms on `gno.land`. Each +realm within this directory serves a specific purpose and offers a glimpse into +Manfred's interests, projects, and more. + +## ⚠️ Disclaimer + +This is a very early iteration and is subject to change frequently. The +structure and content of these realms are still in the experimental phase. The +concept was inspired by Jae Kwon's idea to manage his to-do list in +`jaekwon/home`. If you're using or referencing these realms, be prepared for +regular updates and modifications. + +## Structure + +- `manfred/home`: This is the main realm where Manfred lists items and topics of + interest to him. + `manfred/config`: Configuration used by other realms. +- `manfred/...`: Coming soon. + +## Usage + +Each realm can be accessed and interacted with individually. Typically, realms +implement a `Render()` function which presents the main content or functionality +of that realm. + +## Access Control + +All realms in this directory have a built-in security check to ensure that only +Manfred can interact with the contents in a meaningful way. Unauthorized access +attempts might be able to see the content but will not be able to make +modifications or access certain functionalities. + +## Contributions & Collaboration + +These realms are personal by nature. If you've stumbled upon them and have +suggestions or want to collaborate on a particular topic, please reach out +directly to Manfred. diff --git a/examples/gno.land/r/manfred/config/config.gno b/examples/gno.land/r/manfred/config/config.gno new file mode 100644 index 00000000000..23e90df50ff --- /dev/null +++ b/examples/gno.land/r/manfred/config/config.gno @@ -0,0 +1,20 @@ +package config + +import "std" + +var addr = std.Address("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq") + +func Addr() std.Address { + return addr +} + +func UpdateAddr(newAddr std.Address) { + AssertIsAdmin() + addr = newAddr +} + +func AssertIsAdmin() { + if std.GetOrigCaller() != addr { + panic("restricted area") + } +} diff --git a/examples/gno.land/r/manfred/config/gno.mod b/examples/gno.land/r/manfred/config/gno.mod new file mode 100644 index 00000000000..516bf38528e --- /dev/null +++ b/examples/gno.land/r/manfred/config/gno.mod @@ -0,0 +1 @@ +module gno.land/r/manfred/config diff --git a/examples/gno.land/r/manfred/home/gno.mod b/examples/gno.land/r/manfred/home/gno.mod new file mode 100644 index 00000000000..6e7aac70cc7 --- /dev/null +++ b/examples/gno.land/r/manfred/home/gno.mod @@ -0,0 +1,3 @@ +module gno.land/r/manfred/home + +require gno.land/r/manfred/config v0.0.0-latest diff --git a/examples/gno.land/r/manfred/home/home.gno b/examples/gno.land/r/manfred/home/home.gno new file mode 100644 index 00000000000..720796a2201 --- /dev/null +++ b/examples/gno.land/r/manfred/home/home.gno @@ -0,0 +1,56 @@ +package home + +import "gno.land/r/manfred/config" + +var ( + todos []string + status string + memeImgURL string +) + +func init() { + todos = append(todos, "fill this todo list...") + status = "Online" // Initial status set to "Online" + memeImgURL = "https://i.imgflip.com/7ze8dc.jpg" +} + +func Render(path string) string { + content := "# Manfred's (gn)home Dashboard\n\n" + + content += "## Meme\n" + content += "![](" + memeImgURL + ")\n\n" + + content += "## Status\n" + content += status + "\n\n" + + content += "## Personal ToDo List\n" + for _, todo := range todos { + content += "- [ ] " + todo + "\n" + } + content += "\n" + + // TODO: Implement a feature to list replies on r/boards on my posts + // TODO: Maybe integrate a calendar feature for upcoming events? + + return content +} + +func AddNewTodo(todo string) { + config.AssertIsAdmin() + todos = append(todos, todo) +} + +func DeleteTodo(todoIndex int) { + config.AssertIsAdmin() + if todoIndex >= 0 && todoIndex < len(todos) { + // Remove the todo from the list by merging slices from before and after the todo + todos = append(todos[:todoIndex], todos[todoIndex+1:]...) + } else { + panic("Invalid todo index") + } +} + +func UpdateStatus(newStatus string) { + config.AssertIsAdmin() + status = newStatus +} diff --git a/examples/gno.land/r/manfred/home/z1_filetest.gno b/examples/gno.land/r/manfred/home/z1_filetest.gno new file mode 100644 index 00000000000..801efedb306 --- /dev/null +++ b/examples/gno.land/r/manfred/home/z1_filetest.gno @@ -0,0 +1,19 @@ +package main + +import "gno.land/r/manfred/home" + +func main() { + println(home.Render("")) +} + +// Output: +// # Manfred's (gn)home Dashboard +// +// ## Meme +// ![](https://i.imgflip.com/7ze8dc.jpg) +// +// ## Status +// Online +// +// ## Personal ToDo List +// - [ ] fill this todo list... diff --git a/examples/gno.land/r/manfred/home/z2_filetest.gno b/examples/gno.land/r/manfred/home/z2_filetest.gno new file mode 100644 index 00000000000..316fd400867 --- /dev/null +++ b/examples/gno.land/r/manfred/home/z2_filetest.gno @@ -0,0 +1,35 @@ +package main + +import ( + "std" + + "gno.land/r/manfred/home" +) + +func main() { + std.TestSetOrigCaller("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq") + home.AddNewTodo("aaa") + home.AddNewTodo("bbb") + home.AddNewTodo("ccc") + home.AddNewTodo("ddd") + home.AddNewTodo("eee") + home.UpdateStatus("Lorem Ipsum") + home.DeleteTodo(3) + println(home.Render("")) +} + +// Output: +// # Manfred's (gn)home Dashboard +// +// ## Meme +// ![](https://i.imgflip.com/7ze8dc.jpg) +// +// ## Status +// Lorem Ipsum +// +// ## Personal ToDo List +// - [ ] fill this todo list... +// - [ ] aaa +// - [ ] bbb +// - [ ] ddd +// - [ ] eee diff --git a/gno.land/Makefile b/gno.land/Makefile index 29c192e9987..1297da393cb 100644 --- a/gno.land/Makefile +++ b/gno.land/Makefile @@ -18,6 +18,9 @@ build.gnokey:; go build -o build/gnokey ./cmd/gnokey build.gnotxsync:; go build -o build/gnotxsync ./cmd/gnotxsync build.genesis:; go build -o build/genesis ./cmd/genesis +run.gnoland:; go run ./cmd/gnoland start +run.gnoweb:; go run ./cmd/gnoweb + .PHONY: install install: install.gnoland install.gnoweb install.gnofaucet install.gnokey install.gnotxsync install.genesis diff --git a/gno.land/cmd/gnokey/main.go b/gno.land/cmd/gnokey/main.go index 28cb665eac1..57a58bfee9c 100644 --- a/gno.land/cmd/gnokey/main.go +++ b/gno.land/cmd/gnokey/main.go @@ -5,13 +5,18 @@ import ( "fmt" "os" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/tm2/pkg/commands" "github.com/gnolang/gno/tm2/pkg/crypto/keys/client" ) func main() { - cmd := client.NewRootCmd(commands.NewDefaultIO()) + baseCfg := client.BaseOptions{ + Home: gnoenv.HomeDir(), + Remote: "127.0.0.1:26657", + } + cmd := client.NewRootCmdWithBaseConfig(commands.NewDefaultIO(), baseCfg) if err := cmd.ParseAndRun(context.Background(), os.Args[1:]); err != nil { _, _ = fmt.Fprintf(os.Stderr, "%+v\n", err) diff --git a/gno.land/cmd/gnoland/start.go b/gno.land/cmd/gnoland/start.go index 77d6eb4ed51..9ca2369c6eb 100644 --- a/gno.land/cmd/gnoland/start.go +++ b/gno.land/cmd/gnoland/start.go @@ -10,6 +10,7 @@ import ( "time" "github.com/gnolang/gno/gno.land/pkg/gnoland" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" abci "github.com/gnolang/gno/tm2/pkg/bft/abci/types" "github.com/gnolang/gno/tm2/pkg/bft/config" "github.com/gnolang/gno/tm2/pkg/bft/node" @@ -59,7 +60,7 @@ func newStartCmd(io commands.IO) *commands.Command { } func (c *startCfg) RegisterFlags(fs *flag.FlagSet) { - gnoroot := gnoland.MustGuessGnoRootDir() + gnoroot := gnoenv.RootDir() defaultGenesisBalancesFile := filepath.Join(gnoroot, "gno.land", "genesis", "genesis_balances.txt") defaultGenesisTxsFile := filepath.Join(gnoroot, "gno.land", "genesis", "genesis_txs.txt") diff --git a/gno.land/cmd/gnoland/testdata/addpkg.txtar b/gno.land/cmd/gnoland/testdata/addpkg.txtar index 5f1ee0caf49..7130fe54dab 100644 --- a/gno.land/cmd/gnoland/testdata/addpkg.txtar +++ b/gno.land/cmd/gnoland/testdata/addpkg.txtar @@ -15,11 +15,9 @@ stdout 'OK!' stdout 'GAS WANTED: 2000000' stdout 'GAS USED: [0-9]+' - -- bar.gno -- package bar func Render(path string) string { return "hello from foo" -} - +} \ No newline at end of file diff --git a/gno.land/cmd/gnoland/testdata/run.txtar b/gno.land/cmd/gnoland/testdata/run.txtar new file mode 100644 index 00000000000..94b32de041e --- /dev/null +++ b/gno.land/cmd/gnoland/testdata/run.txtar @@ -0,0 +1,28 @@ +## start a new node +gnoland start + +## add bar.gno package located in $WORK directory as gno.land/r/foobar/bar +gnokey maketx addpkg -pkgdir $WORK/bar -pkgpath gno.land/r/foobar/bar -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 + +## execute Render +gnokey maketx run -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 $WORK/script/script.gno + +## compare render +stdout 'main: --- hello from foo ---' +stdout 'OK!' +stdout 'GAS WANTED: 200000' +stdout 'GAS USED: ' + +-- bar/bar.gno -- +package bar + +func Render(path string) string { + return "hello from foo" +} + +-- script/script.gno -- +package main +import "gno.land/r/foobar/bar" +func main() { + println("main: ---", bar.Render(""), "---") +} diff --git a/gno.land/cmd/gnoweb/main_test.go b/gno.land/cmd/gnoweb/main_test.go index 61650563405..2bec0a9ac37 100644 --- a/gno.land/cmd/gnoweb/main_test.go +++ b/gno.land/cmd/gnoweb/main_test.go @@ -7,8 +7,8 @@ import ( "strings" "testing" - "github.com/gnolang/gno/gno.land/pkg/gnoland" "github.com/gnolang/gno/gno.land/pkg/integration" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/tm2/pkg/log" "github.com/gotuna/gotuna/test/assert" ) @@ -44,7 +44,7 @@ func TestRoutes(t *testing.T) { {"/404-not-found", notFound, "/404-not-found"}, } - config, _ := integration.TestingNodeConfig(t, gnoland.MustGuessGnoRootDir()) + config, _ := integration.TestingNodeConfig(t, gnoenv.RootDir()) node, remoteAddr := integration.TestingInMemoryNode(t, log.NewNopLogger(), config) defer node.Stop() @@ -92,7 +92,7 @@ func TestAnalytics(t *testing.T) { "/404-not-found", } - config, _ := integration.TestingNodeConfig(t, gnoland.MustGuessGnoRootDir()) + config, _ := integration.TestingNodeConfig(t, gnoenv.RootDir()) node, remoteAddr := integration.TestingInMemoryNode(t, log.NewNopLogger(), config) defer node.Stop() diff --git a/gno.land/pkg/gnoland/app.go b/gno.land/pkg/gnoland/app.go index 0610cd4a93f..a1e917dd8d1 100644 --- a/gno.land/pkg/gnoland/app.go +++ b/gno.land/pkg/gnoland/app.go @@ -1,15 +1,11 @@ package gnoland import ( - "errors" "fmt" - "os" - "os/exec" "path/filepath" - "runtime" - "strings" "github.com/gnolang/gno/gno.land/pkg/sdk/vm" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/tm2/pkg/amino" abci "github.com/gnolang/gno/tm2/pkg/bft/abci/types" dbm "github.com/gnolang/gno/tm2/pkg/db" @@ -37,7 +33,7 @@ func NewAppOptions() *AppOptions { return &AppOptions{ Logger: log.NewNopLogger(), DB: dbm.NewMemDB(), - GnoRootDir: MustGuessGnoRootDir(), + GnoRootDir: gnoenv.RootDir(), } } @@ -180,45 +176,3 @@ func EndBlocker(vmk vm.VMKeeperI) func(ctx sdk.Context, req abci.RequestEndBlock return abci.ResponseEndBlock{} } } - -// XXX: all the method bellow should be removed in favor of -// https://github.com/gnolang/gno/pull/1233 -func MustGuessGnoRootDir() string { - root, err := GuessGnoRootDir() - if err != nil { - panic(err) - } - - return root -} - -func GuessGnoRootDir() (string, error) { - // First try to get the root directory from the GNOROOT environment variable. - if rootdir := os.Getenv("GNOROOT"); rootdir != "" { - return filepath.Clean(rootdir), nil - } - - // Try to guess GNOROOT using the nearest go.mod. - if gobin, err := exec.LookPath("go"); err == nil { - // If GNOROOT is not set, try to guess the root directory using the `go list` command. - cmd := exec.Command(gobin, "list", "-m", "-mod=mod", "-f", "{{.Dir}}", "github.com/gnolang/gno") - out, err := cmd.CombinedOutput() - if err == nil { - return strings.TrimSpace(string(out)), nil - } - } - - // Try to guess GNOROOT using caller stack. - if _, filename, _, ok := runtime.Caller(1); ok && filepath.IsAbs(filename) { - if currentDir := filepath.Dir(filename); currentDir != "" { - // Gno root directory relative from `app.go` path: - // gno/ .. /gno.land/ .. /pkg/ .. /gnoland/app.go - rootdir, err := filepath.Abs(filepath.Join(currentDir, "..", "..", "..")) - if err == nil { - return rootdir, nil - } - } - } - - return "", errors.New("unable to guess gno's root-directory") -} diff --git a/gno.land/pkg/integration/testing_integration.go b/gno.land/pkg/integration/testing_integration.go index b10686b0105..0d19237eab3 100644 --- a/gno.land/pkg/integration/testing_integration.go +++ b/gno.land/pkg/integration/testing_integration.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "github.com/gnolang/gno/gno.land/pkg/gnoland" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/tm2/pkg/bft/node" "github.com/gnolang/gno/tm2/pkg/commands" "github.com/gnolang/gno/tm2/pkg/crypto/keys" @@ -63,7 +63,7 @@ func setupGnolandTestScript(t *testing.T, txtarDir string) testscript.Params { // `gnoRootDir` should point to the local location of the gno repository. // It serves as the gno equivalent of GOROOT. - gnoRootDir := gnoland.MustGuessGnoRootDir() + gnoRootDir := gnoenv.RootDir() // `gnoHomeDir` should be the local directory where gnokey stores keys. gnoHomeDir := filepath.Join(tmpdir, "gno") @@ -263,7 +263,7 @@ func getTestingLogger(env *testscript.Env, logname string) (log.Logger, error) { func tsValidateError(ts *testscript.TestScript, cmd string, neg bool, err error) { if err != nil { - fmt.Fprintf(ts.Stderr(), "%q error: %v\n", cmd, err) + fmt.Fprintf(ts.Stderr(), "%q error: %+v\n", cmd, err) if !neg { ts.Fatalf("unexpected %q command failure: %s", cmd, err) } diff --git a/gno.land/pkg/sdk/vm/handler.go b/gno.land/pkg/sdk/vm/handler.go index accaa70e059..6c3a97696d6 100644 --- a/gno.land/pkg/sdk/vm/handler.go +++ b/gno.land/pkg/sdk/vm/handler.go @@ -27,6 +27,8 @@ func (vh vmHandler) Process(ctx sdk.Context, msg std.Msg) sdk.Result { return vh.handleMsgAddPackage(ctx, msg) case MsgCall: return vh.handleMsgCall(ctx, msg) + case MsgRun: + return vh.handleMsgRun(ctx, msg) default: errMsg := fmt.Sprintf("unrecognized vm message type: %T", msg) return abciResult(std.ErrUnknownRequest(errMsg)) @@ -77,6 +79,25 @@ func (vh vmHandler) handleMsgCall(ctx sdk.Context, msg MsgCall) (res sdk.Result) */ } +// Handle MsgRun. +func (vh vmHandler) handleMsgRun(ctx sdk.Context, msg MsgRun) (res sdk.Result) { + amount, err := std.ParseCoins("1000000ugnot") // XXX calculate + if err != nil { + return abciResult(err) + } + err = vh.vm.bank.SendCoins(ctx, msg.Caller, auth.FeeCollectorAddress(), amount) + if err != nil { + return abciResult(err) + } + resstr := "" + resstr, err = vh.vm.Run(ctx, msg) + if err != nil { + return abciResult(err) + } + res.Data = []byte(resstr) + return +} + //---------------------------------------- // Query diff --git a/gno.land/pkg/sdk/vm/keeper.go b/gno.land/pkg/sdk/vm/keeper.go index 6f695e98558..b0ae2180c36 100644 --- a/gno.land/pkg/sdk/vm/keeper.go +++ b/gno.land/pkg/sdk/vm/keeper.go @@ -3,8 +3,10 @@ package vm // TODO: move most of the logic in ROOT/gno.land/... import ( + "bytes" "fmt" "os" + "regexp" "strings" gno "github.com/gnolang/gno/gnovm/pkg/gnolang" @@ -27,6 +29,7 @@ const ( type VMKeeperI interface { AddPackage(ctx sdk.Context, msg MsgAddPackage) error Call(ctx sdk.Context, msg MsgCall) (res string, err error) + Run(ctx sdk.Context, msg MsgRun) (res string, err error) } var _ VMKeeperI = &VMKeeper{} @@ -128,6 +131,10 @@ func (vm *VMKeeper) getGnoStore(ctx sdk.Context) gno.Store { } } +const ( + reReservedPath = `gno\.land/r/g[a-z0-9]+/run` +) + // AddPackage adds a package with given fileset. func (vm *VMKeeper) AddPackage(ctx sdk.Context, msg MsgAddPackage) error { creator := msg.Creator @@ -150,6 +157,11 @@ func (vm *VMKeeper) AddPackage(ctx sdk.Context, msg MsgAddPackage) error { if pv := store.GetPackage(pkgPath, false); pv != nil { return ErrInvalidPkgPath("package already exists: " + pkgPath) } + + if ok, _ := regexp.MatchString(reReservedPath, pkgPath); ok { + return ErrInvalidPkgPath("reserved package name: " + pkgPath) + } + // Pay deposit from creator. pkgAddr := gno.DerivePkgAddr(pkgPath) @@ -282,6 +294,80 @@ func (vm *VMKeeper) Call(ctx sdk.Context, msg MsgCall) (res string, err error) { // TODO pay for gas? TODO see context? } +// Run executes arbitrary Gno code in the context of the caller's realm. +func (vm *VMKeeper) Run(ctx sdk.Context, msg MsgRun) (res string, err error) { + caller := msg.Caller + pkgAddr := caller + store := vm.getGnoStore(ctx) + send := msg.Send + memPkg := msg.Package + + // Validate arguments. + callerAcc := vm.acck.GetAccount(ctx, caller) + if callerAcc == nil { + return "", std.ErrUnknownAddress(fmt.Sprintf("account %s does not exist", caller)) + } + if err := msg.Package.Validate(); err != nil { + return "", ErrInvalidPkgPath(err.Error()) + } + + // Send send-coins to pkg from caller. + err = vm.bank.SendCoins(ctx, caller, pkgAddr, send) + if err != nil { + return "", err + } + + // Parse and run the files, construct *PV. + msgCtx := stdlibs.ExecContext{ + ChainID: ctx.ChainID(), + Height: ctx.BlockHeight(), + Timestamp: ctx.BlockTime().Unix(), + Msg: msg, + OrigCaller: caller.Bech32(), + OrigSend: send, + OrigSendSpent: new(std.Coins), + OrigPkgAddr: pkgAddr.Bech32(), + Banker: NewSDKBanker(vm, ctx), + } + // Parse and run the files, construct *PV. + buf := new(bytes.Buffer) + m := gno.NewMachineWithOptions( + gno.MachineOptions{ + PkgPath: "", + Output: buf, + Store: store, + Alloc: store.GetAllocator(), + Context: msgCtx, + MaxCycles: vm.maxCycles, + }) + defer m.Release() + _, pv := m.RunMemPackage(memPkg, false) + ctx.Logger().Info("CPUCYCLES", "addpkg", m.Cycles) + + m2 := gno.NewMachineWithOptions( + gno.MachineOptions{ + PkgPath: "", + Output: buf, + Store: store, + Alloc: store.GetAllocator(), + Context: msgCtx, + MaxCycles: vm.maxCycles, + }) + m2.SetActivePackage(pv) + defer func() { + if r := recover(); r != nil { + err = errors.Wrap(fmt.Errorf("%v", r), "VM call panic: %v\n%s\n", + r, m2.String()) + return + } + m2.Release() + }() + m2.RunMain() + ctx.Logger().Info("CPUCYCLES call: ", m2.Cycles) + res = buf.String() + return res, nil +} + // QueryFuncs returns public facing function signatures. func (vm *VMKeeper) QueryFuncs(ctx sdk.Context, pkgPath string) (fsigs FunctionSignatures, err error) { store := vm.getGnoStore(ctx) diff --git a/gno.land/pkg/sdk/vm/keeper_test.go b/gno.land/pkg/sdk/vm/keeper_test.go index 27a1054e914..294efa66fa5 100644 --- a/gno.land/pkg/sdk/vm/keeper_test.go +++ b/gno.land/pkg/sdk/vm/keeper_test.go @@ -337,3 +337,61 @@ func GetAdmin() string { assert.NoError(t, err) assert.Equal(t, res, addrString) } + +// Call Run without imports, without variables. +func TestVMKeeperRunSimple(t *testing.T) { + env := setupTestEnv() + ctx := env.ctx + + // Give "addr1" some gnots. + addr := crypto.AddressFromPreimage([]byte("addr1")) + acc := env.acck.NewAccountWithAddress(ctx, addr) + env.acck.SetAccount(ctx, acc) + + files := []*std.MemFile{ + {"script.gno", ` +package main + +func main() { + println("hello world!") +} +`}, + } + + coins := std.MustParseCoins("") + msg2 := NewMsgRun(addr, coins, files) + res, err := env.vmk.Run(ctx, msg2) + assert.NoError(t, err) + assert.Equal(t, res, "hello world!\n") +} + +// Call Run with stdlibs. +func TestVMKeeperRunImportStdlibs(t *testing.T) { + env := setupTestEnv() + ctx := env.ctx + + // Give "addr1" some gnots. + addr := crypto.AddressFromPreimage([]byte("addr1")) + acc := env.acck.NewAccountWithAddress(ctx, addr) + env.acck.SetAccount(ctx, acc) + + files := []*std.MemFile{ + {"script.gno", ` +package main + +import "std" + +func main() { + addr := std.GetOrigCaller() + println("hello world!", addr) +} +`}, + } + + coins := std.MustParseCoins("") + msg2 := NewMsgRun(addr, coins, files) + res, err := env.vmk.Run(ctx, msg2) + assert.NoError(t, err) + expectedString := fmt.Sprintf("hello world! %s\n", addr.String()) + assert.Equal(t, res, expectedString) +} diff --git a/gno.land/pkg/sdk/vm/msgs.go b/gno.land/pkg/sdk/vm/msgs.go index 3cfc6c58224..f1e65ae25cb 100644 --- a/gno.land/pkg/sdk/vm/msgs.go +++ b/gno.land/pkg/sdk/vm/msgs.go @@ -135,3 +135,67 @@ func (msg MsgCall) GetSigners() []crypto.Address { func (msg MsgCall) GetReceived() std.Coins { return msg.Send } + +//---------------------------------------- +// MsgRun + +// MsgRun - executes arbitrary Gno code. +type MsgRun struct { + Caller crypto.Address `json:"caller" yaml:"caller"` + Send std.Coins `json:"send" yaml:"send"` + Package *std.MemPackage `json:"package" yaml:"package"` +} + +var _ std.Msg = MsgRun{} + +func NewMsgRun(caller crypto.Address, send std.Coins, files []*std.MemFile) MsgRun { + for _, file := range files { + if strings.HasSuffix(file.Name, ".gno") { + pkgName := string(gno.PackageNameFromFileBody(file.Name, file.Body)) + if pkgName != "main" { + panic("package name should be 'main'") + } + } + } + return MsgRun{ + Caller: caller, + Send: send, + Package: &std.MemPackage{ + Name: "main", + Path: "gno.land/r/" + caller.String() + "/run", + Files: files, + }, + } +} + +// Implements Msg. +func (msg MsgRun) Route() string { return RouterKey } + +// Implements Msg. +func (msg MsgRun) Type() string { return "run" } + +// Implements Msg. +func (msg MsgRun) ValidateBasic() error { + if msg.Caller.IsZero() { + return std.ErrInvalidAddress("missing caller address") + } + if msg.Package.Path == "" { // XXX + return ErrInvalidPkgPath("missing package path") + } + return nil +} + +// Implements Msg. +func (msg MsgRun) GetSignBytes() []byte { + return std.MustSortJSON(amino.MustMarshalJSON(msg)) +} + +// Implements Msg. +func (msg MsgRun) GetSigners() []crypto.Address { + return []crypto.Address{msg.Caller} +} + +// Implements ReceiveMsg. +func (msg MsgRun) GetReceived() std.Coins { + return msg.Send +} diff --git a/gno.land/pkg/sdk/vm/package.go b/gno.land/pkg/sdk/vm/package.go index 5d05c108bd0..01fad3284e3 100644 --- a/gno.land/pkg/sdk/vm/package.go +++ b/gno.land/pkg/sdk/vm/package.go @@ -13,6 +13,7 @@ var Package = amino.RegisterPackage(amino.NewPackage( std.Package, ).WithTypes( MsgCall{}, "m_call", + MsgRun{}, "m_run", MsgAddPackage{}, "m_addpkg", // TODO rename both to MsgAddPkg? // errors diff --git a/gno.land/pkg/sdk/vm/vm.proto b/gno.land/pkg/sdk/vm/vm.proto index 27e68042bdf..b99be0a85ff 100644 --- a/gno.land/pkg/sdk/vm/vm.proto +++ b/gno.land/pkg/sdk/vm/vm.proto @@ -8,17 +8,17 @@ import "github.com/gnolang/gno/tm2/pkg/std/std.proto"; // messages message m_call { - string Caller = 1; - string Send = 2; - string PkgPath = 3; - string Func = 4; - repeated string Args = 5; + string caller = 1; + string send = 2; + string pkg_path = 3; + string func = 4; + repeated string args = 5; } message m_addpkg { - string Creator = 1; - std.MemPackage Package = 2; - string Deposit = 3; + string creator = 1; + std.MemPackage package = 2; + string deposit = 3; } message InvalidPkgPathError { @@ -28,4 +28,4 @@ message InvalidStmtError { } message InvalidExprError { -} +} \ No newline at end of file diff --git a/gnovm/Makefile b/gnovm/Makefile index 34e94f88633..29510e9a1da 100644 --- a/gnovm/Makefile +++ b/gnovm/Makefile @@ -1,3 +1,5 @@ +GNOROOT_DIR ?= $(abspath $(lastword $(MAKEFILE_LIST))/../../) + .PHONY: help help: @echo "Available make commands:" @@ -5,13 +7,16 @@ help: rundep=go run -modfile ../misc/devdeps/go.mod +# We can't use '-trimpath' yet as amino use absolute path from call stack +# to find some directory: see #1236 +GOBUILD_FLAGS := -ldflags "-X github.com/gnolang/gno/gnovm/pkg/gnoenv._GNOROOT=$(GNOROOT_DIR)" .PHONY: build build: - go build -o build/gno ./cmd/gno + go build $(GOBUILD_FLAGS) -o build/gno ./cmd/gno .PHONY: install install: - go install ./cmd/gno + go install $(GOBUILD_FLAGS) ./cmd/gno .PHONY: clean clean: diff --git a/gnovm/cmd/gno/build.go b/gnovm/cmd/gno/build.go deleted file mode 100644 index 7396d17fd8f..00000000000 --- a/gnovm/cmd/gno/build.go +++ /dev/null @@ -1,92 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "os" - - gno "github.com/gnolang/gno/gnovm/pkg/gnolang" - "github.com/gnolang/gno/tm2/pkg/commands" -) - -type buildCfg struct { - verbose bool - goBinary string -} - -var defaultBuildOptions = &buildCfg{ - verbose: false, - goBinary: "go", -} - -func newBuildCmd(io commands.IO) *commands.Command { - cfg := &buildCfg{} - - return commands.NewCommand( - commands.Metadata{ - Name: "build", - ShortUsage: "build [flags] ", - ShortHelp: "Builds the specified gno package", - }, - cfg, - func(_ context.Context, args []string) error { - return execBuild(cfg, args, io) - }, - ) -} - -func (c *buildCfg) RegisterFlags(fs *flag.FlagSet) { - fs.BoolVar( - &c.verbose, - "verbose", - defaultBuildOptions.verbose, - "verbose output when building", - ) - - fs.StringVar( - &c.goBinary, - "go-binary", - defaultBuildOptions.goBinary, - "go binary to use for building", - ) -} - -func execBuild(cfg *buildCfg, args []string, io commands.IO) error { - if len(args) < 1 { - return flag.ErrHelp - } - - paths, err := gnoPackagesFromArgs(args) - if err != nil { - return fmt.Errorf("list packages: %w", err) - } - - errCount := 0 - for _, pkgPath := range paths { - err = goBuildFileOrPkg(pkgPath, cfg) - if err != nil { - err = fmt.Errorf("%s: build pkg: %w", pkgPath, err) - io.ErrPrintfln("%s\n", err.Error()) - - errCount++ - } - } - - if errCount > 0 { - return fmt.Errorf("%d go build errors", errCount) - } - - return nil -} - -func goBuildFileOrPkg(fileOrPkg string, cfg *buildCfg) error { - verbose := cfg.verbose - goBinary := cfg.goBinary - - if verbose { - fmt.Fprintf(os.Stderr, "%s\n", fileOrPkg) - } - - return gno.PrecompileBuildPackage(fileOrPkg, goBinary) -} diff --git a/gnovm/cmd/gno/build_test.go b/gnovm/cmd/gno/build_test.go deleted file mode 100644 index 81aed7d1c79..00000000000 --- a/gnovm/cmd/gno/build_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "testing" - - "github.com/gnolang/gno/gnovm/pkg/integration" - "github.com/rogpeppe/go-internal/testscript" - "github.com/stretchr/testify/require" -) - -func Test_ScriptsBuild(t *testing.T) { - p := testscript.Params{ - Dir: "testdata/gno_build", - } - - if coverdir, ok := integration.ResolveCoverageDir(); ok { - err := integration.SetupTestscriptsCoverage(&p, coverdir) - require.NoError(t, err) - } - - err := integration.SetupGno(&p, t.TempDir()) - require.NoError(t, err) - - testscript.Run(t, p) -} diff --git a/gnovm/cmd/gno/clean.go b/gnovm/cmd/gno/clean.go index dad5332c4fa..444131986cb 100644 --- a/gnovm/cmd/gno/clean.go +++ b/gnovm/cmd/gno/clean.go @@ -9,9 +9,9 @@ import ( "path/filepath" "strings" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/gnovm/pkg/gnomod" "github.com/gnolang/gno/tm2/pkg/commands" - "github.com/gnolang/gno/tm2/pkg/crypto/keys/client" ) type cleanCfg struct { @@ -82,7 +82,7 @@ func execClean(cfg *cleanCfg, args []string, io commands.IO) error { } if cfg.modCache { - modCacheDir := filepath.Join(client.HomeDir(), "pkg", "mod") + modCacheDir := filepath.Join(gnoenv.HomeDir(), "pkg", "mod") if !cfg.dryRun { if err := os.RemoveAll(modCacheDir); err != nil { return err diff --git a/gnovm/cmd/gno/doc.go b/gnovm/cmd/gno/doc.go index 4617c31741e..1661abd9b84 100644 --- a/gnovm/cmd/gno/doc.go +++ b/gnovm/cmd/gno/doc.go @@ -10,6 +10,7 @@ import ( "path/filepath" "github.com/gnolang/gno/gnovm/pkg/doc" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/gnovm/pkg/gnomod" "github.com/gnolang/gno/tm2/pkg/commands" ) @@ -77,7 +78,7 @@ func (c *docCfg) RegisterFlags(fs *flag.FlagSet) { func execDoc(cfg *docCfg, args []string, io commands.IO) error { // guess opts.RootDir if cfg.rootDir == "" { - cfg.rootDir = guessRootDir() + cfg.rootDir = gnoenv.RootDir() } wd, err := os.Getwd() diff --git a/gnovm/cmd/gno/env.go b/gnovm/cmd/gno/env.go new file mode 100644 index 00000000000..4ccd1873c3f --- /dev/null +++ b/gnovm/cmd/gno/env.go @@ -0,0 +1,113 @@ +package main + +import ( + "context" + "flag" + + "github.com/gnolang/gno/gnovm/pkg/gnoenv" + "github.com/gnolang/gno/tm2/pkg/commands" +) + +type envCfg struct { + json bool +} + +func newEnvCmd(io commands.IO) *commands.Command { + c := &envCfg{} + return commands.NewCommand( + commands.Metadata{ + Name: "env", + ShortUsage: "env [flags] ", + ShortHelp: "`env` prints Gno environment information", + }, + c, + func(_ context.Context, args []string) error { + return execEnv(c, args, io) + }, + ) +} + +func (c *envCfg) RegisterFlags(fs *flag.FlagSet) { + fs.BoolVar( + &c.json, + "json", + false, + "Prints the environment in JSON format instead of as a shell script.", + ) +} + +type envVar struct { + Key string + Value string +} + +func findEnv(env []envVar, name string) string { + for _, e := range env { + if e.Key == name { + return e.Value + } + } + return "" +} + +type envPrinter func(vars []envVar, io commands.IO) + +func execEnv(cfg *envCfg, args []string, io commands.IO) error { + envs := []envVar{ + // GNOROOT Should point to the local location of the GNO repository. + // It serves as the gno equivalent of `GOROOT`. + {Key: "GNOROOT", Value: gnoenv.RootDir()}, + // GNOHOME Should point to the user local configuration. + // The most common place for this should be $HOME/gno. + {Key: "GNOHOME", Value: gnoenv.HomeDir()}, + } + + // Setup filters + filters := make([]envVar, len(args)) + for i, arg := range args { + filters[i] = envVar{Key: arg, Value: findEnv(envs, arg)} + } + + // Setup printer + var printerEnv envPrinter + if cfg.json { + printerEnv = printJSON + } else { + printerEnv = getPrinterShell(len(args) == 0) + } + + // Print environements + if len(filters) > 0 { + printerEnv(filters, io) + } else { + printerEnv(envs, io) + } + + return nil +} + +func getPrinterShell(printkeys bool) envPrinter { + return func(vars []envVar, io commands.IO) { + for _, env := range vars { + if printkeys { + io.Printf("%s=%q\n", env.Key, env.Value) + } else { + io.Printf("%s\n", env.Value) + } + } + } +} + +func printJSON(vars []envVar, io commands.IO) { + io.Println("{") + for i, env := range vars { + io.Printf("\t%q: %q", env.Key, env.Value) + if i != len(vars)-1 { + io.Printf(",") + } + + // Jump to next line + io.Printf("\n") + } + io.Println("}") +} diff --git a/gnovm/cmd/gno/env_test.go b/gnovm/cmd/gno/env_test.go new file mode 100644 index 00000000000..8aeb84ab2cc --- /dev/null +++ b/gnovm/cmd/gno/env_test.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "testing" +) + +func TestEnvApp(t *testing.T) { + const ( + testGnoRootEnv = "/faster/better/stronger" + testGnoHomeEnv = "/around/the/world" + ) + + t.Setenv("GNOROOT", testGnoRootEnv) + t.Setenv("GNOHOME", testGnoHomeEnv) + tc := []testMainCase{ + // shell + {args: []string{"env", "foo"}, stdoutShouldBe: "\n"}, + {args: []string{"env", "foo", "bar"}, stdoutShouldBe: "\n\n"}, + {args: []string{"env", "GNOROOT"}, stdoutShouldBe: testGnoRootEnv + "\n"}, + {args: []string{"env", "GNOHOME", "storm"}, stdoutShouldBe: testGnoHomeEnv + "\n\n"}, + {args: []string{"env"}, stdoutShouldContain: fmt.Sprintf("GNOROOT=%q", testGnoRootEnv)}, + {args: []string{"env"}, stdoutShouldContain: fmt.Sprintf("GNOHOME=%q", testGnoHomeEnv)}, + + // json + {args: []string{"env", "-json"}, stdoutShouldContain: fmt.Sprintf("\"GNOROOT\": %q", testGnoRootEnv)}, + {args: []string{"env", "-json"}, stdoutShouldContain: fmt.Sprintf("\"GNOHOME\": %q", testGnoHomeEnv)}, + { + args: []string{"env", "-json", "GNOROOT"}, + stdoutShouldBe: fmt.Sprintf("{\n\t\"GNOROOT\": %q\n}\n", testGnoRootEnv), + }, + { + args: []string{"env", "-json", "GNOROOT", "storm"}, + stdoutShouldBe: fmt.Sprintf("{\n\t\"GNOROOT\": %q,\n\t\"storm\": \"\"\n}\n", testGnoRootEnv), + }, + { + args: []string{"env", "-json", "storm"}, + stdoutShouldBe: "{\n\t\"storm\": \"\"\n}\n", + }, + } + + testMainCaseRun(t, tc) +} diff --git a/gnovm/cmd/gno/lint.go b/gnovm/cmd/gno/lint.go index ad223afa3b0..a90f432b7c9 100644 --- a/gnovm/cmd/gno/lint.go +++ b/gnovm/cmd/gno/lint.go @@ -7,6 +7,7 @@ import ( "os" "path/filepath" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/tm2/pkg/commands" osm "github.com/gnolang/gno/tm2/pkg/os" ) @@ -51,7 +52,7 @@ func execLint(cfg *lintCfg, args []string, io commands.IO) error { rootDir = cfg.rootDir ) if rootDir == "" { - rootDir = guessRootDir() + rootDir = gnoenv.RootDir() } pkgPaths, err := gnoPackagesFromArgs(args) diff --git a/gnovm/cmd/gno/main.go b/gnovm/cmd/gno/main.go index c84aa52fc86..cbe204f9700 100644 --- a/gnovm/cmd/gno/main.go +++ b/gnovm/cmd/gno/main.go @@ -33,11 +33,11 @@ func newGnocliCmd(io commands.IO) *commands.Command { newTestCmd(io), newLintCmd(io), newRunCmd(io), - newBuildCmd(io), newPrecompileCmd(io), newCleanCmd(io), newReplCmd(), newDocCmd(io), + newEnvCmd(io), // fmt -- gofmt // graph // vendor -- download deps from the chain in vendor/ diff --git a/gnovm/cmd/gno/precompile.go b/gnovm/cmd/gno/precompile.go index 4a4528001a2..5583e3d8429 100644 --- a/gnovm/cmd/gno/precompile.go +++ b/gnovm/cmd/gno/precompile.go @@ -18,6 +18,7 @@ type precompileCfg struct { verbose bool skipFmt bool skipImports bool + gobuild bool goBinary string gofmtBinary string output string @@ -30,6 +31,11 @@ type precompileOptions struct { precompiled map[importPath]struct{} } +var defaultPrecompileCfg = &precompileCfg{ + verbose: false, + goBinary: "go", +} + func newPrecompileOptions(cfg *precompileCfg) *precompileOptions { return &precompileOptions{cfg, map[importPath]struct{}{}} } @@ -85,6 +91,13 @@ func (c *precompileCfg) RegisterFlags(fs *flag.FlagSet) { "do not precompile imports recursively", ) + fs.BoolVar( + &c.gobuild, + "gobuild", + false, + "run go build on generated go files, ignoring test files", + ) + fs.StringVar( &c.goBinary, "go-binary", @@ -125,7 +138,6 @@ func execPrecompile(cfg *precompileCfg, args []string, io commands.IO) error { if err != nil { err = fmt.Errorf("%s: precompile: %w", filepath, err) io.ErrPrintfln("%s", err.Error()) - errCount++ } } @@ -134,6 +146,27 @@ func execPrecompile(cfg *precompileCfg, args []string, io commands.IO) error { return fmt.Errorf("%d precompile errors", errCount) } + if cfg.gobuild { + paths, err := gnoPackagesFromArgs(args) + if err != nil { + return fmt.Errorf("list packages: %w", err) + } + + errCount = 0 + for _, pkgPath := range paths { + _ = pkgPath + err = goBuildFileOrPkg(pkgPath, cfg) + if err != nil { + err = fmt.Errorf("%s: build pkg: %w", pkgPath, err) + io.ErrPrintfln("%s\n", err.Error()) + errCount++ + } + } + if errCount > 0 { + return fmt.Errorf("%d build errors", errCount) + } + } + return nil } @@ -219,3 +252,14 @@ func precompileFile(srcPath string, opts *precompileOptions) error { return nil } + +func goBuildFileOrPkg(fileOrPkg string, cfg *precompileCfg) error { + verbose := cfg.verbose + goBinary := cfg.goBinary + + if verbose { + fmt.Fprintf(os.Stderr, "%s\n", fileOrPkg) + } + + return gno.PrecompileBuildPackage(fileOrPkg, goBinary) +} diff --git a/gnovm/cmd/gno/precompile_test.go b/gnovm/cmd/gno/precompile_test.go index 56f63b0de35..f8436fad768 100644 --- a/gnovm/cmd/gno/precompile_test.go +++ b/gnovm/cmd/gno/precompile_test.go @@ -1,18 +1,26 @@ package main -import "testing" +import ( + "testing" -func TestPrecompileApp(t *testing.T) { - tc := []testMainCase{ - { - args: []string{"precompile"}, - errShouldBe: "flag: help requested", - }, + "github.com/rogpeppe/go-internal/testscript" + "github.com/stretchr/testify/require" - // {args: []string{"precompile", "..."}, stdoutShouldContain: "..."}, - // TODO: recursive - // TODO: valid files - // TODO: invalid files + "github.com/gnolang/gno/gnovm/pkg/integration" +) + +func Test_ScriptsPrecompile(t *testing.T) { + p := testscript.Params{ + Dir: "testdata/gno_precompile", + } + + if coverdir, ok := integration.ResolveCoverageDir(); ok { + err := integration.SetupTestscriptsCoverage(&p, coverdir) + require.NoError(t, err) } - testMainCaseRun(t, tc) + + err := integration.SetupGno(&p, t.TempDir()) + require.NoError(t, err) + + testscript.Run(t, p) } diff --git a/gnovm/cmd/gno/repl.go b/gnovm/cmd/gno/repl.go index 0a9d4934ce3..18a7db16568 100644 --- a/gnovm/cmd/gno/repl.go +++ b/gnovm/cmd/gno/repl.go @@ -10,6 +10,7 @@ import ( "os" "strings" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/gnovm/pkg/repl" "github.com/gnolang/gno/tm2/pkg/commands" ) @@ -81,7 +82,7 @@ func execRepl(cfg *replCfg, args []string) error { } if cfg.rootDir == "" { - cfg.rootDir = guessRootDir() + cfg.rootDir = gnoenv.RootDir() } if !cfg.skipUsage { diff --git a/gnovm/cmd/gno/run.go b/gnovm/cmd/gno/run.go index d37c86df502..4291d5fe411 100644 --- a/gnovm/cmd/gno/run.go +++ b/gnovm/cmd/gno/run.go @@ -9,6 +9,7 @@ import ( "path/filepath" "strings" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" gno "github.com/gnolang/gno/gnovm/pkg/gnolang" "github.com/gnolang/gno/gnovm/tests" "github.com/gnolang/gno/tm2/pkg/commands" @@ -65,7 +66,7 @@ func execRun(cfg *runCfg, args []string, io commands.IO) error { } if cfg.rootDir == "" { - cfg.rootDir = guessRootDir() + cfg.rootDir = gnoenv.RootDir() } stdin := io.In() diff --git a/gnovm/cmd/gno/test.go b/gnovm/cmd/gno/test.go index 18047924272..38615c88c4e 100644 --- a/gnovm/cmd/gno/test.go +++ b/gnovm/cmd/gno/test.go @@ -16,6 +16,7 @@ import ( "go.uber.org/multierr" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" gno "github.com/gnolang/gno/gnovm/pkg/gnolang" "github.com/gnolang/gno/gnovm/pkg/gnomod" "github.com/gnolang/gno/gnovm/tests" @@ -179,7 +180,7 @@ func execTest(cfg *testCfg, args []string, io commands.IO) error { // guess opts.RootDir if cfg.rootDir == "" { - cfg.rootDir = guessRootDir() + cfg.rootDir = gnoenv.RootDir() } paths, err := targetsFromPatterns(args) @@ -231,7 +232,7 @@ func execTest(cfg *testCfg, args []string, io commands.IO) error { if err != nil { return errors.New("cannot resolve build dir") } - err = goBuildFileOrPkg(tempDir, defaultBuildOptions) + err = goBuildFileOrPkg(tempDir, defaultPrecompileCfg) if err != nil { io.ErrPrintln(err) io.ErrPrintln("FAIL") diff --git a/gnovm/cmd/gno/testdata/gno_build/empty_dir.txtar b/gnovm/cmd/gno/testdata/gno_build/empty_dir.txtar deleted file mode 100644 index d346b6ad46f..00000000000 --- a/gnovm/cmd/gno/testdata/gno_build/empty_dir.txtar +++ /dev/null @@ -1,6 +0,0 @@ -# Run gno build on an empty dir - -gno build . - -! stdout .+ -! stderr .+ diff --git a/gnovm/cmd/gno/testdata/gno_build/invalid_gno_files.txtar b/gnovm/cmd/gno/testdata/gno_build/invalid_gno_files.txtar deleted file mode 100644 index 617e12291be..00000000000 --- a/gnovm/cmd/gno/testdata/gno_build/invalid_gno_files.txtar +++ /dev/null @@ -1,27 +0,0 @@ -# Run gno build with invalid gno files (still success) - -gno build . - -! stdout .+ -! stderr .+ - --- go.mod -- -module gnobuild - --- file1.go -- -package file1 - --- main.gno -- -package main - -invalid - -func main() {} - --- sub/sub.gno -- -package sub - -invalid - --- sub/file2.go -- -package file2 diff --git a/gnovm/cmd/gno/testdata/gno_build/invalid_go_files.txtar b/gnovm/cmd/gno/testdata/gno_build/invalid_go_files.txtar deleted file mode 100644 index a7c8b51af49..00000000000 --- a/gnovm/cmd/gno/testdata/gno_build/invalid_go_files.txtar +++ /dev/null @@ -1,30 +0,0 @@ -# Run gno build with invalid go files - -! gno build . - -! stdout .+ -stderr '\./file1\.go:3:1: syntax error: non-declaration statement outside function body' -stderr '\./\.: build pkg: std go compiler' -stderr 'sub/file2\.go:3:1: syntax error: non-declaration statement outside function body' -stderr '\./sub: build pkg: std go compiler' - --- go.mod -- -module gnobuild - --- file1.go -- -package file1 - -invalid1 - --- main.gno -- -package main - -func main() {} - --- sub/sub.gno -- -package sub - --- sub/file2.go -- -package file2 - -invalid2 diff --git a/gnovm/cmd/gno/testdata/gno_build/no_args.txtar b/gnovm/cmd/gno/testdata/gno_build/no_args.txtar deleted file mode 100644 index b3f68676588..00000000000 --- a/gnovm/cmd/gno/testdata/gno_build/no_args.txtar +++ /dev/null @@ -1,6 +0,0 @@ -# Run gno build without args - -! gno build - -! stdout .+ -stderr 'flag: help requested' diff --git a/gnovm/cmd/gno/testdata/gno_build/no_gno_files.txtar b/gnovm/cmd/gno/testdata/gno_build/no_gno_files.txtar deleted file mode 100644 index 58261e77cda..00000000000 --- a/gnovm/cmd/gno/testdata/gno_build/no_gno_files.txtar +++ /dev/null @@ -1,12 +0,0 @@ -# Run gno build on a dir w/o gno files - -gno build . - -! stdout .+ -! stderr .+ - --- README -- -Hello world - --- sub/README -- -Hello world diff --git a/gnovm/cmd/gno/testdata/gno_build/no_go_files.txtar b/gnovm/cmd/gno/testdata/gno_build/no_go_files.txtar deleted file mode 100644 index 46559610ccf..00000000000 --- a/gnovm/cmd/gno/testdata/gno_build/no_go_files.txtar +++ /dev/null @@ -1,19 +0,0 @@ -# Run gno build in a dir without go files - -! gno build . - -! stdout .+ -stderr -count=2 'no Go files in '$WORK -stderr '\./\.: build pkg: std go compiler' -stderr '\./sub: build pkg: std go compiler' - --- go.mod -- -module gnobuild - --- main.gno -- -package main - -func main() {} - --- sub/sub.gno -- -package sub diff --git a/gnovm/cmd/gno/testdata/gno_build/no_gomod.txtar b/gnovm/cmd/gno/testdata/gno_build/no_gomod.txtar deleted file mode 100644 index 9e6cad05664..00000000000 --- a/gnovm/cmd/gno/testdata/gno_build/no_gomod.txtar +++ /dev/null @@ -1,16 +0,0 @@ -# Run gno build on a dir without go.mod - -! gno build . - -! stdout .+ -stderr -count=2 'go: go.mod file not found in current directory or any parent directory' -stderr './.: build pkg: std go compiler' -stderr './sub: build pkg: std go compiler' - --- main.gno -- -package main - -func main() {} - --- sub/sub.gno -- -package sub diff --git a/gnovm/cmd/gno/testdata/gno_build/ok.txtar b/gnovm/cmd/gno/testdata/gno_build/ok.txtar deleted file mode 100644 index 9d70fd97904..00000000000 --- a/gnovm/cmd/gno/testdata/gno_build/ok.txtar +++ /dev/null @@ -1,23 +0,0 @@ -# Run gno build successfully - -gno build . - -! stdout .+ -! stderr .+ - --- go.mod -- -module gnobuild - --- file1.go -- -package file1 - --- main.gno -- -package main - -func main() {} - --- sub/sub.gno -- -package sub - --- sub/file2.go -- -package file2 diff --git a/gnovm/cmd/gno/testdata/gno_precompile/01_no_args.txtar b/gnovm/cmd/gno/testdata/gno_precompile/01_no_args.txtar new file mode 100644 index 00000000000..944c74ee615 --- /dev/null +++ b/gnovm/cmd/gno/testdata/gno_precompile/01_no_args.txtar @@ -0,0 +1,6 @@ +# Run gno precompile without args + +! gno precompile + +! stdout .+ +stderr 'flag: help requested' diff --git a/gnovm/cmd/gno/testdata/gno_precompile/02_empty_dir.txtar b/gnovm/cmd/gno/testdata/gno_precompile/02_empty_dir.txtar new file mode 100644 index 00000000000..7afc7ed0683 --- /dev/null +++ b/gnovm/cmd/gno/testdata/gno_precompile/02_empty_dir.txtar @@ -0,0 +1,6 @@ +# Run gno precompile on an empty dir + +gno precompile . + +! stdout .+ +! stderr .+ diff --git a/gnovm/cmd/gno/testdata/gno_precompile/03_invalid_gno_files.txtar b/gnovm/cmd/gno/testdata/gno_precompile/03_invalid_gno_files.txtar new file mode 100644 index 00000000000..26e12a9c750 --- /dev/null +++ b/gnovm/cmd/gno/testdata/gno_precompile/03_invalid_gno_files.txtar @@ -0,0 +1,19 @@ +# Run gno precompile with invalid gno files + +! gno precompile . + +! stdout .+ +stderr 'precompile: parse: main.gno:3:1: expected declaration, found invalid' +stderr 'precompile: parse: sub/sub.gno:3:1: expected declaration, found invalid' + +-- main.gno -- +package main + +invalid + +func main() {} + +-- sub/sub.gno -- +package sub + +invalid diff --git a/gnovm/cmd/gno/testdata/gno_precompile/04_valid_gno_files.txtar b/gnovm/cmd/gno/testdata/gno_precompile/04_valid_gno_files.txtar new file mode 100644 index 00000000000..0f9d909f627 --- /dev/null +++ b/gnovm/cmd/gno/testdata/gno_precompile/04_valid_gno_files.txtar @@ -0,0 +1,32 @@ +# Run gno precompile with valid gno files + +gno precompile . + +! stdout .+ +! stderr .+ + +cmp main.gno.gen.go main.gno.gen.go.golden +cmp sub/sub.gno.gen.go sub/sub.gno.gen.go.golden + +-- main.gno -- +package main + +func main(){} + +-- sub/sub.gno -- +package sub + +-- main.gno.gen.go.golden -- +// Code generated by github.com/gnolang/gno. DO NOT EDIT. + +//go:build gno + +package main + +func main() {} +-- sub/sub.gno.gen.go.golden -- +// Code generated by github.com/gnolang/gno. DO NOT EDIT. + +//go:build gno + +package sub diff --git a/gnovm/cmd/gno/testdata/gno_precompile/05_skip_fmt_flag.txtar b/gnovm/cmd/gno/testdata/gno_precompile/05_skip_fmt_flag.txtar new file mode 100644 index 00000000000..0f7780efdad --- /dev/null +++ b/gnovm/cmd/gno/testdata/gno_precompile/05_skip_fmt_flag.txtar @@ -0,0 +1,34 @@ +# Run gno precompile with -skip-fmt flag +# NOTE(tb): this flag doesn't actually prevent the code format, because +# `gnolang.Precompile()` calls `format.Node()`. + +gno precompile -skip-fmt . + +! stdout .+ +! stderr .+ + +cmp main.gno.gen.go main.gno.gen.go.golden +cmp sub/sub.gno.gen.go sub/sub.gno.gen.go.golden + +-- main.gno -- +package main + +func main(){} + +-- sub/sub.gno -- +package sub + +-- main.gno.gen.go.golden -- +// Code generated by github.com/gnolang/gno. DO NOT EDIT. + +//go:build gno + +package main + +func main() {} +-- sub/sub.gno.gen.go.golden -- +// Code generated by github.com/gnolang/gno. DO NOT EDIT. + +//go:build gno + +package sub diff --git a/gnovm/cmd/gno/testdata/gno_precompile/06_build_flag.txtar b/gnovm/cmd/gno/testdata/gno_precompile/06_build_flag.txtar new file mode 100644 index 00000000000..b93fae95fcf --- /dev/null +++ b/gnovm/cmd/gno/testdata/gno_precompile/06_build_flag.txtar @@ -0,0 +1,36 @@ +# Run gno precompile with -gobuild flag + +gno precompile -gobuild . + +! stdout .+ +! stderr .+ + +cmp main.gno.gen.go main.gno.gen.go.golden +cmp sub/sub.gno.gen.go sub/sub.gno.gen.go.golden + +-- main.gno -- +package main + +func main() { + var x = 1 + _=x +} +-- sub/sub.gno -- +package sub +-- main.gno.gen.go.golden -- +// Code generated by github.com/gnolang/gno. DO NOT EDIT. + +//go:build gno + +package main + +func main() { + var x = 1 + _ = x +} +-- sub/sub.gno.gen.go.golden -- +// Code generated by github.com/gnolang/gno. DO NOT EDIT. + +//go:build gno + +package sub diff --git a/gnovm/cmd/gno/testdata/gno_precompile/07_build_flag_with_build_error.txtar b/gnovm/cmd/gno/testdata/gno_precompile/07_build_flag_with_build_error.txtar new file mode 100644 index 00000000000..6543623b266 --- /dev/null +++ b/gnovm/cmd/gno/testdata/gno_precompile/07_build_flag_with_build_error.txtar @@ -0,0 +1,34 @@ +# Run gno precompile with -gobuild flag + +! gno precompile -gobuild . + +! stdout .+ +stderr './main.gno.gen.go:8:6: x declared and not used' + +cmp main.gno.gen.go main.gno.gen.go.golden +cmp sub/sub.gno.gen.go sub/sub.gno.gen.go.golden + +-- main.gno -- +package main + +func main() { + var x = 1 +} +-- sub/sub.gno -- +package sub +-- main.gno.gen.go.golden -- +// Code generated by github.com/gnolang/gno. DO NOT EDIT. + +//go:build gno + +package main + +func main() { + var x = 1 +} +-- sub/sub.gno.gen.go.golden -- +// Code generated by github.com/gnolang/gno. DO NOT EDIT. + +//go:build gno + +package sub diff --git a/gnovm/cmd/gno/util.go b/gnovm/cmd/gno/util.go index 73ee0f0323b..a8e835d4759 100644 --- a/gnovm/cmd/gno/util.go +++ b/gnovm/cmd/gno/util.go @@ -5,14 +5,13 @@ import ( "go/ast" "io" "io/fs" - "log" "os" - "os/exec" "path/filepath" "regexp" "strings" "time" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" gno "github.com/gnolang/gno/gnovm/pkg/gnolang" ) @@ -193,22 +192,6 @@ func fmtDuration(d time.Duration) string { return fmt.Sprintf("%.2fs", d.Seconds()) } -func guessRootDir() string { - // try to get the root directory from the GNOROOT environment variable. - if rootdir := os.Getenv("GNOROOT"); rootdir != "" { - return filepath.Clean(rootdir) - } - - // if GNOROOT is not set, try to guess the root directory using the `go list` command. - cmd := exec.Command("go", "list", "-m", "-mod=mod", "-f", "{{.Dir}}", "github.com/gnolang/gno") - out, err := cmd.CombinedOutput() - if err != nil { - log.Fatal("can't guess --root-dir, please fill it manually or define the GNOROOT environment variable globally.") - } - rootDir := strings.TrimSpace(string(out)) - return rootDir -} - // makeTestGoMod creates the temporary go.mod for test func makeTestGoMod(path string, packageName string, goversion string) error { content := fmt.Sprintf("module %s\n\ngo %s\n", packageName, goversion) @@ -242,7 +225,7 @@ func ResolvePath(output string, path importPath) (string, error) { if err != nil { return "", err } - pkgPath := strings.TrimPrefix(absPkgPath, guessRootDir()) + pkgPath := strings.TrimPrefix(absPkgPath, gnoenv.RootDir()) return filepath.Join(absOutput, pkgPath), nil } diff --git a/gnovm/pkg/gnoenv/gnohome.go b/gnovm/pkg/gnoenv/gnohome.go new file mode 100644 index 00000000000..52dd5e6adb4 --- /dev/null +++ b/gnovm/pkg/gnoenv/gnohome.go @@ -0,0 +1,35 @@ +package gnoenv + +import ( + "fmt" + "os" + "path/filepath" +) + +func HomeDir() string { + // if environment variable is set, always use that. + // otherwise, use config dir (varies depending on OS) + "gno" + + dir := os.Getenv("GNOHOME") + if dir != "" { + return dir + } + + // XXX: `GNO_HOME` is deprecated and should be replaced by `GNOHOME` + // keeping for compatibility support + dir = os.Getenv("GNO_HOME") + if dir != "" { + return dir + } + + var err error + dir, err = os.UserConfigDir() + if err != nil { + panic(fmt.Errorf("couldn't get user config dir: %w", err)) + } + gnoHome := filepath.Join(dir, "gno") + + // XXX: added april 2023 as a transitory measure - remove after test4 + fixOldDefaultGnoHome(gnoHome) + return gnoHome +} diff --git a/gnovm/pkg/gnoenv/gnohome_test.go b/gnovm/pkg/gnoenv/gnohome_test.go new file mode 100644 index 00000000000..827d87774bb --- /dev/null +++ b/gnovm/pkg/gnoenv/gnohome_test.go @@ -0,0 +1,43 @@ +package gnoenv + +import ( + "os" + "path/filepath" + "testing" + + "github.com/jaekwon/testify/require" +) + +func TestHomeDir(t *testing.T) { + t.Run("use GNOHOME if set", func(t *testing.T) { + // Backup any related environment variables + t.Setenv("GNOHOME", "") + t.Setenv("GNO_HOME", "") + + expected := "/test/gno_home" + os.Setenv("GNOHOME", expected) + require.Equal(t, expected, HomeDir()) + }) + + t.Run("fallback to GNO_HOME if set", func(t *testing.T) { + // Backup any related environment variables + t.Setenv("GNOHOME", "") + t.Setenv("GNO_HOME", "") + t.Log("`GNO_HOME` is deprecated, use `GNOHOME` instead") + + expected := "/test/gnohome" + os.Setenv("GNO_HOME", expected) + require.Equal(t, expected, HomeDir()) + }) + + t.Run("use UserConfigDir with gno", func(t *testing.T) { + // Backup any related environment variables + t.Setenv("GNOHOME", "") + t.Setenv("GNO_HOME", "") + + dir, err := os.UserConfigDir() + require.NoError(t, err) + expected := filepath.Join(dir, "gno") + require.Equal(t, expected, HomeDir()) + }) +} diff --git a/gnovm/pkg/gnoenv/gnoroot.go b/gnovm/pkg/gnoenv/gnoroot.go new file mode 100644 index 00000000000..ad66cd93b57 --- /dev/null +++ b/gnovm/pkg/gnoenv/gnoroot.go @@ -0,0 +1,92 @@ +package gnoenv + +import ( + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "sync" +) + +var ErrUnableToGuessGnoRoot = errors.New("gno was unable to determine GNOROOT. Please set the GNOROOT environment variable") + +// Can be set manually at build time using: +// -ldflags="-X github.com/gnolang/gno/gnovm/pkg/gnoenv._GNOROOT" +var _GNOROOT string + +// RootDir guesses the Gno root directory and panics if it fails. +func RootDir() string { + root, err := GuessRootDir() + if err != nil { + panic(err) + } + + return root +} + +var muGnoRoot sync.Mutex + +// GuessRootDir attempts to determine the Gno root directory using various strategies: +// 1. First, It tries to obtain it from the `GNOROOT` environment variable. +// 2. If the env variable isn't set, It checks if `_GNOROOT` has been previously determined or set with -ldflags. +// 3. If not, it uses the `go list` command to infer from go.mod. +// 4. As a last resort, it determines `GNOROOT` based on the caller stack's file path. +func GuessRootDir() (string, error) { + muGnoRoot.Lock() + defer muGnoRoot.Unlock() + + // First try to get the root directory from the `GNOROOT` environment variable. + if rootdir := os.Getenv("GNOROOT"); rootdir != "" { + return strings.TrimSpace(rootdir), nil + } + + var err error + if _GNOROOT == "" { + // Try to guess `GNOROOT` using various strategies + _GNOROOT, err = guessRootDir() + } + + return _GNOROOT, err +} + +func guessRootDir() (string, error) { + // Attempt to guess `GNOROOT` from go.mod by using the `go list` command. + if rootdir, err := inferRootFromGoMod(); err == nil { + return filepath.Clean(rootdir), nil + } + + // If the above method fails, ultimately try to determine `GNOROOT` based + // on the caller stack's file path. + // Path need to be absolute here, that mostly mean that if `-trimpath` + // as been passed this method will not works. + if _, filename, _, ok := runtime.Caller(1); ok && filepath.IsAbs(filename) { + if currentDir := filepath.Dir(filename); currentDir != "" { + // Deduce Gno root directory relative from the current file's path. + // gno/ .. /gnovm/ .. /pkg/ .. /gnoenv/gnoenv.go + rootdir, err := filepath.Abs(filepath.Join(currentDir, "..", "..", "..")) + if err == nil { + return rootdir, nil + } + } + } + + return "", ErrUnableToGuessGnoRoot +} + +func inferRootFromGoMod() (string, error) { + gobin, err := exec.LookPath("go") + if err != nil { + return "", fmt.Errorf("unable to find `go` binary: %w", err) + } + + cmd := exec.Command(gobin, "list", "-m", "-mod=mod", "-f", "{{.Dir}}", "github.com/gnolang/gno") + out, err := cmd.CombinedOutput() + if err != nil { + return "", fmt.Errorf("unable to infer GnoRoot from go.mod: %w", err) + } + + return strings.TrimSpace(string(out)), nil +} diff --git a/gnovm/pkg/gnoenv/gnoroot_test.go b/gnovm/pkg/gnoenv/gnoroot_test.go new file mode 100644 index 00000000000..300ed8727b3 --- /dev/null +++ b/gnovm/pkg/gnoenv/gnoroot_test.go @@ -0,0 +1,75 @@ +package gnoenv + +import ( + "os/exec" + "path/filepath" + "testing" + + "github.com/jaekwon/testify/require" +) + +func TestGuessGnoRootDir_WithSetGnoRoot(t *testing.T) { + originalGnoRoot := _GNOROOT + defer func() { _GNOROOT = originalGnoRoot }() // Restore after test + + t.Setenv("GNOROOT", "") + + const testPath = "/path/to/gnoRoot" + + _GNOROOT = testPath + root, err := GuessRootDir() + require.NoError(t, err) + require.Equal(t, root, testPath) +} + +func TestGuessGnoRootDir_UsingCallerStack(t *testing.T) { + originalGnoRoot := _GNOROOT + defer func() { _GNOROOT = originalGnoRoot }() + + // Unset PATH should prevent InferGnoRootFromGoMod to works + t.Setenv("GNOROOT", "") + t.Setenv("PATH", "") + + _, err := exec.LookPath("go") + require.Error(t, err) + + // gno/ .. /gnovm/ .. /pkg/ .. /gnoenv/gnoroot.go + testPath, _ := filepath.Abs(filepath.Join(".", "..", "..", "..")) + root, err := GuessRootDir() + require.NoError(t, err) + require.Equal(t, root, testPath) +} + +func TestGuessGnoRootDir_Error(t *testing.T) { + // XXX: Determine a method to test the GuessGnoRoot final error. + // One approach might be to use `txtar` to build a test binary with -trimpath, + // avoiding absolute paths in the call stack. + t.Skip("not implemented; refer to the inline comment for more details.") +} + +func TestGuessGnoRootDir_WithGoModList(t *testing.T) { + // XXX: find a way to test `go mod list` phase. + // One solution is to use txtar with embed go.mod file. + // For now only `inferGnoRootFromGoMod` is tested. + t.Skip("not implemented; refer to the inline comment for more details.") +} + +func TestInferGnoRootFromGoMod(t *testing.T) { + // gno/ .. /gnovm/ .. /pkg/ .. /gnoenv/gnoroot.go + testPath, _ := filepath.Abs(filepath.Join(".", "..", "..", "..")) + + t.Run("go is present", func(t *testing.T) { + root, err := inferRootFromGoMod() + require.NoError(t, err) + require.Equal(t, root, testPath) + }) + + t.Run("go is not present", func(t *testing.T) { + // Unset PATH should prevent `inferGnoRootFromGoMod` to works + t.Setenv("PATH", "") + + root, err := inferRootFromGoMod() + require.Error(t, err) + require.Empty(t, root) + }) +} diff --git a/tm2/pkg/crypto/keys/client/migration.go b/gnovm/pkg/gnoenv/migration.go similarity index 98% rename from tm2/pkg/crypto/keys/client/migration.go rename to gnovm/pkg/gnoenv/migration.go index a3b1f029ba2..5b1d1fd1fa0 100644 --- a/tm2/pkg/crypto/keys/client/migration.go +++ b/gnovm/pkg/gnoenv/migration.go @@ -1,4 +1,4 @@ -package client +package gnoenv import ( "log" diff --git a/gnovm/pkg/gnoenv/migration_test.go b/gnovm/pkg/gnoenv/migration_test.go new file mode 100644 index 00000000000..7ab12b59b67 --- /dev/null +++ b/gnovm/pkg/gnoenv/migration_test.go @@ -0,0 +1,29 @@ +package gnoenv + +import ( + "os" + "path/filepath" + "testing" + + "github.com/jaekwon/testify/require" +) + +func TestFixOldDefaultGnoHome(t *testing.T) { + tempHomeDir := t.TempDir() + t.Setenv("HOME", tempHomeDir) + + oldGnoHome := filepath.Join(tempHomeDir, ".gno") + newGnoHome := filepath.Join(tempHomeDir, "gno") + + // Create a dummy old GNO_HOME + os.Mkdir(oldGnoHome, 0o755) + + // Test migration + fixOldDefaultGnoHome(newGnoHome) + + _, errOld := os.Stat(oldGnoHome) + require.NotNil(t, errOld) + _, errNew := os.Stat(newGnoHome) + require.True(t, os.IsNotExist(errOld), "invalid errors", errOld) + require.NoError(t, errNew) +} diff --git a/gnovm/pkg/gnolang/gnolang.proto b/gnovm/pkg/gnolang/gnolang.proto index 30508bb41a6..f7eaa907ec5 100644 --- a/gnovm/pkg/gnolang/gnolang.proto +++ b/gnovm/pkg/gnolang/gnolang.proto @@ -8,596 +8,596 @@ import "google/protobuf/any.proto"; // messages message TypedValue { - google.protobuf.Any T = 1; - google.protobuf.Any V = 2; - bytes N = 3; + google.protobuf.Any t = 1 [json_name = "T"]; + google.protobuf.Any v = 2 [json_name = "V"]; + bytes n = 3 [json_name = "N"]; } message StringValue { - string Value = 1; + string value = 1; } message BigintValue { - string Value = 1; + string value = 1; } message BigdecValue { - string Value = 1; + string value = 1; } message PointerValue { - TypedValue TV = 1; - google.protobuf.Any Base = 2; - sint64 Index = 3; - TypedValue Key = 4; + TypedValue tv = 1 [json_name = "TV"]; + google.protobuf.Any base = 2 [json_name = "Base"]; + sint64 index = 3 [json_name = "Index"]; + TypedValue key = 4 [json_name = "Key"]; } message ArrayValue { - ObjectInfo ObjectInfo = 1; - repeated TypedValue List = 2; - bytes Data = 3; + ObjectInfo object_info = 1 [json_name = "ObjectInfo"]; + repeated TypedValue list = 2 [json_name = "List"]; + bytes data = 3 [json_name = "Data"]; } message SliceValue { - google.protobuf.Any Base = 1; - sint64 Offset = 2; - sint64 Length = 3; - sint64 Maxcap = 4; + google.protobuf.Any base = 1 [json_name = "Base"]; + sint64 offset = 2 [json_name = "Offset"]; + sint64 length = 3 [json_name = "Length"]; + sint64 maxcap = 4 [json_name = "Maxcap"]; } message StructValue { - ObjectInfo ObjectInfo = 1; - repeated TypedValue Fields = 2; + ObjectInfo object_info = 1 [json_name = "ObjectInfo"]; + repeated TypedValue fields = 2 [json_name = "Fields"]; } message FuncValue { - google.protobuf.Any Type = 1; - bool IsMethod = 2; - google.protobuf.Any Source = 3; - string Name = 4; - google.protobuf.Any Closure = 5; - string FileName = 6; - string PkgPath = 7; + google.protobuf.Any type = 1 [json_name = "Type"]; + bool is_method = 2 [json_name = "IsMethod"]; + google.protobuf.Any source = 3 [json_name = "Source"]; + string name = 4 [json_name = "Name"]; + google.protobuf.Any closure = 5 [json_name = "Closure"]; + string file_name = 6 [json_name = "FileName"]; + string pkg_path = 7 [json_name = "PkgPath"]; } message MapValue { - ObjectInfo ObjectInfo = 1; - MapList List = 2; + ObjectInfo object_info = 1 [json_name = "ObjectInfo"]; + MapList list = 2 [json_name = "List"]; } message MapList { - repeated MapListItem List = 1; + repeated MapListItem list = 1 [json_name = "List"]; } message MapListItem { - TypedValue Key = 1; - TypedValue Value = 2; + TypedValue key = 1 [json_name = "Key"]; + TypedValue value = 2 [json_name = "Value"]; } message BoundMethodValue { - ObjectInfo ObjectInfo = 1; - FuncValue Func = 2; - TypedValue Receiver = 3; + ObjectInfo object_info = 1 [json_name = "ObjectInfo"]; + FuncValue func = 2 [json_name = "Func"]; + TypedValue receiver = 3 [json_name = "Receiver"]; } message TypeValue { - google.protobuf.Any Type = 1; + google.protobuf.Any type = 1 [json_name = "Type"]; } message PackageValue { - ObjectInfo ObjectInfo = 1; - google.protobuf.Any Block = 2; - string PkgName = 3; - string PkgPath = 4; - repeated string FNames = 5; - repeated google.protobuf.Any FBlocks = 6; + ObjectInfo object_info = 1 [json_name = "ObjectInfo"]; + google.protobuf.Any block = 2 [json_name = "Block"]; + string pkg_name = 3 [json_name = "PkgName"]; + string pkg_path = 4 [json_name = "PkgPath"]; + repeated string f_names = 5 [json_name = "FNames"]; + repeated google.protobuf.Any f_blocks = 6 [json_name = "FBlocks"]; } message Block { - ObjectInfo ObjectInfo = 1; - google.protobuf.Any Source = 2; - repeated TypedValue Values = 3; - google.protobuf.Any Parent = 4; - TypedValue Blank = 5; + ObjectInfo object_info = 1 [json_name = "ObjectInfo"]; + google.protobuf.Any source = 2 [json_name = "Source"]; + repeated TypedValue values = 3 [json_name = "Values"]; + google.protobuf.Any parent = 4 [json_name = "Parent"]; + TypedValue blank = 5 [json_name = "Blank"]; } message RefValue { - string ObjectID = 1; - bool Escaped = 2; - string PkgPath = 3; - string Hash = 4; + string object_id = 1 [json_name = "ObjectID"]; + bool escaped = 2 [json_name = "Escaped"]; + string pkg_path = 3 [json_name = "PkgPath"]; + string hash = 4 [json_name = "Hash"]; } message ObjectID { - string Value = 1; + string value = 1; } message ObjectInfo { - string ID = 1; - string Hash = 2; - string OwnerID = 3; - uint64 ModTime = 4; - sint64 RefCount = 5; - bool IsEscaped = 6; + string id = 1 [json_name = "ID"]; + string hash = 2 [json_name = "Hash"]; + string owner_id = 3 [json_name = "OwnerID"]; + uint64 mod_time = 4 [json_name = "ModTime"]; + sint64 ref_count = 5 [json_name = "RefCount"]; + bool is_escaped = 6 [json_name = "IsEscaped"]; } message ValueHash { - string Value = 1; + string value = 1; } message Hashlet { - bytes Value = 1; + bytes value = 1; } message ValuePath { - uint32 Type = 1; - uint32 Depth = 2; - uint32 Index = 3; - string Name = 4; + uint32 type = 1 [json_name = "Type"]; + uint32 depth = 2 [json_name = "Depth"]; + uint32 index = 3 [json_name = "Index"]; + string name = 4 [json_name = "Name"]; } message Location { - string PkgPath = 1; - string File = 2; - sint64 Line = 3; - sint64 Nonce = 4; + string pkg_path = 1 [json_name = "PkgPath"]; + string file = 2 [json_name = "File"]; + sint64 line = 3 [json_name = "Line"]; + sint64 nonce = 4 [json_name = "Nonce"]; } message Attributes { - sint64 Line = 1; - string Label = 2; + sint64 line = 1 [json_name = "Line"]; + string label = 2 [json_name = "Label"]; } message NameExpr { - Attributes Attributes = 1; - ValuePath Path = 2; - string Name = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + ValuePath path = 2 [json_name = "Path"]; + string name = 3 [json_name = "Name"]; } message BasicLitExpr { - Attributes Attributes = 1; - sint64 Kind = 2; - string Value = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + sint64 kind = 2 [json_name = "Kind"]; + string value = 3 [json_name = "Value"]; } message BinaryExpr { - Attributes Attributes = 1; - google.protobuf.Any Left = 2; - sint64 Op = 3; - google.protobuf.Any Right = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any left = 2 [json_name = "Left"]; + sint64 op = 3 [json_name = "Op"]; + google.protobuf.Any right = 4 [json_name = "Right"]; } message CallExpr { - Attributes Attributes = 1; - google.protobuf.Any Func = 2; - repeated google.protobuf.Any Args = 3; - bool Varg = 4; - sint64 NumArgs = 5; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any func = 2 [json_name = "Func"]; + repeated google.protobuf.Any args = 3 [json_name = "Args"]; + bool varg = 4 [json_name = "Varg"]; + sint64 num_args = 5 [json_name = "NumArgs"]; } message IndexExpr { - Attributes Attributes = 1; - google.protobuf.Any X = 2; - google.protobuf.Any Index = 3; - bool HasOK = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; + google.protobuf.Any index = 3 [json_name = "Index"]; + bool has_ok = 4 [json_name = "HasOK"]; } message SelectorExpr { - Attributes Attributes = 1; - google.protobuf.Any X = 2; - ValuePath Path = 3; - string Sel = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; + ValuePath path = 3 [json_name = "Path"]; + string sel = 4 [json_name = "Sel"]; } message SliceExpr { - Attributes Attributes = 1; - google.protobuf.Any X = 2; - google.protobuf.Any Low = 3; - google.protobuf.Any High = 4; - google.protobuf.Any Max = 5; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; + google.protobuf.Any low = 3 [json_name = "Low"]; + google.protobuf.Any high = 4 [json_name = "High"]; + google.protobuf.Any max = 5 [json_name = "Max"]; } message StarExpr { - Attributes Attributes = 1; - google.protobuf.Any X = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; } message RefExpr { - Attributes Attributes = 1; - google.protobuf.Any X = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; } message TypeAssertExpr { - Attributes Attributes = 1; - google.protobuf.Any X = 2; - google.protobuf.Any Type = 3; - bool HasOK = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; + google.protobuf.Any type = 3 [json_name = "Type"]; + bool has_ok = 4 [json_name = "HasOK"]; } message UnaryExpr { - Attributes Attributes = 1; - google.protobuf.Any X = 2; - sint64 Op = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; + sint64 op = 3 [json_name = "Op"]; } message CompositeLitExpr { - Attributes Attributes = 1; - google.protobuf.Any Type = 2; - repeated KeyValueExpr Elts = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any type = 2 [json_name = "Type"]; + repeated KeyValueExpr elts = 3 [json_name = "Elts"]; } message KeyValueExpr { - Attributes Attributes = 1; - google.protobuf.Any Key = 2; - google.protobuf.Any Value = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any key = 2 [json_name = "Key"]; + google.protobuf.Any value = 3 [json_name = "Value"]; } message FuncLitExpr { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - FuncTypeExpr Type = 3; - repeated google.protobuf.Any Body = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + FuncTypeExpr type = 3 [json_name = "Type"]; + repeated google.protobuf.Any body = 4 [json_name = "Body"]; } message ConstExpr { - Attributes Attributes = 1; - google.protobuf.Any Source = 2; - TypedValue TypedValue = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any source = 2 [json_name = "Source"]; + TypedValue typed_value = 3 [json_name = "TypedValue"]; } message FieldTypeExpr { - Attributes Attributes = 1; - string Name = 2; - google.protobuf.Any Type = 3; - google.protobuf.Any Tag = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + string name = 2 [json_name = "Name"]; + google.protobuf.Any type = 3 [json_name = "Type"]; + google.protobuf.Any tag = 4 [json_name = "Tag"]; } message ArrayTypeExpr { - Attributes Attributes = 1; - google.protobuf.Any Len = 2; - google.protobuf.Any Elt = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any len = 2 [json_name = "Len"]; + google.protobuf.Any elt = 3 [json_name = "Elt"]; } message SliceTypeExpr { - Attributes Attributes = 1; - google.protobuf.Any Elt = 2; - bool Vrd = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any elt = 2 [json_name = "Elt"]; + bool vrd = 3 [json_name = "Vrd"]; } message InterfaceTypeExpr { - Attributes Attributes = 1; - repeated FieldTypeExpr Methods = 2; - string Generic = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated FieldTypeExpr methods = 2 [json_name = "Methods"]; + string generic = 3 [json_name = "Generic"]; } message ChanTypeExpr { - Attributes Attributes = 1; - sint64 Dir = 2; - google.protobuf.Any Value = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + sint64 dir = 2 [json_name = "Dir"]; + google.protobuf.Any value = 3 [json_name = "Value"]; } message FuncTypeExpr { - Attributes Attributes = 1; - repeated FieldTypeExpr Params = 2; - repeated FieldTypeExpr Results = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated FieldTypeExpr params = 2 [json_name = "Params"]; + repeated FieldTypeExpr results = 3 [json_name = "Results"]; } message MapTypeExpr { - Attributes Attributes = 1; - google.protobuf.Any Key = 2; - google.protobuf.Any Value = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any key = 2 [json_name = "Key"]; + google.protobuf.Any value = 3 [json_name = "Value"]; } message StructTypeExpr { - Attributes Attributes = 1; - repeated FieldTypeExpr Fields = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated FieldTypeExpr fields = 2 [json_name = "Fields"]; } message constTypeExpr { - Attributes Attributes = 1; - google.protobuf.Any Source = 2; - google.protobuf.Any Type = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any source = 2 [json_name = "Source"]; + google.protobuf.Any type = 3 [json_name = "Type"]; } message MaybeNativeTypeExpr { - Attributes Attributes = 1; - google.protobuf.Any Type = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any type = 2 [json_name = "Type"]; } message AssignStmt { - Attributes Attributes = 1; - repeated google.protobuf.Any Lhs = 2; - sint64 Op = 3; - repeated google.protobuf.Any Rhs = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated google.protobuf.Any lhs = 2 [json_name = "Lhs"]; + sint64 op = 3 [json_name = "Op"]; + repeated google.protobuf.Any rhs = 4 [json_name = "Rhs"]; } message BlockStmt { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - repeated google.protobuf.Any Body = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + repeated google.protobuf.Any body = 3 [json_name = "Body"]; } message BranchStmt { - Attributes Attributes = 1; - sint64 Op = 2; - string Label = 3; - uint32 Depth = 4; - sint64 BodyIndex = 5; + Attributes attributes = 1 [json_name = "Attributes"]; + sint64 op = 2 [json_name = "Op"]; + string label = 3 [json_name = "Label"]; + uint32 depth = 4 [json_name = "Depth"]; + sint64 body_index = 5 [json_name = "BodyIndex"]; } message DeclStmt { - Attributes Attributes = 1; - repeated google.protobuf.Any Body = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated google.protobuf.Any body = 2 [json_name = "Body"]; } message DeferStmt { - Attributes Attributes = 1; - CallExpr Call = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + CallExpr call = 2 [json_name = "Call"]; } message ExprStmt { - Attributes Attributes = 1; - google.protobuf.Any X = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; } message ForStmt { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - google.protobuf.Any Init = 3; - google.protobuf.Any Cond = 4; - google.protobuf.Any Post = 5; - repeated google.protobuf.Any Body = 6; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + google.protobuf.Any init = 3 [json_name = "Init"]; + google.protobuf.Any cond = 4 [json_name = "Cond"]; + google.protobuf.Any post = 5 [json_name = "Post"]; + repeated google.protobuf.Any body = 6 [json_name = "Body"]; } message GoStmt { - Attributes Attributes = 1; - CallExpr Call = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + CallExpr call = 2 [json_name = "Call"]; } message IfStmt { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - google.protobuf.Any Init = 3; - google.protobuf.Any Cond = 4; - IfCaseStmt Then = 5; - IfCaseStmt Else = 6; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + google.protobuf.Any init = 3 [json_name = "Init"]; + google.protobuf.Any cond = 4 [json_name = "Cond"]; + IfCaseStmt then = 5 [json_name = "Then"]; + IfCaseStmt else = 6 [json_name = "Else"]; } message IfCaseStmt { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - repeated google.protobuf.Any Body = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + repeated google.protobuf.Any body = 3 [json_name = "Body"]; } message IncDecStmt { - Attributes Attributes = 1; - google.protobuf.Any X = 2; - sint64 Op = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any x = 2 [json_name = "X"]; + sint64 op = 3 [json_name = "Op"]; } message RangeStmt { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - google.protobuf.Any X = 3; - google.protobuf.Any Key = 4; - google.protobuf.Any Value = 5; - sint64 Op = 6; - repeated google.protobuf.Any Body = 7; - bool IsMap = 8; - bool IsString = 9; - bool IsArrayPtr = 10; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + google.protobuf.Any x = 3 [json_name = "X"]; + google.protobuf.Any key = 4 [json_name = "Key"]; + google.protobuf.Any value = 5 [json_name = "Value"]; + sint64 op = 6 [json_name = "Op"]; + repeated google.protobuf.Any body = 7 [json_name = "Body"]; + bool is_map = 8 [json_name = "IsMap"]; + bool is_string = 9 [json_name = "IsString"]; + bool is_array_ptr = 10 [json_name = "IsArrayPtr"]; } message ReturnStmt { - Attributes Attributes = 1; - repeated google.protobuf.Any Results = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated google.protobuf.Any results = 2 [json_name = "Results"]; } message PanicStmt { - Attributes Attributes = 1; - google.protobuf.Any Exception = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any exception = 2 [json_name = "Exception"]; } message SelectStmt { - Attributes Attributes = 1; - repeated SelectCaseStmt Cases = 2; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated SelectCaseStmt cases = 2 [json_name = "Cases"]; } message SelectCaseStmt { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - google.protobuf.Any Comm = 3; - repeated google.protobuf.Any Body = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + google.protobuf.Any comm = 3 [json_name = "Comm"]; + repeated google.protobuf.Any body = 4 [json_name = "Body"]; } message SendStmt { - Attributes Attributes = 1; - google.protobuf.Any Chan = 2; - google.protobuf.Any Value = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + google.protobuf.Any chan = 2 [json_name = "Chan"]; + google.protobuf.Any value = 3 [json_name = "Value"]; } message SwitchStmt { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - google.protobuf.Any Init = 3; - google.protobuf.Any X = 4; - bool IsTypeSwitch = 5; - repeated SwitchClauseStmt Clauses = 6; - string VarName = 7; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + google.protobuf.Any init = 3 [json_name = "Init"]; + google.protobuf.Any x = 4 [json_name = "X"]; + bool is_type_switch = 5 [json_name = "IsTypeSwitch"]; + repeated SwitchClauseStmt clauses = 6 [json_name = "Clauses"]; + string var_name = 7 [json_name = "VarName"]; } message SwitchClauseStmt { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - repeated google.protobuf.Any Cases = 3; - repeated google.protobuf.Any Body = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + repeated google.protobuf.Any cases = 3 [json_name = "Cases"]; + repeated google.protobuf.Any body = 4 [json_name = "Body"]; } message EmptyStmt { - Attributes Attributes = 1; + Attributes attributes = 1 [json_name = "Attributes"]; } message bodyStmt { - Attributes Attributes = 1; - repeated google.protobuf.Any Body = 2; - sint64 BodyLen = 3; - sint64 NextBodyIndex = 4; - sint64 NumOps = 5; - sint64 NumValues = 6; - sint64 NumExprs = 7; - sint64 NumStmts = 8; - google.protobuf.Any Cond = 9; - google.protobuf.Any Post = 10; - google.protobuf.Any Active = 11; - google.protobuf.Any Key = 12; - google.protobuf.Any Value = 13; - sint64 Op = 14; - sint64 ListLen = 15; - sint64 ListIndex = 16; - MapListItem NextItem = 17; - sint64 StrLen = 18; - sint64 StrIndex = 19; - sint32 NextRune = 20; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated google.protobuf.Any body = 2 [json_name = "Body"]; + sint64 body_len = 3 [json_name = "BodyLen"]; + sint64 next_body_index = 4 [json_name = "NextBodyIndex"]; + sint64 num_ops = 5 [json_name = "NumOps"]; + sint64 num_values = 6 [json_name = "NumValues"]; + sint64 num_exprs = 7 [json_name = "NumExprs"]; + sint64 num_stmts = 8 [json_name = "NumStmts"]; + google.protobuf.Any cond = 9 [json_name = "Cond"]; + google.protobuf.Any post = 10 [json_name = "Post"]; + google.protobuf.Any active = 11 [json_name = "Active"]; + google.protobuf.Any key = 12 [json_name = "Key"]; + google.protobuf.Any value = 13 [json_name = "Value"]; + sint64 op = 14 [json_name = "Op"]; + sint64 list_len = 15 [json_name = "ListLen"]; + sint64 list_index = 16 [json_name = "ListIndex"]; + MapListItem next_item = 17 [json_name = "NextItem"]; + sint64 str_len = 18 [json_name = "StrLen"]; + sint64 str_index = 19 [json_name = "StrIndex"]; + sint32 next_rune = 20 [json_name = "NextRune"]; } message FuncDecl { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - NameExpr NameExpr = 3; - bool IsMethod = 4; - FieldTypeExpr Recv = 5; - FuncTypeExpr Type = 6; - repeated google.protobuf.Any Body = 7; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + NameExpr name_expr = 3 [json_name = "NameExpr"]; + bool is_method = 4 [json_name = "IsMethod"]; + FieldTypeExpr recv = 5 [json_name = "Recv"]; + FuncTypeExpr type = 6 [json_name = "Type"]; + repeated google.protobuf.Any body = 7 [json_name = "Body"]; } message ImportDecl { - Attributes Attributes = 1; - NameExpr NameExpr = 2; - string PkgPath = 3; + Attributes attributes = 1 [json_name = "Attributes"]; + NameExpr name_expr = 2 [json_name = "NameExpr"]; + string pkg_path = 3 [json_name = "PkgPath"]; } message ValueDecl { - Attributes Attributes = 1; - repeated NameExpr NameExprs = 2; - google.protobuf.Any Type = 3; - repeated google.protobuf.Any Values = 4; - bool Const = 5; + Attributes attributes = 1 [json_name = "Attributes"]; + repeated NameExpr name_exprs = 2 [json_name = "NameExprs"]; + google.protobuf.Any type = 3 [json_name = "Type"]; + repeated google.protobuf.Any values = 4 [json_name = "Values"]; + bool const = 5 [json_name = "Const"]; } message TypeDecl { - Attributes Attributes = 1; - NameExpr NameExpr = 2; - google.protobuf.Any Type = 3; - bool IsAlias = 4; + Attributes attributes = 1 [json_name = "Attributes"]; + NameExpr name_expr = 2 [json_name = "NameExpr"]; + google.protobuf.Any type = 3 [json_name = "Type"]; + bool is_alias = 4 [json_name = "IsAlias"]; } message StaticBlock { - Block Block = 1; - repeated google.protobuf.Any Types = 2; - uint32 NumNames = 3; - repeated string Names = 4; - repeated string Consts = 5; - repeated string Externs = 6; - Location Loc = 7; + Block block = 1 [json_name = "Block"]; + repeated google.protobuf.Any types = 2 [json_name = "Types"]; + uint32 num_names = 3 [json_name = "NumNames"]; + repeated string names = 4 [json_name = "Names"]; + repeated string consts = 5 [json_name = "Consts"]; + repeated string externs = 6 [json_name = "Externs"]; + Location loc = 7 [json_name = "Loc"]; } message FileSet { - repeated FileNode Files = 1; + repeated FileNode files = 1 [json_name = "Files"]; } message FileNode { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - string Name = 3; - string PkgName = 4; - repeated google.protobuf.Any Decls = 5; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + string name = 3 [json_name = "Name"]; + string pkg_name = 4 [json_name = "PkgName"]; + repeated google.protobuf.Any decls = 5 [json_name = "Decls"]; } message PackageNode { - Attributes Attributes = 1; - StaticBlock StaticBlock = 2; - string PkgPath = 3; - string PkgName = 4; - FileSet FileSet = 5; + Attributes attributes = 1 [json_name = "Attributes"]; + StaticBlock static_block = 2 [json_name = "StaticBlock"]; + string pkg_path = 3 [json_name = "PkgPath"]; + string pkg_name = 4 [json_name = "PkgName"]; + FileSet file_set = 5 [json_name = "FileSet"]; } message RefNode { - Location Location = 1; - google.protobuf.Any BlockNode = 2; + Location location = 1 [json_name = "Location"]; + google.protobuf.Any block_node = 2 [json_name = "BlockNode"]; } message PrimitiveType { - sint64 Value = 1; + sint64 value = 1; } message PointerType { - google.protobuf.Any Elt = 1; + google.protobuf.Any elt = 1 [json_name = "Elt"]; } message ArrayType { - sint64 Len = 1; - google.protobuf.Any Elt = 2; - bool Vrd = 3; + sint64 len = 1 [json_name = "Len"]; + google.protobuf.Any elt = 2 [json_name = "Elt"]; + bool vrd = 3 [json_name = "Vrd"]; } message SliceType { - google.protobuf.Any Elt = 1; - bool Vrd = 2; + google.protobuf.Any elt = 1 [json_name = "Elt"]; + bool vrd = 2 [json_name = "Vrd"]; } message StructType { - string PkgPath = 1; - repeated FieldType Fields = 2; + string pkg_path = 1 [json_name = "PkgPath"]; + repeated FieldType fields = 2 [json_name = "Fields"]; } message FieldType { - string Name = 1; - google.protobuf.Any Type = 2; - bool Embedded = 3; - string Tag = 4; + string name = 1 [json_name = "Name"]; + google.protobuf.Any type = 2 [json_name = "Type"]; + bool embedded = 3 [json_name = "Embedded"]; + string tag = 4 [json_name = "Tag"]; } message FuncType { - repeated FieldType Params = 1; - repeated FieldType Results = 2; + repeated FieldType params = 1 [json_name = "Params"]; + repeated FieldType results = 2 [json_name = "Results"]; } message MapType { - google.protobuf.Any Key = 1; - google.protobuf.Any Value = 2; + google.protobuf.Any key = 1 [json_name = "Key"]; + google.protobuf.Any value = 2 [json_name = "Value"]; } message InterfaceType { - string PkgPath = 1; - repeated FieldType Methods = 2; - string Generic = 3; + string pkg_path = 1 [json_name = "PkgPath"]; + repeated FieldType methods = 2 [json_name = "Methods"]; + string generic = 3 [json_name = "Generic"]; } message TypeType { } message DeclaredType { - string PkgPath = 1; - string Name = 2; - google.protobuf.Any Base = 3; - repeated TypedValue Methods = 4; + string pkg_path = 1 [json_name = "PkgPath"]; + string name = 2 [json_name = "Name"]; + google.protobuf.Any base = 3 [json_name = "Base"]; + repeated TypedValue methods = 4 [json_name = "Methods"]; } message PackageType { } message ChanType { - sint64 Dir = 1; - google.protobuf.Any Elt = 2; + sint64 dir = 1 [json_name = "Dir"]; + google.protobuf.Any elt = 2 [json_name = "Elt"]; } message blockType { } message tupleType { - repeated google.protobuf.Any Elts = 1; + repeated google.protobuf.Any elts = 1 [json_name = "Elts"]; } message RefType { - string ID = 1; + string id = 1 [json_name = "ID"]; } \ No newline at end of file diff --git a/gnovm/pkg/gnolang/op_inc_dec.go b/gnovm/pkg/gnolang/op_inc_dec.go index 80987707035..70886497d5e 100644 --- a/gnovm/pkg/gnolang/op_inc_dec.go +++ b/gnovm/pkg/gnolang/op_inc_dec.go @@ -1,5 +1,12 @@ package gnolang +import ( + "fmt" + "math/big" + + "github.com/cockroachdb/apd" +) + func (m *Machine) doOpInc() { s := m.PopStmt().(*IncDecStmt) @@ -42,8 +49,26 @@ func (m *Machine) doOpInc() { lv.SetUint32(lv.GetUint32() + 1) case Uint64Type: lv.SetUint64(lv.GetUint64() + 1) + case Float32Type: + lv.SetFloat32(lv.GetFloat32() + 1) + case Float64Type: + lv.SetFloat64(lv.GetFloat64() + 1) + case BigintType, UntypedBigintType: + lb := lv.GetBigInt() + lb = big.NewInt(0).Add(lb, big.NewInt(1)) + lv.V = BigintValue{V: lb} + case BigdecType, UntypedBigdecType: + lb := lv.GetBigDec() + sum := apd.New(0, 0) + cond, err := apd.BaseContext.WithPrecision(0).Add(sum, lb, apd.New(1, 0)) + if err != nil { + panic(fmt.Sprintf("bigdec addition error: %v", err)) + } else if cond.Inexact() { + panic(fmt.Sprintf("bigdec addition inexact: %v + 1", lb)) + } + lv.V = BigdecValue{V: sum} default: - panic("unexpected type in in operation") + panic(fmt.Sprintf("unexpected type %s in inc/dec operation", lv.T)) } // Mark dirty in realm. @@ -94,8 +119,26 @@ func (m *Machine) doOpDec() { lv.SetUint32(lv.GetUint32() - 1) case Uint64Type: lv.SetUint64(lv.GetUint64() - 1) + case Float32Type: + lv.SetFloat32(lv.GetFloat32() - 1) + case Float64Type: + lv.SetFloat64(lv.GetFloat64() - 1) + case BigintType, UntypedBigintType: + lb := lv.GetBigInt() + lb = big.NewInt(0).Sub(lb, big.NewInt(1)) + lv.V = BigintValue{V: lb} + case BigdecType, UntypedBigdecType: + lb := lv.GetBigDec() + sum := apd.New(0, 0) + cond, err := apd.BaseContext.WithPrecision(0).Sub(sum, lb, apd.New(1, 0)) + if err != nil { + panic(fmt.Sprintf("bigdec addition error: %v", err)) + } else if cond.Inexact() { + panic(fmt.Sprintf("bigdec addition inexact: %v + 1", lb)) + } + lv.V = BigdecValue{V: sum} default: - panic("unexpected type in in operation") + panic(fmt.Sprintf("unexpected type %s in inc/dec operation", lv.T)) } // Mark dirty in realm. diff --git a/gnovm/pkg/gnolang/precompile.go b/gnovm/pkg/gnolang/precompile.go index c3116f25800..42748145de8 100644 --- a/gnovm/pkg/gnolang/precompile.go +++ b/gnovm/pkg/gnolang/precompile.go @@ -13,9 +13,10 @@ import ( "sort" "strings" - "github.com/gnolang/gno/tm2/pkg/std" "go.uber.org/multierr" "golang.org/x/tools/go/ast/astutil" + + "github.com/gnolang/gno/tm2/pkg/std" ) const ( @@ -36,10 +37,10 @@ var stdlibWhitelist = []string{ "crypto/md5", "crypto/sha1", "crypto/sha256", - "encoding/json", "encoding/base64", "encoding/binary", "encoding/hex", + "encoding/json", "encoding/xml", "errors", "flag", @@ -150,7 +151,7 @@ func Precompile(source string, tags string, filename string) (*precompileResult, var out bytes.Buffer fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "tmp.gno", source, parser.ParseComments) + f, err := parser.ParseFile(fset, filename, source, parser.ParseComments) if err != nil { return nil, fmt.Errorf("parse: %w", err) } diff --git a/gnovm/pkg/gnomod/gnomod.go b/gnovm/pkg/gnomod/gnomod.go index 3c224bafb87..d750b7c9f29 100644 --- a/gnovm/pkg/gnomod/gnomod.go +++ b/gnovm/pkg/gnomod/gnomod.go @@ -7,8 +7,8 @@ import ( "path/filepath" "strings" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" "github.com/gnolang/gno/gnovm/pkg/gnolang" - "github.com/gnolang/gno/tm2/pkg/crypto/keys/client" "github.com/gnolang/gno/tm2/pkg/std" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -18,7 +18,7 @@ const queryPathFile = "vm/qfile" // GetGnoModPath returns the path for gno modules func GetGnoModPath() string { - return filepath.Join(client.HomeDir(), "pkg", "mod") + return filepath.Join(gnoenv.HomeDir(), "pkg", "mod") } // PackageDir resolves a given module.Version to the path on the filesystem. diff --git a/gnovm/pkg/integration/gno.go b/gnovm/pkg/integration/gno.go index 56e18bbb5db..ee0216fa9e8 100644 --- a/gnovm/pkg/integration/gno.go +++ b/gnovm/pkg/integration/gno.go @@ -8,6 +8,7 @@ import ( "path/filepath" "testing" + "github.com/gnolang/gno/gnovm/pkg/gnoenv" osm "github.com/gnolang/gno/tm2/pkg/os" "github.com/rogpeppe/go-internal/testscript" ) @@ -18,16 +19,7 @@ import ( // to correctly set up the environment variables needed for the `gno` command. func SetupGno(p *testscript.Params, buildDir string) error { // Try to fetch `GNOROOT` from the environment variables - gnoroot := os.Getenv("GNOROOT") - if gnoroot == "" { - // If `GNOROOT` isn't set, determine the root directory of github.com/gnolang/gno - goModPath, err := exec.Command("go", "env", "GOMOD").CombinedOutput() - if err != nil { - return fmt.Errorf("unable to determine gno root directory") - } - - gnoroot = filepath.Dir(string(goModPath)) - } + gnoroot := gnoenv.RootDir() if !osm.DirExists(buildDir) { return fmt.Errorf("%q does not exist or is not a directory", buildDir) @@ -92,7 +84,7 @@ func SetupGno(p *testscript.Params, buildDir string) error { p.Cmds["gno"] = func(ts *testscript.TestScript, neg bool, args []string) { err := ts.Exec(gnoBin, args...) if err != nil { - ts.Logf("gno command error: %v", err) + ts.Logf("gno command error: %+v", err) } commandSucceeded := (err == nil) diff --git a/gnovm/stdlibs/math/abs.gno b/gnovm/stdlibs/math/abs.gno index 7a55c0c5bd2..08be14548dd 100644 --- a/gnovm/stdlibs/math/abs.gno +++ b/gnovm/stdlibs/math/abs.gno @@ -4,10 +4,6 @@ package math -import ( - imath "internal/math" // XXX -) - // Abs returns the absolute value of x. // // Special cases are: @@ -15,5 +11,5 @@ import ( // Abs(±Inf) = +Inf // Abs(NaN) = NaN func Abs(x float64) float64 { - return imath.Float64frombits(imath.Float64bits(x) &^ (1 << 63)) + return Float64frombits(Float64bits(x) &^ (1 << 63)) } diff --git a/gnovm/stdlibs/math/acosh.gno b/gnovm/stdlibs/math/acosh.gno new file mode 100644 index 00000000000..261f25ce9f9 --- /dev/null +++ b/gnovm/stdlibs/math/acosh.gno @@ -0,0 +1,62 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code, the long comment, and the constants +// below are from FreeBSD's /usr/src/lib/msun/src/e_acosh.c +// and came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// +// __ieee754_acosh(x) +// Method : +// Based on +// acosh(x) = log [ x + sqrt(x*x-1) ] +// we have +// acosh(x) := log(x)+ln2, if x is large; else +// acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else +// acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1. +// +// Special cases: +// acosh(x) is NaN with signal if x<1. +// acosh(NaN) is NaN without signal. +// + +// Acosh returns the inverse hyperbolic cosine of x. +// +// Special cases are: +// +// Acosh(+Inf) = +Inf +// Acosh(x) = NaN if x < 1 +// Acosh(NaN) = NaN +func Acosh(x float64) float64 { + return acosh(x) +} + +func acosh(x float64) float64 { + const Large = 1 << 28 // 2**28 + // first case is special case + switch { + case x < 1 || IsNaN(x): + return NaN() + case x == 1: + return 0 + case x >= Large: + return Log(x) + Ln2 // x > 2**28 + case x > 2: + return Log(2*x - 1/(x+Sqrt(x*x-1))) // 2**28 > x > 2 + } + t := x - 1 + return Log1p(t + Sqrt(2*t+t*t)) // 2 >= x > 1 +} diff --git a/gnovm/stdlibs/math/all_test.gno b/gnovm/stdlibs/math/all_test.gno index ba7b1528d23..3d2a018b118 100644 --- a/gnovm/stdlibs/math/all_test.gno +++ b/gnovm/stdlibs/math/all_test.gno @@ -2,28 +2,586 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package math +package math_test import ( + "fmt" + "math" "testing" ) +// XXX: The dot import for "math" is replaced to a normal import. +// As such, all calls to export math functions are prefixed with math (as opposed +// to the original all_test.gno). + +var vf = []float64{ + 4.9790119248836735e+00, + 7.7388724745781045e+00, + -2.7688005719200159e-01, + -5.0106036182710749e+00, + 9.6362937071984173e+00, + 2.9263772392439646e+00, + 5.2290834314593066e+00, + 2.7279399104360102e+00, + 1.8253080916808550e+00, + -8.6859247685756013e+00, +} + // The expected results below were computed by the high precision calculators // at https://keisan.casio.com/. More exact input values (array vf[], above) // were obtained by printing them with "%.26f". The answers were calculated // to 26 digits (by using the "Digit number" drop-down control of each // calculator). -var vf = []float64{ - 4.9790119248836735e+00, - 7.7388724745781045e+00, +var acos = []float64{ + 1.0496193546107222142571536e+00, + 6.8584012813664425171660692e-01, + 1.5984878714577160325521819e+00, + 2.0956199361475859327461799e+00, + 2.7053008467824138592616927e-01, + 1.2738121680361776018155625e+00, + 1.0205369421140629186287407e+00, + 1.2945003481781246062157835e+00, + 1.3872364345374451433846657e+00, + 2.6231510803970463967294145e+00, +} + +var acosh = []float64{ + 2.4743347004159012494457618e+00, + 2.8576385344292769649802701e+00, + 7.2796961502981066190593175e-01, + 2.4796794418831451156471977e+00, + 3.0552020742306061857212962e+00, + 2.044238592688586588942468e+00, + 2.5158701513104513595766636e+00, + 1.99050839282411638174299e+00, + 1.6988625798424034227205445e+00, + 2.9611454842470387925531875e+00, +} + +var asin = []float64{ + 5.2117697218417440497416805e-01, + 8.8495619865825236751471477e-01, + -02.769154466281941332086016e-02, + -5.2482360935268931351485822e-01, + 1.3002662421166552333051524e+00, + 2.9698415875871901741575922e-01, + 5.5025938468083370060258102e-01, + 2.7629597861677201301553823e-01, + 1.83559892257451475846656e-01, + -1.0523547536021497774980928e+00, +} + +var asinh = []float64{ + 2.3083139124923523427628243e+00, + 2.743551594301593620039021e+00, + -2.7345908534880091229413487e-01, + -2.3145157644718338650499085e+00, + 2.9613652154015058521951083e+00, + 1.7949041616585821933067568e+00, + 2.3564032905983506405561554e+00, + 1.7287118790768438878045346e+00, + 1.3626658083714826013073193e+00, + -2.8581483626513914445234004e+00, +} + +var atan = []float64{ + 1.372590262129621651920085e+00, + 1.442290609645298083020664e+00, + -2.7011324359471758245192595e-01, + -1.3738077684543379452781531e+00, + 1.4673921193587666049154681e+00, + 1.2415173565870168649117764e+00, + 1.3818396865615168979966498e+00, + 1.2194305844639670701091426e+00, + 1.0696031952318783760193244e+00, + -1.4561721938838084990898679e+00, +} + +var atanh = []float64{ + 5.4651163712251938116878204e-01, + 1.0299474112843111224914709e+00, + -2.7695084420740135145234906e-02, + -5.5072096119207195480202529e-01, + 1.9943940993171843235906642e+00, + 3.01448604578089708203017e-01, + 5.8033427206942188834370595e-01, + 2.7987997499441511013958297e-01, + 1.8459947964298794318714228e-01, + -1.3273186910532645867272502e+00, +} + +var atan2 = []float64{ + 1.1088291730037004444527075e+00, + 9.1218183188715804018797795e-01, + 1.5984772603216203736068915e+00, + 2.0352918654092086637227327e+00, + 8.0391819139044720267356014e-01, + 1.2861075249894661588866752e+00, + 1.0889904479131695712182587e+00, + 1.3044821793397925293797357e+00, + 1.3902530903455392306872261e+00, + 2.2859857424479142655411058e+00, +} + +var cbrt = []float64{ + 1.7075799841925094446722675e+00, + 1.9779982212970353936691498e+00, + -6.5177429017779910853339447e-01, + -1.7111838886544019873338113e+00, + 2.1279920909827937423960472e+00, + 1.4303536770460741452312367e+00, + 1.7357021059106154902341052e+00, + 1.3972633462554328350552916e+00, + 1.2221149580905388454977636e+00, + -2.0556003730500069110343596e+00, +} + +var ceil = []float64{ + 5.0000000000000000e+00, + 8.0000000000000000e+00, + math.Copysign(0, -1), + -5.0000000000000000e+00, + 1.0000000000000000e+01, + 3.0000000000000000e+00, + 6.0000000000000000e+00, + 3.0000000000000000e+00, + 2.0000000000000000e+00, + -8.0000000000000000e+00, +} + +var copysign = []float64{ + -4.9790119248836735e+00, + -7.7388724745781045e+00, -2.7688005719200159e-01, -5.0106036182710749e+00, + -9.6362937071984173e+00, + -2.9263772392439646e+00, + -5.2290834314593066e+00, + -2.7279399104360102e+00, + -1.8253080916808550e+00, + -8.6859247685756013e+00, +} + +var cos = []float64{ + 2.634752140995199110787593e-01, + 1.148551260848219865642039e-01, + 9.6191297325640768154550453e-01, + 2.938141150061714816890637e-01, + -9.777138189897924126294461e-01, + -9.7693041344303219127199518e-01, + 4.940088096948647263961162e-01, + -9.1565869021018925545016502e-01, + -2.517729313893103197176091e-01, + -7.39241351595676573201918e-01, +} + +// Results for 100000 * math.Pi + vf[i] +var cosLarge = []float64{ + 2.634752141185559426744e-01, + 1.14855126055543100712e-01, + 9.61912973266488928113e-01, + 2.9381411499556122552e-01, + -9.777138189880161924641e-01, + -9.76930413445147608049e-01, + 4.940088097314976789841e-01, + -9.15658690217517835002e-01, + -2.51772931436786954751e-01, + -7.3924135157173099849e-01, +} + +var cosh = []float64{ + 7.2668796942212842775517446e+01, + 1.1479413465659254502011135e+03, + 1.0385767908766418550935495e+00, + 7.5000957789658051428857788e+01, + 7.655246669605357888468613e+03, + 9.3567491758321272072888257e+00, + 9.331351599270605471131735e+01, + 7.6833430994624643209296404e+00, + 3.1829371625150718153881164e+00, + 2.9595059261916188501640911e+03, +} + +var erf = []float64{ + 5.1865354817738701906913566e-01, + 7.2623875834137295116929844e-01, + -3.123458688281309990629839e-02, + -5.2143121110253302920437013e-01, + 8.2704742671312902508629582e-01, + 3.2101767558376376743993945e-01, + 5.403990312223245516066252e-01, + 3.0034702916738588551174831e-01, + 2.0369924417882241241559589e-01, + -7.8069386968009226729944677e-01, +} + +var erfc = []float64{ + 4.8134645182261298093086434e-01, + 2.7376124165862704883070156e-01, + 1.0312345868828130999062984e+00, + 1.5214312111025330292043701e+00, + 1.7295257328687097491370418e-01, + 6.7898232441623623256006055e-01, + 4.596009687776754483933748e-01, + 6.9965297083261411448825169e-01, + 7.9630075582117758758440411e-01, + 1.7806938696800922672994468e+00, +} + +var erfinv = []float64{ + 4.746037673358033586786350696e-01, + 8.559054432692110956388764172e-01, + -2.45427830571707336251331946e-02, + -4.78116683518973366268905506e-01, + 1.479804430319470983648120853e+00, + 2.654485787128896161882650211e-01, + 5.027444534221520197823192493e-01, + 2.466703532707627818954585670e-01, + 1.632011465103005426240343116e-01, + -1.06672334642196900710000389e+00, +} + +var exp = []float64{ + 1.4533071302642137507696589e+02, + 2.2958822575694449002537581e+03, + 7.5814542574851666582042306e-01, + 6.6668778421791005061482264e-03, + 1.5310493273896033740861206e+04, + 1.8659907517999328638667732e+01, + 1.8662167355098714543942057e+02, + 1.5301332413189378961665788e+01, + 6.2047063430646876349125085e+00, + 1.6894712385826521111610438e-04, +} + +var expm1 = []float64{ + 5.105047796122957327384770212e-02, + 8.046199708567344080562675439e-02, + -2.764970978891639815187418703e-03, + -4.8871434888875355394330300273e-02, + 1.0115864277221467777117227494e-01, + 2.969616407795910726014621657e-02, + 5.368214487944892300914037972e-02, + 2.765488851131274068067445335e-02, + 1.842068661871398836913874273e-02, + -8.3193870863553801814961137573e-02, +} + +var expm1Large = []float64{ + 4.2031418113550844e+21, + 4.0690789717473863e+33, + -0.9372627915981363e+00, + -1.0, + 7.077694784145933e+41, + 5.117936223839153e+12, + 5.124137759001189e+22, + 7.03546003972584e+11, + 8.456921800389698e+07, + -1.0, +} + +var exp2 = []float64{ + 3.1537839463286288034313104e+01, + 2.1361549283756232296144849e+02, + 8.2537402562185562902577219e-01, + 3.1021158628740294833424229e-02, + 7.9581744110252191462569661e+02, + 7.6019905892596359262696423e+00, + 3.7506882048388096973183084e+01, + 6.6250893439173561733216375e+00, + 3.5438267900243941544605339e+00, + 2.4281533133513300984289196e-03, +} + +var fabs = []float64{ + 4.9790119248836735e+00, + 7.7388724745781045e+00, + 2.7688005719200159e-01, + 5.0106036182710749e+00, 9.6362937071984173e+00, 2.9263772392439646e+00, 5.2290834314593066e+00, 2.7279399104360102e+00, 1.8253080916808550e+00, - -8.6859247685756013e+00, + 8.6859247685756013e+00, +} + +var fdim = []float64{ + 4.9790119248836735e+00, + 7.7388724745781045e+00, + 0.0000000000000000e+00, + 0.0000000000000000e+00, + 9.6362937071984173e+00, + 2.9263772392439646e+00, + 5.2290834314593066e+00, + 2.7279399104360102e+00, + 1.8253080916808550e+00, + 0.0000000000000000e+00, +} + +var floor = []float64{ + 4.0000000000000000e+00, + 7.0000000000000000e+00, + -1.0000000000000000e+00, + -6.0000000000000000e+00, + 9.0000000000000000e+00, + 2.0000000000000000e+00, + 5.0000000000000000e+00, + 2.0000000000000000e+00, + 1.0000000000000000e+00, + -9.0000000000000000e+00, +} + +var fmod = []float64{ + 4.197615023265299782906368e-02, + 2.261127525421895434476482e+00, + 3.231794108794261433104108e-02, + 4.989396381728925078391512e+00, + 3.637062928015826201999516e-01, + 1.220868282268106064236690e+00, + 4.770916568540693347699744e+00, + 1.816180268691969246219742e+00, + 8.734595415957246977711748e-01, + 1.314075231424398637614104e+00, +} + +type fi struct { + f float64 + i int +} + +var frexp = []fi{ + {6.2237649061045918750e-01, 3}, + {9.6735905932226306250e-01, 3}, + {-5.5376011438400318000e-01, -1}, + {-6.2632545228388436250e-01, 3}, + {6.02268356699901081250e-01, 4}, + {7.3159430981099115000e-01, 2}, + {6.5363542893241332500e-01, 3}, + {6.8198497760900255000e-01, 2}, + {9.1265404584042750000e-01, 1}, + {-5.4287029803597508250e-01, 4}, +} + +var gamma = []float64{ + 2.3254348370739963835386613898e+01, + 2.991153837155317076427529816e+03, + -4.561154336726758060575129109e+00, + 7.719403468842639065959210984e-01, + 1.6111876618855418534325755566e+05, + 1.8706575145216421164173224946e+00, + 3.4082787447257502836734201635e+01, + 1.579733951448952054898583387e+00, + 9.3834586598354592860187267089e-01, + -2.093995902923148389186189429e-05, +} + +var j0 = []float64{ + -1.8444682230601672018219338e-01, + 2.27353668906331975435892e-01, + 9.809259936157051116270273e-01, + -1.741170131426226587841181e-01, + -2.1389448451144143352039069e-01, + -2.340905848928038763337414e-01, + -1.0029099691890912094586326e-01, + -1.5466726714884328135358907e-01, + 3.252650187653420388714693e-01, + -8.72218484409407250005360235e-03, +} + +var j1 = []float64{ + -3.251526395295203422162967e-01, + 1.893581711430515718062564e-01, + -1.3711761352467242914491514e-01, + 3.287486536269617297529617e-01, + 1.3133899188830978473849215e-01, + 3.660243417832986825301766e-01, + -3.4436769271848174665420672e-01, + 4.329481396640773768835036e-01, + 5.8181350531954794639333955e-01, + -2.7030574577733036112996607e-01, +} + +var j2 = []float64{ + 5.3837518920137802565192769e-02, + -1.7841678003393207281244667e-01, + 9.521746934916464142495821e-03, + 4.28958355470987397983072e-02, + 2.4115371837854494725492872e-01, + 4.842458532394520316844449e-01, + -3.142145220618633390125946e-02, + 4.720849184745124761189957e-01, + 3.122312022520957042957497e-01, + 7.096213118930231185707277e-02, +} + +var jM3 = []float64{ + -3.684042080996403091021151e-01, + 2.8157665936340887268092661e-01, + 4.401005480841948348343589e-04, + 3.629926999056814081597135e-01, + 3.123672198825455192489266e-02, + -2.958805510589623607540455e-01, + -3.2033177696533233403289416e-01, + -2.592737332129663376736604e-01, + -1.0241334641061485092351251e-01, + -2.3762660886100206491674503e-01, +} + +var lgamma = []fi{ + {3.146492141244545774319734e+00, 1}, + {8.003414490659126375852113e+00, 1}, + {1.517575735509779707488106e+00, -1}, + {-2.588480028182145853558748e-01, 1}, + {1.1989897050205555002007985e+01, 1}, + {6.262899811091257519386906e-01, 1}, + {3.5287924899091566764846037e+00, 1}, + {4.5725644770161182299423372e-01, 1}, + {-6.363667087767961257654854e-02, 1}, + {-1.077385130910300066425564e+01, -1}, +} + +var log = []float64{ + 1.605231462693062999102599e+00, + 2.0462560018708770653153909e+00, + -1.2841708730962657801275038e+00, + 1.6115563905281545116286206e+00, + 2.2655365644872016636317461e+00, + 1.0737652208918379856272735e+00, + 1.6542360106073546632707956e+00, + 1.0035467127723465801264487e+00, + 6.0174879014578057187016475e-01, + 2.161703872847352815363655e+00, +} + +var logb = []float64{ + 2.0000000000000000e+00, + 2.0000000000000000e+00, + -2.0000000000000000e+00, + 2.0000000000000000e+00, + 3.0000000000000000e+00, + 1.0000000000000000e+00, + 2.0000000000000000e+00, + 1.0000000000000000e+00, + 0.0000000000000000e+00, + 3.0000000000000000e+00, +} + +var log10 = []float64{ + 6.9714316642508290997617083e-01, + 8.886776901739320576279124e-01, + -5.5770832400658929815908236e-01, + 6.998900476822994346229723e-01, + 9.8391002850684232013281033e-01, + 4.6633031029295153334285302e-01, + 7.1842557117242328821552533e-01, + 4.3583479968917773161304553e-01, + 2.6133617905227038228626834e-01, + 9.3881606348649405716214241e-01, +} + +var log1p = []float64{ + 4.8590257759797794104158205e-02, + 7.4540265965225865330849141e-02, + -2.7726407903942672823234024e-03, + -5.1404917651627649094953380e-02, + 9.1998280672258624681335010e-02, + 2.8843762576593352865894824e-02, + 5.0969534581863707268992645e-02, + 2.6913947602193238458458594e-02, + 1.8088493239630770262045333e-02, + -9.0865245631588989681559268e-02, +} + +var log2 = []float64{ + 2.3158594707062190618898251e+00, + 2.9521233862883917703341018e+00, + -1.8526669502700329984917062e+00, + 2.3249844127278861543568029e+00, + 3.268478366538305087466309e+00, + 1.5491157592596970278166492e+00, + 2.3865580889631732407886495e+00, + 1.447811865817085365540347e+00, + 8.6813999540425116282815557e-01, + 3.118679457227342224364709e+00, +} + +var modf = [][2]float64{ + {4.0000000000000000e+00, 9.7901192488367350108546816e-01}, + {7.0000000000000000e+00, 7.3887247457810456552351752e-01}, + {math.Copysign(0, -1), -2.7688005719200159404635997e-01}, + {-5.0000000000000000e+00, -1.060361827107492160848778e-02}, + {9.0000000000000000e+00, 6.3629370719841737980004837e-01}, + {2.0000000000000000e+00, 9.2637723924396464525443662e-01}, + {5.0000000000000000e+00, 2.2908343145930665230025625e-01}, + {2.0000000000000000e+00, 7.2793991043601025126008608e-01}, + {1.0000000000000000e+00, 8.2530809168085506044576505e-01}, + {-8.0000000000000000e+00, -6.8592476857560136238589621e-01}, +} + +var nextafter32 = []float32{ + 4.979012489318848e+00, + 7.738873004913330e+00, + -2.768800258636475e-01, + -5.010602951049805e+00, + 9.636294364929199e+00, + 2.926377534866333e+00, + 5.229084014892578e+00, + 2.727940082550049e+00, + 1.825308203697205e+00, + -8.685923576354980e+00, +} + +var nextafter64 = []float64{ + 4.97901192488367438926388786e+00, + 7.73887247457810545370193722e+00, + -2.7688005719200153853520874e-01, + -5.01060361827107403343006808e+00, + 9.63629370719841915615688777e+00, + 2.92637723924396508934364647e+00, + 5.22908343145930754047867595e+00, + 2.72793991043601069534929593e+00, + 1.82530809168085528249036997e+00, + -8.68592476857559958602905681e+00, +} + +var pow = []float64{ + 9.5282232631648411840742957e+04, + 5.4811599352999901232411871e+07, + 5.2859121715894396531132279e-01, + 9.7587991957286474464259698e-06, + 4.328064329346044846740467e+09, + 8.4406761805034547437659092e+02, + 1.6946633276191194947742146e+05, + 5.3449040147551939075312879e+02, + 6.688182138451414936380374e+01, + 2.0609869004248742886827439e-09, +} + +var remainder = []float64{ + 4.197615023265299782906368e-02, + 2.261127525421895434476482e+00, + 3.231794108794261433104108e-02, + -2.120723654214984321697556e-02, + 3.637062928015826201999516e-01, + 1.220868282268106064236690e+00, + -4.581668629186133046005125e-01, + -9.117596417440410050403443e-01, + 8.734595415957246977711748e-01, + 1.314075231424398637614104e+00, +} + +var round = []float64{ + 5, + 8, + math.Copysign(0, -1), + -5, + 10, + 3, + 5, + 3, + 2, + -9, } var signbit = []bool{ @@ -52,95 +610,3418 @@ var sin = []float64{ -6.734405869050344734943028e-01, } -var vfsignbitSC = []float64{ - Inf(-1), - Copysign(0, -1), +// Results for 100000 * math.Pi + vf[i] +var sinLarge = []float64{ + -9.646661658548936063912e-01, + 9.933822527198506903752e-01, + -2.7335587036246899796e-01, + 9.55862576853689321268e-01, + -2.099421066862688873691e-01, + 2.13557878070308981163e-01, + -8.694568970959221300497e-01, + 4.01956668098863248917e-01, + 9.67786335404528727927e-01, + -6.7344058693131973066e-01, +} + +var sinh = []float64{ + 7.2661916084208532301448439e+01, + 1.1479409110035194500526446e+03, + -2.8043136512812518927312641e-01, + -7.499429091181587232835164e+01, + 7.6552466042906758523925934e+03, + 9.3031583421672014313789064e+00, + 9.330815755828109072810322e+01, + 7.6179893137269146407361477e+00, + 3.021769180549615819524392e+00, + -2.95950575724449499189888e+03, +} + +var sqrt = []float64{ + 2.2313699659365484748756904e+00, + 2.7818829009464263511285458e+00, + 5.2619393496314796848143251e-01, + 2.2384377628763938724244104e+00, + 3.1042380236055381099288487e+00, + 1.7106657298385224403917771e+00, + 2.286718922705479046148059e+00, + 1.6516476350711159636222979e+00, + 1.3510396336454586262419247e+00, + 2.9471892997524949215723329e+00, +} + +var tan = []float64{ + -3.661316565040227801781974e+00, + 8.64900232648597589369854e+00, + -2.8417941955033612725238097e-01, + 3.253290185974728640827156e+00, + 2.147275640380293804770778e-01, + -2.18600910711067004921551e-01, + -1.760002817872367935518928e+00, + -4.389808914752818126249079e-01, + -3.843885560201130679995041e+00, + 9.10988793377685105753416e-01, +} + +// Results for 100000 * math.Pi + vf[i] +var tanLarge = []float64{ + -3.66131656475596512705e+00, + 8.6490023287202547927e+00, + -2.841794195104782406e-01, + 3.2532901861033120983e+00, + 2.14727564046880001365e-01, + -2.18600910700688062874e-01, + -1.760002817699722747043e+00, + -4.38980891453536115952e-01, + -3.84388555942723509071e+00, + 9.1098879344275101051e-01, +} + +var tanh = []float64{ + 9.9990531206936338549262119e-01, + 9.9999962057085294197613294e-01, + -2.7001505097318677233756845e-01, + -9.9991110943061718603541401e-01, + 9.9999999146798465745022007e-01, + 9.9427249436125236705001048e-01, + 9.9994257600983138572705076e-01, + 9.9149409509772875982054701e-01, + 9.4936501296239685514466577e-01, + -9.9999994291374030946055701e-01, +} + +var trunc = []float64{ + 4.0000000000000000e+00, + 7.0000000000000000e+00, + math.Copysign(0, -1), + -5.0000000000000000e+00, + 9.0000000000000000e+00, + 2.0000000000000000e+00, + 5.0000000000000000e+00, + 2.0000000000000000e+00, + 1.0000000000000000e+00, + -8.0000000000000000e+00, +} + +var y0 = []float64{ + -3.053399153780788357534855e-01, + 1.7437227649515231515503649e-01, + -8.6221781263678836910392572e-01, + -3.100664880987498407872839e-01, + 1.422200649300982280645377e-01, + 4.000004067997901144239363e-01, + -3.3340749753099352392332536e-01, + 4.5399790746668954555205502e-01, + 4.8290004112497761007536522e-01, + 2.7036697826604756229601611e-01, +} + +var y1 = []float64{ + 0.15494213737457922210218611, + -0.2165955142081145245075746, + -2.4644949631241895201032829, + 0.1442740489541836405154505, + 0.2215379960518984777080163, + 0.3038800915160754150565448, + 0.0691107642452362383808547, + 0.2380116417809914424860165, + -0.20849492979459761009678934, + 0.0242503179793232308250804, +} + +var y2 = []float64{ + 0.3675780219390303613394936, + -0.23034826393250119879267257, + -16.939677983817727205631397, + 0.367653980523052152867791, + -0.0962401471767804440353136, + -0.1923169356184851105200523, + 0.35984072054267882391843766, + -0.2794987252299739821654982, + -0.7113490692587462579757954, + -0.2647831587821263302087457, +} + +var yM3 = []float64{ + -0.14035984421094849100895341, + -0.097535139617792072703973, + 242.25775994555580176377379, + -0.1492267014802818619511046, + 0.26148702629155918694500469, + 0.56675383593895176530394248, + -0.206150264009006981070575, + 0.64784284687568332737963658, + 1.3503631555901938037008443, + 0.1461869756579956803341844, +} + +// arguments and expected results for special cases +var vfacosSC = []float64{ + -math.Pi, + 1, + math.Pi, + math.NaN(), +} + +var acosSC = []float64{ + math.NaN(), 0, - Inf(1), - NaN(), + math.NaN(), + math.NaN(), } -var signbitSC = []bool{ - true, - true, - false, - false, - false, +var vfacoshSC = []float64{ + math.Inf(-1), + 0.5, + 1, + math.Inf(1), + math.NaN(), } -var vfsinSC = []float64{ - Inf(-1), - Copysign(0, -1), +var acoshSC = []float64{ + math.NaN(), + math.NaN(), 0, - Inf(1), - NaN(), + math.Inf(1), + math.NaN(), } -var sinSC = []float64{ - NaN(), - Copysign(0, -1), +var vfasinSC = []float64{ + -math.Pi, + math.Copysign(0, -1), 0, - NaN(), - NaN(), + math.Pi, + math.NaN(), } -func tolerance(a, b, e float64) bool { - // Multiplying by e here can underflow denormal values to zero. - // Check a==b so that at least if a and b are small and identical - // we say they match. - if a == b { - return true - } - d := a - b - if d < 0 { - d = -d - } +var asinSC = []float64{ + math.NaN(), + math.Copysign(0, -1), + 0, + math.NaN(), + math.NaN(), +} - // note: b is correct (expected) value, a is actual value. - // make error tolerance a fraction of b, not a. - if b != 0 { - e = e * b - if e < 0 { - e = -e - } - } - return d < e +var vfasinhSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), } -func close(a, b float64) bool { return tolerance(a, b, 1e-14) } -func veryclose(a, b float64) bool { return tolerance(a, b, 4e-16) } -func soclose(a, b, e float64) bool { return tolerance(a, b, e) } -func alike(a, b float64) bool { - switch { - case IsNaN(a) && IsNaN(b): - return true - case a == b: - return Signbit(a) == Signbit(b) - } - return false + +var asinhSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), } -func TestSin(t *testing.T) { - for i := 0; i < len(vf); i++ { - if f := Sin(vf[i]); !veryclose(sin[i], f) { - t.Errorf("Sin(%g) = %g, want %g", vf[i], f, sin[i]) - } - } - for i := 0; i < len(vfsinSC); i++ { - if f := Sin(vfsinSC[i]); !alike(sinSC[i], f) { - t.Errorf("Sin(%g) = %g, want %g", vfsinSC[i], f, sinSC[i]) - } - } +var vfatanSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), } -func TestSignbit(t *testing.T) { - for i := 0; i < len(vf); i++ { - if f := Signbit(vf[i]); signbit[i] != f { - t.Errorf("Signbit(%g) = %t, want %t", vf[i], f, signbit[i]) - } - } - for i := 0; i < len(vfsignbitSC); i++ { - if f := Signbit(vfsignbitSC[i]); signbitSC[i] != f { - t.Errorf("Signbit(%g) = %t, want %t", vfsignbitSC[i], f, signbitSC[i]) - } +var atanSC = []float64{ + -math.Pi / 2, + math.Copysign(0, -1), + 0, + math.Pi / 2, + math.NaN(), +} + +var vfatanhSC = []float64{ + math.Inf(-1), + -math.Pi, + -1, + math.Copysign(0, -1), + 0, + 1, + math.Pi, + math.Inf(1), + math.NaN(), +} + +var atanhSC = []float64{ + math.NaN(), + math.NaN(), + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), + math.NaN(), + math.NaN(), +} + +var vfatan2SC = [][2]float64{ + {math.Inf(-1), math.Inf(-1)}, + {math.Inf(-1), -math.Pi}, + {math.Inf(-1), 0}, + {math.Inf(-1), +math.Pi}, + {math.Inf(-1), math.Inf(1)}, + {math.Inf(-1), math.NaN()}, + {-math.Pi, math.Inf(-1)}, + {-math.Pi, 0}, + {-math.Pi, math.Inf(1)}, + {-math.Pi, math.NaN()}, + {math.Copysign(0, -1), math.Inf(-1)}, + {math.Copysign(0, -1), -math.Pi}, + {math.Copysign(0, -1), math.Copysign(0, -1)}, + {math.Copysign(0, -1), 0}, + {math.Copysign(0, -1), +math.Pi}, + {math.Copysign(0, -1), math.Inf(1)}, + {math.Copysign(0, -1), math.NaN()}, + {0, math.Inf(-1)}, + {0, -math.Pi}, + {0, math.Copysign(0, -1)}, + {0, 0}, + {0, +math.Pi}, + {0, math.Inf(1)}, + {0, math.NaN()}, + {+math.Pi, math.Inf(-1)}, + {+math.Pi, 0}, + {+math.Pi, math.Inf(1)}, + {1.0, math.Inf(1)}, + {-1.0, math.Inf(1)}, + {+math.Pi, math.NaN()}, + {math.Inf(1), math.Inf(-1)}, + {math.Inf(1), -math.Pi}, + {math.Inf(1), 0}, + {math.Inf(1), +math.Pi}, + {math.Inf(1), math.Inf(1)}, + {math.Inf(1), math.NaN()}, + {math.NaN(), math.NaN()}, +} + +var atan2SC = []float64{ + // https://github.com/gnolang/gno/issues/1152 + -3.0 * math.Pi / 4, // atan2(-Inf, -Inf) + -math.Pi / 2, // atan2(-Inf, -math.Pi) + -math.Pi / 2, // atan2(-Inf, +0) + -math.Pi / 2, // atan2(-Inf, +math.Pi) + -math.Pi / 4, // atan2(-Inf, +Inf) + math.NaN(), // atan2(-Inf, NaN) + -math.Pi, // atan2(-math.Pi, -Inf) + -math.Pi / 2, // atan2(-math.Pi, +0) + math.Copysign(0, -1), // atan2(-math.Pi, Inf) + math.NaN(), // atan2(-math.Pi, NaN) + -math.Pi, // atan2(-0, -Inf) + -math.Pi, // atan2(-0, -math.Pi) + -math.Pi, // atan2(-0, -0) + math.Copysign(0, -1), // atan2(-0, +0) + math.Copysign(0, -1), // atan2(-0, +math.Pi) + math.Copysign(0, -1), // atan2(-0, +Inf) + math.NaN(), // atan2(-0, NaN) + math.Pi, // atan2(+0, -Inf) + math.Pi, // atan2(+0, -math.Pi) + math.Pi, // atan2(+0, -0) + 0, // atan2(+0, +0) + 0, // atan2(+0, +math.Pi) + 0, // atan2(+0, +Inf) + math.NaN(), // atan2(+0, NaN) + math.Pi, // atan2(+math.Pi, -Inf) + math.Pi / 2, // atan2(+math.Pi, +0) + 0, // atan2(+math.Pi, +Inf) + 0, // atan2(+1, +Inf) + math.Copysign(0, -1), // atan2(-1, +Inf) + math.NaN(), // atan2(+math.Pi, NaN) + 3 * math.Pi / 4, // atan2(+Inf, -Inf) + math.Pi / 2, // atan2(+Inf, -math.Pi) + math.Pi / 2, // atan2(+Inf, +0) + math.Pi / 2, // atan2(+Inf, +math.Pi) + math.Pi / 4, // atan2(+Inf, +Inf) + math.NaN(), // atan2(+Inf, NaN) + math.NaN(), // atan2(NaN, NaN) +} + +var vfcbrtSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var cbrtSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var vfceilSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var ceilSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var vfcopysignSC = []float64{ + math.Inf(-1), + math.Inf(1), + math.NaN(), +} + +var copysignSC = []float64{ + math.Inf(-1), + math.Inf(-1), + math.NaN(), +} + +var vfcosSC = []float64{ + math.Inf(-1), + math.Inf(1), + math.NaN(), +} + +var cosSC = []float64{ + math.NaN(), + math.NaN(), + math.NaN(), +} + +var vfcoshSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var coshSC = []float64{ + math.Inf(1), + 1, + 1, + math.Inf(1), + math.NaN(), +} + +var vferfSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), + -1000, + 1000, +} + +var erfSC = []float64{ + -1, + math.Copysign(0, -1), + 0, + 1, + math.NaN(), + -1, + 1, +} + +var vferfcSC = []float64{ + math.Inf(-1), + math.Inf(1), + math.NaN(), + -1000, + 1000, +} + +var erfcSC = []float64{ + 2, + 0, + math.NaN(), + 2, + 0, +} + +var vferfinvSC = []float64{ + 1, + -1, + 0, + math.Inf(-1), + math.Inf(1), + math.NaN(), +} + +var erfinvSC = []float64{ + math.Inf(+1), + math.Inf(-1), + 0, + math.NaN(), + math.NaN(), + math.NaN(), +} + +var vferfcinvSC = []float64{ + 0, + 2, + 1, + math.Inf(1), + math.Inf(-1), + math.NaN(), +} + +var erfcinvSC = []float64{ + math.Inf(+1), + math.Inf(-1), + 0, + math.NaN(), + math.NaN(), + math.NaN(), +} + +var vfexpSC = []float64{ + math.Inf(-1), + -2000, + 2000, + math.Inf(1), + math.NaN(), + // smallest float64 that overflows math.Exp(x) + 7.097827128933841e+02, + // Issue 18912 + 1.48852223e+09, + 1.4885222e+09, + 1, + // near zero + 3.725290298461915e-09, + // denormal + -740, +} + +var expSC = []float64{ + 0, + 0, + math.Inf(1), + math.Inf(1), + math.NaN(), + math.Inf(1), + math.Inf(1), + math.Inf(1), + 2.718281828459045, + 1.0000000037252903, + 4.2e-322, +} + +var vfexp2SC = []float64{ + math.Inf(-1), + -2000, + 2000, + math.Inf(1), + math.NaN(), + // smallest float64 that overflows math.Exp2(x) + 1024, + // near underflow + -1.07399999999999e+03, + // near zero + 3.725290298461915e-09, +} + +var exp2SC = []float64{ + 0, + 0, + math.Inf(1), + math.Inf(1), + math.NaN(), + math.Inf(1), + 5e-324, + 1.0000000025821745, +} + +var vfexpm1SC = []float64{ + math.Inf(-1), + -710, + math.Copysign(0, -1), + 0, + 710, + math.Inf(1), + math.NaN(), +} + +var expm1SC = []float64{ + -1, + -1, + math.Copysign(0, -1), + 0, + math.Inf(1), + math.Inf(1), + math.NaN(), +} + +var vffabsSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var fabsSC = []float64{ + math.Inf(1), + 0, + 0, + math.Inf(1), + math.NaN(), +} + +var vffdimSC = [][2]float64{ + {math.Inf(-1), math.Inf(-1)}, + {math.Inf(-1), math.Inf(1)}, + {math.Inf(-1), math.NaN()}, + {math.Copysign(0, -1), math.Copysign(0, -1)}, + {math.Copysign(0, -1), 0}, + {0, math.Copysign(0, -1)}, + {0, 0}, + {math.Inf(1), math.Inf(-1)}, + {math.Inf(1), math.Inf(1)}, + {math.Inf(1), math.NaN()}, + {math.NaN(), math.Inf(-1)}, + {math.NaN(), math.Copysign(0, -1)}, + {math.NaN(), 0}, + {math.NaN(), math.Inf(1)}, + {math.NaN(), math.NaN()}, +} + +var ( + nan = math.Float64frombits(0xFFF8000000000000) // SSE2 DIVSD 0/0 + vffdim2SC = [][2]float64{ + {math.Inf(-1), math.Inf(-1)}, + {math.Inf(-1), math.Inf(1)}, + {math.Inf(-1), nan}, + {math.Copysign(0, -1), math.Copysign(0, -1)}, + {math.Copysign(0, -1), 0}, + {0, math.Copysign(0, -1)}, + {0, 0}, + {math.Inf(1), math.Inf(-1)}, + {math.Inf(1), math.Inf(1)}, + {math.Inf(1), nan}, + {nan, math.Inf(-1)}, + {nan, math.Copysign(0, -1)}, + {nan, 0}, + {nan, math.Inf(1)}, + {nan, nan}, + } +) + +var fdimSC = []float64{ + math.NaN(), + 0, + math.NaN(), + 0, + 0, + 0, + 0, + math.Inf(1), + math.NaN(), + math.NaN(), + math.NaN(), + math.NaN(), + math.NaN(), + math.NaN(), + math.NaN(), +} + +var fmaxSC = []float64{ + math.Inf(-1), + math.Inf(1), + math.NaN(), + math.Copysign(0, -1), + 0, + 0, + 0, + math.Inf(1), + math.Inf(1), + math.Inf(1), + math.NaN(), + math.NaN(), + math.NaN(), + math.Inf(1), + math.NaN(), +} + +var fminSC = []float64{ + math.Inf(-1), + math.Inf(-1), + math.Inf(-1), + math.Copysign(0, -1), + math.Copysign(0, -1), + math.Copysign(0, -1), + 0, + math.Inf(-1), + math.Inf(1), + math.NaN(), + math.Inf(-1), + math.NaN(), + math.NaN(), + math.NaN(), + math.NaN(), +} + +var vffmodSC = [][2]float64{ + {math.Inf(-1), math.Inf(-1)}, + {math.Inf(-1), -math.Pi}, + {math.Inf(-1), 0}, + {math.Inf(-1), math.Pi}, + {math.Inf(-1), math.Inf(1)}, + {math.Inf(-1), math.NaN()}, + {-math.Pi, math.Inf(-1)}, + {-math.Pi, 0}, + {-math.Pi, math.Inf(1)}, + {-math.Pi, math.NaN()}, + {math.Copysign(0, -1), math.Inf(-1)}, + {math.Copysign(0, -1), 0}, + {math.Copysign(0, -1), math.Inf(1)}, + {math.Copysign(0, -1), math.NaN()}, + {0, math.Inf(-1)}, + {0, 0}, + {0, math.Inf(1)}, + {0, math.NaN()}, + {math.Pi, math.Inf(-1)}, + {math.Pi, 0}, + {math.Pi, math.Inf(1)}, + {math.Pi, math.NaN()}, + {math.Inf(1), math.Inf(-1)}, + {math.Inf(1), -math.Pi}, + {math.Inf(1), 0}, + {math.Inf(1), math.Pi}, + {math.Inf(1), math.Inf(1)}, + {math.Inf(1), math.NaN()}, + {math.NaN(), math.Inf(-1)}, + {math.NaN(), -math.Pi}, + {math.NaN(), 0}, + {math.NaN(), math.Pi}, + {math.NaN(), math.Inf(1)}, + {math.NaN(), math.NaN()}, +} + +var fmodSC = []float64{ + math.NaN(), // fmod(-Inf, -Inf) + math.NaN(), // fmod(-Inf, -math.Pi) + math.NaN(), // fmod(-Inf, 0) + math.NaN(), // fmod(-Inf, math.Pi) + math.NaN(), // fmod(-Inf, +Inf) + math.NaN(), // fmod(-Inf, NaN) + -math.Pi, // fmod(-math.Pi, -Inf) + math.NaN(), // fmod(-math.Pi, 0) + -math.Pi, // fmod(-math.Pi, +Inf) + math.NaN(), // fmod(-math.Pi, NaN) + math.Copysign(0, -1), // fmod(-0, -Inf) + math.NaN(), // fmod(-0, 0) + math.Copysign(0, -1), // fmod(-0, Inf) + math.NaN(), // fmod(-0, NaN) + 0, // fmod(0, -Inf) + math.NaN(), // fmod(0, 0) + 0, // fmod(0, +Inf) + math.NaN(), // fmod(0, NaN) + math.Pi, // fmod(math.Pi, -Inf) + math.NaN(), // fmod(math.Pi, 0) + math.Pi, // fmod(math.Pi, +Inf) + math.NaN(), // fmod(math.Pi, NaN) + math.NaN(), // fmod(+Inf, -Inf) + math.NaN(), // fmod(+Inf, -math.Pi) + math.NaN(), // fmod(+Inf, 0) + math.NaN(), // fmod(+Inf, math.Pi) + math.NaN(), // fmod(+Inf, +Inf) + math.NaN(), // fmod(+Inf, NaN) + math.NaN(), // fmod(NaN, -Inf) + math.NaN(), // fmod(NaN, -math.Pi) + math.NaN(), // fmod(NaN, 0) + math.NaN(), // fmod(NaN, math.Pi) + math.NaN(), // fmod(NaN, +Inf) + math.NaN(), // fmod(NaN, NaN) +} + +var vffrexpSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var frexpSC = []fi{ + {math.Inf(-1), 0}, + {math.Copysign(0, -1), 0}, + {0, 0}, + {math.Inf(1), 0}, + {math.NaN(), 0}, +} + +var vfgamma = [][2]float64{ + {math.Inf(1), math.Inf(1)}, + {math.Inf(-1), math.NaN()}, + {0, math.Inf(1)}, + {math.Copysign(0, -1), math.Inf(-1)}, + {math.NaN(), math.NaN()}, + {-1, math.NaN()}, + {-2, math.NaN()}, + {-3, math.NaN()}, + {-1e16, math.NaN()}, + {-1e300, math.NaN()}, + {1.7e308, math.Inf(1)}, + + // Test inputs inspired by Python test suite. + // Outputs computed at high precision by PARI/GP. + // If recomputing table entries, be careful to use + // high-precision (%.1000g) formatting of the float64 inputs. + // For example, -2.0000000000000004 is the float64 with exact value + // -2.00000000000000044408920985626161695, and + // gamma(-2.0000000000000004) = -1249999999999999.5386078562728167651513, while + // gamma(-2.00000000000000044408920985626161695) = -1125899906826907.2044875028130093136826. + // Thus the table lists -1.1258999068426235e+15 as the answer. + {0.5, 1.772453850905516}, + {1.5, 0.886226925452758}, + {2.5, 1.329340388179137}, + {3.5, 3.3233509704478426}, + {-0.5, -3.544907701811032}, + {-1.5, 2.363271801207355}, + {-2.5, -0.9453087204829419}, + {-3.5, 0.2700882058522691}, + {0.1, 9.51350769866873}, + {0.01, 99.4325851191506}, + {1e-08, 9.999999942278434e+07}, + {1e-16, 1e+16}, + {0.001, 999.4237724845955}, + {1e-16, 1e+16}, + {1e-308, 1e+308}, + {5.6e-309, 1.7857142857142864e+308}, + {5.5e-309, math.Inf(1)}, + {1e-309, math.Inf(1)}, + {1e-323, math.Inf(1)}, + {5e-324, math.Inf(1)}, + {-0.1, -10.686287021193193}, + {-0.01, -100.58719796441078}, + {-1e-08, -1.0000000057721567e+08}, + {-1e-16, -1e+16}, + {-0.001, -1000.5782056293586}, + {-1e-16, -1e+16}, + {-1e-308, -1e+308}, + {-5.6e-309, -1.7857142857142864e+308}, + {-5.5e-309, math.Inf(-1)}, + {-1e-309, math.Inf(-1)}, + {-1e-323, math.Inf(-1)}, + {-5e-324, math.Inf(-1)}, + {-0.9999999999999999, -9.007199254740992e+15}, + {-1.0000000000000002, 4.5035996273704955e+15}, + {-1.9999999999999998, 2.2517998136852485e+15}, + {-2.0000000000000004, -1.1258999068426235e+15}, + {-100.00000000000001, -7.540083334883109e-145}, + {-99.99999999999999, 7.540083334884096e-145}, + {17, 2.0922789888e+13}, + {171, 7.257415615307999e+306}, + {171.6, 1.5858969096672565e+308}, + {171.624, 1.7942117599248104e+308}, + {171.625, math.Inf(1)}, + {172, math.Inf(1)}, + {2000, math.Inf(1)}, + {-100.5, -3.3536908198076787e-159}, + {-160.5, -5.255546447007829e-286}, + {-170.5, -3.3127395215386074e-308}, + {-171.5, 1.9316265431712e-310}, + {-176.5, -1.196e-321}, + {-177.5, 5e-324}, + {-178.5, math.Copysign(0, -1)}, + {-179.5, 0}, + {-201.0001, 0}, + {-202.9999, math.Copysign(0, -1)}, + {-1000.5, math.Copysign(0, -1)}, + {-1.0000000003e+09, math.Copysign(0, -1)}, + {-4.5035996273704955e+15, 0}, + {-63.349078729022985, 4.177797167776188e-88}, + {-127.45117632943295, 1.183111089623681e-214}, +} + +var vfhypotSC = [][2]float64{ + {math.Inf(-1), math.Inf(-1)}, + {math.Inf(-1), 0}, + {math.Inf(-1), math.Inf(1)}, + {math.Inf(-1), math.NaN()}, + {math.Copysign(0, -1), math.Copysign(0, -1)}, + {math.Copysign(0, -1), 0}, + {0, math.Copysign(0, -1)}, + {0, 0}, // +0, +0 + {0, math.Inf(-1)}, + {0, math.Inf(1)}, + {0, math.NaN()}, + {math.Inf(1), math.Inf(-1)}, + {math.Inf(1), 0}, + {math.Inf(1), math.Inf(1)}, + {math.Inf(1), math.NaN()}, + {math.NaN(), math.Inf(-1)}, + {math.NaN(), 0}, + {math.NaN(), math.Inf(1)}, + {math.NaN(), math.NaN()}, +} + +var hypotSC = []float64{ + math.Inf(1), + math.Inf(1), + math.Inf(1), + math.Inf(1), + 0, + 0, + 0, + 0, + math.Inf(1), + math.Inf(1), + math.NaN(), + math.Inf(1), + math.Inf(1), + math.Inf(1), + math.Inf(1), + math.Inf(1), + math.NaN(), + math.Inf(1), + math.NaN(), +} + +var ilogbSC = []int{ + math.MaxInt32, + math.MinInt32, + math.MaxInt32, + math.MaxInt32, +} + +var vfj0SC = []float64{ + math.Inf(-1), + 0, + math.Inf(1), + math.NaN(), +} + +var j0SC = []float64{ + 0, + 1, + 0, + math.NaN(), +} + +var j1SC = []float64{ + 0, + 0, + 0, + math.NaN(), +} + +var j2SC = []float64{ + 0, + 0, + 0, + math.NaN(), +} + +var jM3SC = []float64{ + 0, + 0, + 0, + math.NaN(), +} + +var vfldexpSC = []fi{ + {0, 0}, + {0, -1075}, + {0, 1024}, + {math.Copysign(0, -1), 0}, + {math.Copysign(0, -1), -1075}, + {math.Copysign(0, -1), 1024}, + {math.Inf(1), 0}, + {math.Inf(1), -1024}, + {math.Inf(-1), 0}, + {math.Inf(-1), -1024}, + {math.NaN(), -1024}, + // XXX: changed to use constant values instead of unsafe.Sizeof(0) + {10, int(1) << (uint64(7) * 8)}, + {10, -(int(1) << (uint64(7) * 8))}, +} + +var ldexpSC = []float64{ + 0, + 0, + 0, + math.Copysign(0, -1), + math.Copysign(0, -1), + math.Copysign(0, -1), + math.Inf(1), + math.Inf(1), + math.Inf(-1), + math.Inf(-1), + math.NaN(), + math.Inf(1), + 0, +} + +var vflgammaSC = []float64{ + math.Inf(-1), + -3, + 0, + 1, + 2, + math.Inf(1), + math.NaN(), +} + +var lgammaSC = []fi{ + {math.Inf(-1), 1}, + {math.Inf(1), 1}, + {math.Inf(1), 1}, + {0, 1}, + {0, 1}, + {math.Inf(1), 1}, + {math.NaN(), 1}, +} + +var vflogSC = []float64{ + math.Inf(-1), + -math.Pi, + math.Copysign(0, -1), + 0, + 1, + math.Inf(1), + math.NaN(), +} + +var logSC = []float64{ + math.NaN(), + math.NaN(), + math.Inf(-1), + math.Inf(-1), + 0, + math.Inf(1), + math.NaN(), +} + +var vflogbSC = []float64{ + math.Inf(-1), + 0, + math.Inf(1), + math.NaN(), +} + +var logbSC = []float64{ + math.Inf(1), + math.Inf(-1), + math.Inf(1), + math.NaN(), +} + +var vflog1pSC = []float64{ + math.Inf(-1), + -math.Pi, + -1, + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), + 4503599627370496.5, // Issue #29488 +} + +var log1pSC = []float64{ + math.NaN(), + math.NaN(), + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), + 36.04365338911715, // Issue #29488 +} + +var vfmodfSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + math.Inf(1), + math.NaN(), +} + +var modfSC = [][2]float64{ + {math.Inf(-1), math.NaN()}, // [2]float64{math.Copysign(0, -1), math.Inf(-1)}, + {math.Copysign(0, -1), math.Copysign(0, -1)}, + {math.Inf(1), math.NaN()}, // [2]float64{0, math.Inf(1)}, + {math.NaN(), math.NaN()}, +} + +var vfnextafter32SC = [][2]float32{ + {0, 0}, + {0, float32(math.Copysign(0, -1))}, + {0, -1}, + {0, float32(math.NaN())}, + {float32(math.Copysign(0, -1)), 1}, + {float32(math.Copysign(0, -1)), 0}, + {float32(math.Copysign(0, -1)), float32(math.Copysign(0, -1))}, + {float32(math.Copysign(0, -1)), -1}, + {float32(math.NaN()), 0}, + {float32(math.NaN()), float32(math.NaN())}, +} + +var nextafter32SC = []float32{ + 0, + 0, + -1.401298464e-45, // math.Float32frombits(0x80000001) + float32(math.NaN()), + 1.401298464e-45, // math.Float32frombits(0x00000001) + float32(math.Copysign(0, -1)), + float32(math.Copysign(0, -1)), + -1.401298464e-45, // math.Float32frombits(0x80000001) + float32(math.NaN()), + float32(math.NaN()), +} + +var vfnextafter64SC = [][2]float64{ + {0, 0}, + {0, math.Copysign(0, -1)}, + {0, -1}, + {0, math.NaN()}, + {math.Copysign(0, -1), 1}, + {math.Copysign(0, -1), 0}, + {math.Copysign(0, -1), math.Copysign(0, -1)}, + {math.Copysign(0, -1), -1}, + {math.NaN(), 0}, + {math.NaN(), math.NaN()}, +} + +var nextafter64SC = []float64{ + 0, + 0, + -4.9406564584124654418e-324, // math.Float64frombits(0x8000000000000001) + math.NaN(), + 4.9406564584124654418e-324, // math.Float64frombits(0x0000000000000001) + math.Copysign(0, -1), + math.Copysign(0, -1), + -4.9406564584124654418e-324, // math.Float64frombits(0x8000000000000001) + math.NaN(), + math.NaN(), +} + +var vfpowSC = [][2]float64{ + {math.Inf(-1), -math.Pi}, + {math.Inf(-1), -3}, + {math.Inf(-1), math.Copysign(0, -1)}, + {math.Inf(-1), 0}, + {math.Inf(-1), 1}, + {math.Inf(-1), 3}, + {math.Inf(-1), math.Pi}, + {math.Inf(-1), 0.5}, + {math.Inf(-1), math.NaN()}, + + {-math.Pi, math.Inf(-1)}, + {-math.Pi, -math.Pi}, + {-math.Pi, math.Copysign(0, -1)}, + {-math.Pi, 0}, + {-math.Pi, 1}, + {-math.Pi, math.Pi}, + {-math.Pi, math.Inf(1)}, + {-math.Pi, math.NaN()}, + + {-1, math.Inf(-1)}, + {-1, math.Inf(1)}, + {-1, math.NaN()}, + {-0.5, math.Inf(-1)}, + {-0.5, math.Inf(1)}, + {math.Copysign(0, -1), math.Inf(-1)}, + {math.Copysign(0, -1), -math.Pi}, + {math.Copysign(0, -1), -0.5}, + {math.Copysign(0, -1), -3}, + {math.Copysign(0, -1), 3}, + {math.Copysign(0, -1), math.Pi}, + {math.Copysign(0, -1), 0.5}, + {math.Copysign(0, -1), math.Inf(1)}, + + {0, math.Inf(-1)}, + {0, -math.Pi}, + {0, -3}, + {0, math.Copysign(0, -1)}, + {0, 0}, + {0, 3}, + {0, math.Pi}, + {0, math.Inf(1)}, + {0, math.NaN()}, + + {0.5, math.Inf(-1)}, + {0.5, math.Inf(1)}, + {1, math.Inf(-1)}, + {1, math.Inf(1)}, + {1, math.NaN()}, + + {math.Pi, math.Inf(-1)}, + {math.Pi, math.Copysign(0, -1)}, + {math.Pi, 0}, + {math.Pi, 1}, + {math.Pi, math.Inf(1)}, + {math.Pi, math.NaN()}, + {math.Inf(1), -math.Pi}, + {math.Inf(1), math.Copysign(0, -1)}, + {math.Inf(1), 0}, + {math.Inf(1), 1}, + {math.Inf(1), math.Pi}, + {math.Inf(1), math.NaN()}, + {math.NaN(), -math.Pi}, + {math.NaN(), math.Copysign(0, -1)}, + {math.NaN(), 0}, + {math.NaN(), 1}, + {math.NaN(), math.Pi}, + {math.NaN(), math.NaN()}, + + // Issue #7394 overflow checks + {2, float64(1 << 32)}, + {2, -float64(1 << 32)}, + {-2, float64(1<<32 + 1)}, + {0.5, float64(1 << 45)}, + {0.5, -float64(1 << 45)}, + // https://github.com/gnolang/gno/issues/1085 + {math.Nextafter(1, 2), float1Shift63}, + {math.Nextafter(1, -2), float1Shift63}, + {math.Nextafter(-1, 2), float1Shift63}, + {math.Nextafter(-1, -2), float1Shift63}, + + // Issue #57465 + {math.Copysign(0, -1), 1e19}, + {math.Copysign(0, -1), -1e19}, + {math.Copysign(0, -1), 1<<53 - 1}, + {math.Copysign(0, -1), -(1<<53 - 1)}, +} + +const float1Shift63 float64 = 1 << 63 + +var powSC = []float64{ + 0, // pow(-Inf, -math.Pi) + math.Copysign(0, -1), // pow(-Inf, -3) + 1, // pow(-Inf, -0) + 1, // pow(-Inf, +0) + math.Inf(-1), // pow(-Inf, 1) + math.Inf(-1), // pow(-Inf, 3) + math.Inf(1), // pow(-Inf, math.Pi) + math.Inf(1), // pow(-Inf, 0.5) + math.NaN(), // pow(-Inf, NaN) + 0, // pow(-math.Pi, -Inf) + math.NaN(), // pow(-math.Pi, -math.Pi) + 1, // pow(-math.Pi, -0) + 1, // pow(-math.Pi, +0) + -math.Pi, // pow(-math.Pi, 1) + math.NaN(), // pow(-math.Pi, math.Pi) + math.Inf(1), // pow(-math.Pi, +Inf) + math.NaN(), // pow(-math.Pi, NaN) + 1, // pow(-1, -Inf) IEEE 754-2008 + 1, // pow(-1, +Inf) IEEE 754-2008 + math.NaN(), // pow(-1, NaN) + math.Inf(1), // pow(-1/2, -Inf) + 0, // pow(-1/2, +Inf) + math.Inf(1), // pow(-0, -Inf) + math.Inf(1), // pow(-0, -math.Pi) + math.Inf(1), // pow(-0, -0.5) + math.Inf(-1), // pow(-0, -3) IEEE 754-2008 + math.Copysign(0, -1), // pow(-0, 3) IEEE 754-2008 + 0, // pow(-0, +math.Pi) + 0, // pow(-0, 0.5) + 0, // pow(-0, +Inf) + math.Inf(1), // pow(+0, -Inf) + math.Inf(1), // pow(+0, -math.Pi) + math.Inf(1), // pow(+0, -3) + 1, // pow(+0, -0) + 1, // pow(+0, +0) + 0, // pow(+0, 3) + 0, // pow(+0, +math.Pi) + 0, // pow(+0, +Inf) + math.NaN(), // pow(+0, NaN) + math.Inf(1), // pow(1/2, -Inf) + 0, // pow(1/2, +Inf) + 1, // pow(1, -Inf) IEEE 754-2008 + 1, // pow(1, +Inf) IEEE 754-2008 + 1, // pow(1, NaN) IEEE 754-2008 + 0, // pow(+math.Pi, -Inf) + 1, // pow(+math.Pi, -0) + 1, // pow(+math.Pi, +0) + math.Pi, // pow(+math.Pi, 1) + math.Inf(1), // pow(+math.Pi, +Inf) + math.NaN(), // pow(+math.Pi, NaN) + 0, // pow(+Inf, -math.Pi) + 1, // pow(+Inf, -0) + 1, // pow(+Inf, +0) + math.Inf(1), // pow(+Inf, 1) + math.Inf(1), // pow(+Inf, math.Pi) + math.NaN(), // pow(+Inf, NaN) + math.NaN(), // pow(NaN, -math.Pi) + 1, // pow(NaN, -0) + 1, // pow(NaN, +0) + math.NaN(), // pow(NaN, 1) + math.NaN(), // pow(NaN, +math.Pi) + math.NaN(), // pow(NaN, NaN) + + // Issue #7394 overflow checks + math.Inf(1), // pow(2, float64(1 << 32)) + 0, // pow(2, -float64(1 << 32)) + math.Inf(-1), // pow(-2, float64(1<<32 + 1)) + 0, // pow(1/2, float64(1 << 45)) + math.Inf(1), // pow(1/2, -float64(1 << 45)) + math.Inf(1), // pow(math.Nextafter(1, 2), float64(1 << 63)) + 0, // pow(math.Nextafter(1, -2), float64(1 << 63)) + 0, // pow(math.Nextafter(-1, 2), float64(1 << 63)) + math.Inf(1), // pow(math.Nextafter(-1, -2), float64(1 << 63)) + + // Issue #57465 + 0, // pow(-0, 1e19) + math.Inf(1), // pow(-0, -1e19) + math.Copysign(0, -1), // pow(-0, 1<<53 -1) + math.Inf(-1), // pow(-0, -(1<<53 -1)) +} + +var vfpow10SC = []int{ + math.MinInt32, + -324, + -323, + -50, + -22, + -1, + 0, + 1, + 22, + 50, + 100, + 200, + 308, + 309, + math.MaxInt32, +} + +var pow10SC = []float64{ + 0, // pow10(math.MinInt32) + 0, // pow10(-324) + 1.0e-323, // pow10(-323) + 1.0e-50, // pow10(-50) + 1.0e-22, // pow10(-22) + 1.0e-1, // pow10(-1) + 1.0e0, // pow10(0) + 1.0e1, // pow10(1) + 1.0e22, // pow10(22) + 1.0e50, // pow10(50) + 1.0e100, // pow10(100) + 1.0e200, // pow10(200) + 1.0e308, // pow10(308) + math.Inf(1), // pow10(309) + math.Inf(1), // pow10(math.MaxInt32) +} + +var vfroundSC = [][2]float64{ + {0, 0}, + {1.390671161567e-309, 0}, // denormal + {0.49999999999999994, 0}, // 0.5-epsilon + {0.5, 1}, + {0.5000000000000001, 1}, // 0.5+epsilon + {-1.5, -2}, + {-2.5, -3}, + {math.NaN(), math.NaN()}, + {math.Inf(1), math.Inf(1)}, + {2251799813685249.5, 2251799813685250}, // 1 bit fraction + {2251799813685250.5, 2251799813685251}, + {4503599627370495.5, 4503599627370496}, // 1 bit fraction, rounding to 0 bit fraction + {4503599627370497, 4503599627370497}, // large integer +} + +var vfroundEvenSC = [][2]float64{ + {0, 0}, + {1.390671161567e-309, 0}, // denormal + {0.49999999999999994, 0}, // 0.5-epsilon + {0.5, 0}, + {0.5000000000000001, 1}, // 0.5+epsilon + {-1.5, -2}, + {-2.5, -2}, + {math.NaN(), math.NaN()}, + {math.Inf(1), math.Inf(1)}, + {2251799813685249.5, 2251799813685250}, // 1 bit fraction + {2251799813685250.5, 2251799813685250}, + {4503599627370495.5, 4503599627370496}, // 1 bit fraction, rounding to 0 bit fraction + {4503599627370497, 4503599627370497}, // large integer +} + +var vfsignbitSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var signbitSC = []bool{ + true, + true, + false, + false, + false, +} + +var vfsinSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var sinSC = []float64{ + math.NaN(), + math.Copysign(0, -1), + 0, + math.NaN(), + math.NaN(), +} + +var vfsinhSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var sinhSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var vfsqrtSC = []float64{ + math.Inf(-1), + -math.Pi, + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), + math.Float64frombits(2), // subnormal; see https://golang.org/issue/13013 +} + +var sqrtSC = []float64{ + math.NaN(), + math.NaN(), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), + 3.1434555694052576e-162, +} + +var vftanhSC = []float64{ + math.Inf(-1), + math.Copysign(0, -1), + 0, + math.Inf(1), + math.NaN(), +} + +var tanhSC = []float64{ + -1, + math.Copysign(0, -1), + 0, + 1, + math.NaN(), +} + +var vfy0SC = []float64{ + math.Inf(-1), + 0, + math.Inf(1), + math.NaN(), + -1, +} + +var y0SC = []float64{ + math.NaN(), + math.Inf(-1), + 0, + math.NaN(), + math.NaN(), +} + +var y1SC = []float64{ + math.NaN(), + math.Inf(-1), + 0, + math.NaN(), + math.NaN(), +} + +var y2SC = []float64{ + math.NaN(), + math.Inf(-1), + 0, + math.NaN(), + math.NaN(), +} + +var yM3SC = []float64{ + math.NaN(), + math.Inf(1), + 0, + math.NaN(), + math.NaN(), +} + +// arguments and expected results for boundary cases +const ( + SmallestNormalFloat64 = 2.2250738585072014e-308 // 2**-1022 + LargestSubnormalFloat64 = SmallestNormalFloat64 - math.SmallestNonzeroFloat64 +) + +var vffrexpBC = []float64{ + SmallestNormalFloat64, + LargestSubnormalFloat64, + math.SmallestNonzeroFloat64, + math.MaxFloat64, + -SmallestNormalFloat64, + -LargestSubnormalFloat64, + -math.SmallestNonzeroFloat64, + -math.MaxFloat64, +} + +var frexpBC = []fi{ + {0.5, -1021}, + {0.99999999999999978, -1022}, + {0.5, -1073}, + {0.99999999999999989, 1024}, + {-0.5, -1021}, + {-0.99999999999999978, -1022}, + {-0.5, -1073}, + {-0.99999999999999989, 1024}, +} + +var vfldexpBC = []fi{ + {SmallestNormalFloat64, -52}, + {LargestSubnormalFloat64, -51}, + {math.SmallestNonzeroFloat64, 1074}, + {math.MaxFloat64, -(1023 + 1074)}, + {1, -1075}, + {-1, -1075}, + {1, 1024}, + {-1, 1024}, + {1.0000000000000002, -1075}, + {1, -1075}, +} + +var ldexpBC = []float64{ + math.SmallestNonzeroFloat64, + 1e-323, // 2**-1073 + 1, + 1e-323, // 2**-1073 + 0, + math.Copysign(0, -1), + math.Inf(1), + math.Inf(-1), + math.SmallestNonzeroFloat64, + 0, +} + +var logbBC = []float64{ + -1022, + -1023, + -1074, + 1023, + -1022, + -1023, + -1074, + 1023, +} + +// Test cases were generated with Berkeley TestFloat-3e/testfloat_gen. +// http://www.jhauser.us/arithmetic/TestFloat.html. +// The default rounding mode is selected (nearest/even), and exception flags are ignored. +var fmaC = []struct{ x, y, z, want float64 }{ + // Large exponent spread + {-3.999999999999087, -1.1123914289620494e-16, -7.999877929687506, -7.999877929687505}, + {-262112.0000004768, -0.06251525855623184, 1.1102230248837136e-16, 16385.99945072085}, + {-6.462348523533467e-27, -2.3763644720331857e-211, 4.000000000931324, 4.000000000931324}, + + // Effective addition + {-2.0000000037252907, 6.7904383376e-313, -3.3951933161e-313, -1.697607001654e-312}, + {-0.12499999999999999, 512.007568359375, -1.4193627164960366e-16, -64.00094604492188}, + {-2.7550648847397148e-39, -3.4028301595800694e+38, 0.9960937495343386, 1.9335955376735676}, + {5.723369164769208e+24, 3.8149300927159385e-06, 1.84489958778182e+19, 4.028324913621874e+19}, + {-0.4843749999990904, -3.6893487872543293e+19, 9.223653786709391e+18, 2.7093936974938993e+19}, + {-3.8146972665201165e-06, 4.2949672959999385e+09, -2.2204460489938386e-16, -16384.000003844263}, + {6.98156394130982e-309, -1.1072962560000002e+09, -4.4414561548793455e-308, -7.73065965765153e-300}, + + // Effective subtraction + {5e-324, 4.5, -2e-323, 0}, + {5e-324, 7, -3.5e-323, 0}, + {5e-324, 0.5000000000000001, -5e-324, math.Copysign(0, -1)}, + {-2.1240680525e-314, -1.233647078189316e+308, -0.25781249999954525, -0.25780987964919844}, + {8.579992955364441e-308, 0.6037391876780558, -4.4501307410480706e-308, 7.29947236107098e-309}, + {-4.450143471986689e-308, -0.9960937499927239, -4.450419332475649e-308, -1.7659233458788e-310}, + {1.4932076393918112, -2.2248022430460833e-308, 4.449875571054211e-308, 1.127783865601762e-308}, + + // Overflow + {-2.288020632214759e+38, -8.98846570988901e+307, 1.7696041796300924e+308, math.Inf(0)}, + {1.4888652783208255e+308, -9.007199254742012e+15, -6.807282911929205e+38, math.Inf(-1)}, + {9.142703268902826e+192, -1.3504889569802838e+296, -1.9082200803806996e-89, math.Inf(-1)}, + + // Finite x and y, but non-finite z. + {31.99218749627471, -1.7976930544991702e+308, math.Inf(0), math.Inf(0)}, + {-1.7976931281784667e+308, -2.0009765625002265, math.Inf(-1), math.Inf(-1)}, + + // Special + {0, 0, 0, 0}, + {math.Copysign(0, -1), 0, 0, 0}, + {0, 0, math.Copysign(0, -1), 0}, + {math.Copysign(0, -1), 0, math.Copysign(0, -1), math.Copysign(0, -1)}, + {-1.1754226043408471e-38, math.NaN(), math.Inf(0), math.NaN()}, + {0, 0, 2.22507385643494e-308, 2.22507385643494e-308}, + {-8.65697792e+09, math.NaN(), -7.516192799999999e+09, math.NaN()}, + {-0.00012207403779029757, 3.221225471996093e+09, math.NaN(), math.NaN()}, + {math.Inf(-1), 0.1252441407414153, -1.387184532981584e-76, math.Inf(-1)}, + {math.Inf(0), 1.525878907671432e-05, -9.214364835452549e+18, math.Inf(0)}, + + // Random + {0.1777916152213626, -32.000015266239636, -2.2204459148334633e-16, -5.689334401293007}, + {-2.0816681711722314e-16, -0.4997558592585846, -0.9465627129124969, -0.9465627129124968}, + {-1.9999997615814211, 1.8518819259933516e+19, 16.874999999999996, -3.703763410463646e+19}, + {-0.12499994039717421, 32767.99999976135, -2.0752587082923246e+19, -2.075258708292325e+19}, + {7.705600568510257e-34, -1.801432979000528e+16, -0.17224197722973714, -0.17224197722973716}, + {3.8988133103758913e-308, -0.9848632812499999, 3.893879244098556e-308, 5.40811742605814e-310}, + {-0.012651981190687427, 6.911985574912436e+38, 6.669240527007144e+18, -8.745031148409496e+36}, + {4.612811918325842e+18, 1.4901161193847641e-08, 2.6077032311277997e-08, 6.873625395187494e+10}, + {-9.094947033611148e-13, 4.450691014249257e-308, 2.086006742350485e-308, 2.086006742346437e-308}, + {-7.751454006381804e-05, 5.588653777189071e-308, -2.2207280111272877e-308, -2.2211612130544025e-308}, + + // Issue #61130 + {-1, 1, 1, 0}, + {1, 1, -1, 0}, +} + +var sqrt32 = []float32{ + 0, + float32(math.Copysign(0, -1)), + float32(math.NaN()), + float32(math.Inf(1)), + float32(math.Inf(-1)), + 1, + 2, + -2, + 4.9790119248836735e+00, + 7.7388724745781045e+00, + -2.7688005719200159e-01, + -5.0106036182710749e+00, +} + +func tolerance(a, b, e float64) bool { + // Multiplying by e here can underflow denormal values to zero. + // Check a==b so that at least if a and b are small and identical + // we say they match. + if a == b { + return true + } + d := a - b + if d < 0 { + d = -d + } + + // note: b is correct (expected) value, a is actual value. + // make error tolerance a fraction of b, not a. + if b != 0 { + e = e * b + if e < 0 { + e = -e + } + } + return d < e +} +func close(a, b float64) bool { return tolerance(a, b, 1e-14) } +func veryclose(a, b float64) bool { return tolerance(a, b, 4e-16) } +func soclose(a, b, e float64) bool { return tolerance(a, b, e) } +func alike(a, b float64) bool { + switch { + case math.IsNaN(a) && math.IsNaN(b): + return true + case a == b: + return math.Signbit(a) == math.Signbit(b) + } + return false +} + +func TestNaN(t *testing.T) { + f64 := math.NaN() + if f64 == f64 { + t.Fatalf("math.NaN() returns %g, expected NaN", f64) + } + f32 := float32(f64) + if f32 == f32 { + t.Fatalf("float32(math.NaN()) is %g, expected NaN", f32) + } +} + +func TestAcos(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := vf[i] / 10 + if f := math.Acos(a); !close(acos[i], f) { + t.Errorf("math.Acos(%g) = %g, want %g", a, f, acos[i]) + } + } + for i := 0; i < len(vfacosSC); i++ { + if f := math.Acos(vfacosSC[i]); !alike(acosSC[i], f) { + t.Errorf("math.Acos(%g) = %g, want %g", vfacosSC[i], f, acosSC[i]) + } + } +} + +func TestAcosh(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := 1 + math.Abs(vf[i]) + if f := math.Acosh(a); !veryclose(acosh[i], f) { + t.Errorf("math.Acosh(%g) = %g, want %g", a, f, acosh[i]) + } + } + for i := 0; i < len(vfacoshSC); i++ { + if f := math.Acosh(vfacoshSC[i]); !alike(acoshSC[i], f) { + t.Errorf("math.Acosh(%g) = %g, want %g", vfacoshSC[i], f, acoshSC[i]) + } + } +} + +func TestAsin(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := vf[i] / 10 + if f := math.Asin(a); !veryclose(asin[i], f) { + t.Errorf("math.Asin(%g) = %g, want %g", a, f, asin[i]) + } + } + for i := 0; i < len(vfasinSC); i++ { + if f := math.Asin(vfasinSC[i]); !alike(asinSC[i], f) { + t.Errorf("math.Asin(%g) = %g, want %g", vfasinSC[i], f, asinSC[i]) + } + } +} + +func TestAsinh(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Asinh(vf[i]); !veryclose(asinh[i], f) { + t.Errorf("math.Asinh(%g) = %g, want %g", vf[i], f, asinh[i]) + } + } + for i := 0; i < len(vfasinhSC); i++ { + if f := math.Asinh(vfasinhSC[i]); !alike(asinhSC[i], f) { + t.Errorf("math.Asinh(%g) = %g, want %g", vfasinhSC[i], f, asinhSC[i]) + } + } +} + +func TestAtan(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Atan(vf[i]); !veryclose(atan[i], f) { + t.Errorf("math.Atan(%g) = %g, want %g", vf[i], f, atan[i]) + } + } + for i := 0; i < len(vfatanSC); i++ { + if f := math.Atan(vfatanSC[i]); !alike(atanSC[i], f) { + t.Errorf("math.Atan(%g) = %g, want %g", vfatanSC[i], f, atanSC[i]) + } + } +} + +func TestAtanh(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := vf[i] / 10 + if f := math.Atanh(a); !veryclose(atanh[i], f) { + t.Errorf("math.Atanh(%g) = %g, want %g", a, f, atanh[i]) + } + } + for i := 0; i < len(vfatanhSC); i++ { + if f := math.Atanh(vfatanhSC[i]); !alike(atanhSC[i], f) { + t.Errorf("math.Atanh(%g) = %g, want %g", vfatanhSC[i], f, atanhSC[i]) + } + } +} + +func TestAtan2(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Atan2(10, vf[i]); !veryclose(atan2[i], f) { + t.Errorf("math.Atan2(10, %g) = %g, want %g", vf[i], f, atan2[i]) + } + } + for i := 0; i < len(vfatan2SC); i++ { + if f := math.Atan2(vfatan2SC[i][0], vfatan2SC[i][1]); !alike(atan2SC[i], f) { + t.Errorf("math.Atan2(%g, %g) = %g, want %g", vfatan2SC[i][0], vfatan2SC[i][1], f, atan2SC[i]) + } + } +} + +func TestCbrt(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Cbrt(vf[i]); !veryclose(cbrt[i], f) { + t.Errorf("math.Cbrt(%g) = %g, want %g", vf[i], f, cbrt[i]) + } + } + for i := 0; i < len(vfcbrtSC); i++ { + if f := math.Cbrt(vfcbrtSC[i]); !alike(cbrtSC[i], f) { + t.Errorf("math.Cbrt(%g) = %g, want %g", vfcbrtSC[i], f, cbrtSC[i]) + } + } +} + +func TestCeil(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Ceil(vf[i]); !alike(ceil[i], f) { + t.Errorf("math.Ceil(%g) = %g, want %g", vf[i], f, ceil[i]) + } + } + for i := 0; i < len(vfceilSC); i++ { + if f := math.Ceil(vfceilSC[i]); !alike(ceilSC[i], f) { + t.Errorf("math.Ceil(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) + } + } +} + +func TestCopysign(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Copysign(vf[i], -1); copysign[i] != f { + t.Errorf("math.Copysign(%g, -1) = %g, want %g", vf[i], f, copysign[i]) + } + } + for i := 0; i < len(vf); i++ { + if f := math.Copysign(vf[i], 1); -copysign[i] != f { + t.Errorf("math.Copysign(%g, 1) = %g, want %g", vf[i], f, -copysign[i]) + } + } + for i := 0; i < len(vfcopysignSC); i++ { + if f := math.Copysign(vfcopysignSC[i], -1); !alike(copysignSC[i], f) { + t.Errorf("math.Copysign(%g, -1) = %g, want %g", vfcopysignSC[i], f, copysignSC[i]) + } + } +} + +func TestCos(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Cos(vf[i]); !veryclose(cos[i], f) { + t.Errorf("math.Cos(%g) = %g, want %g", vf[i], f, cos[i]) + } + } + for i := 0; i < len(vfcosSC); i++ { + if f := math.Cos(vfcosSC[i]); !alike(cosSC[i], f) { + t.Errorf("math.Cos(%g) = %g, want %g", vfcosSC[i], f, cosSC[i]) + } + } +} + +func TestCosh(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Cosh(vf[i]); !close(cosh[i], f) { + t.Errorf("math.Cosh(%g) = %g, want %g", vf[i], f, cosh[i]) + } + } + for i := 0; i < len(vfcoshSC); i++ { + if f := math.Cosh(vfcoshSC[i]); !alike(coshSC[i], f) { + t.Errorf("math.Cosh(%g) = %g, want %g", vfcoshSC[i], f, coshSC[i]) + } + } +} + +func TestErf(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := vf[i] / 10 + if f := math.Erf(a); !veryclose(erf[i], f) { + t.Errorf("math.Erf(%g) = %g, want %g", a, f, erf[i]) + } + } + for i := 0; i < len(vferfSC); i++ { + if f := math.Erf(vferfSC[i]); !alike(erfSC[i], f) { + t.Errorf("math.Erf(%g) = %g, want %g", vferfSC[i], f, erfSC[i]) + } + } +} + +func TestErfc(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := vf[i] / 10 + if f := math.Erfc(a); !veryclose(erfc[i], f) { + t.Errorf("math.Erfc(%g) = %g, want %g", a, f, erfc[i]) + } + } + for i := 0; i < len(vferfcSC); i++ { + if f := math.Erfc(vferfcSC[i]); !alike(erfcSC[i], f) { + t.Errorf("math.Erfc(%g) = %g, want %g", vferfcSC[i], f, erfcSC[i]) + } + } +} + +func TestErfinv(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := vf[i] / 10 + if f := math.Erfinv(a); !veryclose(erfinv[i], f) { + t.Errorf("math.Erfinv(%g) = %g, want %g", a, f, erfinv[i]) + } + } + for i := 0; i < len(vferfinvSC); i++ { + if f := math.Erfinv(vferfinvSC[i]); !alike(erfinvSC[i], f) { + t.Errorf("math.Erfinv(%g) = %g, want %g", vferfinvSC[i], f, erfinvSC[i]) + } + } + for x := -0.9; x <= 0.90; x += 1e-2 { + if f := math.Erf(math.Erfinv(x)); !close(x, f) { + t.Errorf("math.Erf(math.Erfinv(%g)) = %g, want %g", x, f, x) + } + } + for x := -0.9; x <= 0.90; x += 1e-2 { + if f := math.Erfinv(math.Erf(x)); !close(x, f) { + t.Errorf("math.Erfinv(math.Erf(%g)) = %g, want %g", x, f, x) + } + } +} + +func TestErfcinv(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := 1.0 - (vf[i] / 10) + if f := math.Erfcinv(a); !veryclose(erfinv[i], f) { + t.Errorf("math.Erfcinv(%g) = %g, want %g", a, f, erfinv[i]) + } + } + for i := 0; i < len(vferfcinvSC); i++ { + if f := math.Erfcinv(vferfcinvSC[i]); !alike(erfcinvSC[i], f) { + t.Errorf("math.Erfcinv(%g) = %g, want %g", vferfcinvSC[i], f, erfcinvSC[i]) + } + } + for x := 0.1; x <= 1.9; x += 1e-2 { + if f := math.Erfc(math.Erfcinv(x)); !close(x, f) { + t.Errorf("math.Erfc(math.Erfcinv(%g)) = %g, want %g", x, f, x) + } + } + for x := 0.1; x <= 1.9; x += 1e-2 { + if f := math.Erfcinv(math.Erfc(x)); !close(x, f) { + t.Errorf("math.Erfcinv(math.Erfc(%g)) = %g, want %g", x, f, x) + } + } +} + +func TestExp(t *testing.T) { + testExp(t, math.Exp, "Exp") + testExp(t, math.ExpGo, "ExpGo") +} + +func testExp(t *testing.T, Exp func(float64) float64, name string) { + for i := 0; i < len(vf); i++ { + if f := math.Exp(vf[i]); !veryclose(exp[i], f) { + t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp[i]) + } + } + for i := 0; i < len(vfexpSC); i++ { + if f := math.Exp(vfexpSC[i]); !alike(expSC[i], f) { + t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i]) + } + } +} + +func TestExpm1(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := vf[i] / 100 + if f := math.Expm1(a); !veryclose(expm1[i], f) { + t.Errorf("math.Expm1(%g) = %g, want %g", a, f, expm1[i]) + } + } + for i := 0; i < len(vf); i++ { + a := vf[i] * 10 + if f := math.Expm1(a); !close(expm1Large[i], f) { + t.Errorf("math.Expm1(%g) = %g, want %g", a, f, expm1Large[i]) + } + } + for i := 0; i < len(vfexpm1SC); i++ { + if f := math.Expm1(vfexpm1SC[i]); !alike(expm1SC[i], f) { + t.Errorf("math.Expm1(%g) = %g, want %g", vfexpm1SC[i], f, expm1SC[i]) + } + } +} + +func TestExp2(t *testing.T) { + testExp2(t, math.Exp2, "Exp2") + testExp2(t, math.Exp2Go, "Exp2Go") +} + +func testExp2(t *testing.T, Exp2 func(float64) float64, name string) { + for i := 0; i < len(vf); i++ { + if f := math.Exp2(vf[i]); !close(exp2[i], f) { + t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp2[i]) + } + } + for i := 0; i < len(vfexp2SC); i++ { + if f := math.Exp2(vfexp2SC[i]); !alike(exp2SC[i], f) { + t.Errorf("%s(%g) = %g, want %g", name, vfexp2SC[i], f, exp2SC[i]) + } + } + for n := -1074; n < 1024; n++ { + f := math.Exp2(float64(n)) + vf := math.Ldexp(1, n) + if f != vf { + t.Errorf("%s(%d) = %g, want %g", name, n, f, vf) + } + } +} + +func TestAbs(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Abs(vf[i]); fabs[i] != f { + t.Errorf("math.Abs(%g) = %g, want %g", vf[i], f, fabs[i]) + } + } + for i := 0; i < len(vffabsSC); i++ { + if f := math.Abs(vffabsSC[i]); !alike(fabsSC[i], f) { + t.Errorf("math.Abs(%g) = %g, want %g", vffabsSC[i], f, fabsSC[i]) + } + } +} + +func TestDim(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Dim(vf[i], 0); fdim[i] != f { + t.Errorf("math.Dim(%g, %g) = %g, want %g", vf[i], 0.0, f, fdim[i]) + } + } + for i := 0; i < len(vffdimSC); i++ { + if f := math.Dim(vffdimSC[i][0], vffdimSC[i][1]); !alike(fdimSC[i], f) { + t.Errorf("math.Dim(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fdimSC[i]) + } + } + for i := 0; i < len(vffdim2SC); i++ { + if f := math.Dim(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fdimSC[i], f) { + t.Errorf("math.Dim(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fdimSC[i]) + } + } +} + +func TestFloor(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Floor(vf[i]); !alike(floor[i], f) { + t.Errorf("math.Floor(%g) = %g, want %g", vf[i], f, floor[i]) + } + } + for i := 0; i < len(vfceilSC); i++ { + if f := math.Floor(vfceilSC[i]); !alike(ceilSC[i], f) { + t.Errorf("math.Floor(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) + } + } +} + +func TestMax(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Max(vf[i], ceil[i]); ceil[i] != f { + t.Errorf("math.Max(%g, %g) = %g, want %g", vf[i], ceil[i], f, ceil[i]) + } + } + for i := 0; i < len(vffdimSC); i++ { + if f := math.Max(vffdimSC[i][0], vffdimSC[i][1]); !alike(fmaxSC[i], f) { + t.Errorf("math.Max(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fmaxSC[i]) + } + } + for i := 0; i < len(vffdim2SC); i++ { + if f := math.Max(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fmaxSC[i], f) { + t.Errorf("math.Max(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fmaxSC[i]) + } + } +} + +func TestMin(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Min(vf[i], floor[i]); floor[i] != f { + t.Errorf("math.Min(%g, %g) = %g, want %g", vf[i], floor[i], f, floor[i]) + } + } + for i := 0; i < len(vffdimSC); i++ { + if f := math.Min(vffdimSC[i][0], vffdimSC[i][1]); !alike(fminSC[i], f) { + t.Errorf("math.Min(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fminSC[i]) + } + } + for i := 0; i < len(vffdim2SC); i++ { + if f := math.Min(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fminSC[i], f) { + t.Errorf("math.Min(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fminSC[i]) + } + } +} + +func TestMod(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Mod(10, vf[i]); fmod[i] != f { + t.Errorf("math.Mod(10, %g) = %g, want %g", vf[i], f, fmod[i]) + } + } + for i := 0; i < len(vffmodSC); i++ { + if f := math.Mod(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) { + t.Errorf("math.Mod(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i]) + } + } + // verify precision of result for extreme inputs + if f := math.Mod(5.9790119248836734e+200, 1.1258465975523544); 0.6447968302508578 != f { + t.Errorf("math.Remainder(5.9790119248836734e+200, 1.1258465975523544) = %g, want 0.6447968302508578", f) + } +} + +func TestFrexp(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f, j := math.Frexp(vf[i]); !veryclose(frexp[i].f, f) || frexp[i].i != j { + t.Errorf("math.Frexp(%g) = %g, %d, want %g, %d", vf[i], f, j, frexp[i].f, frexp[i].i) + } + } + for i := 0; i < len(vffrexpSC); i++ { + if f, j := math.Frexp(vffrexpSC[i]); !alike(frexpSC[i].f, f) || frexpSC[i].i != j { + t.Errorf("math.Frexp(%g) = %g, %d, want %g, %d", vffrexpSC[i], f, j, frexpSC[i].f, frexpSC[i].i) + } + } + for i := 0; i < len(vffrexpBC); i++ { + if f, j := math.Frexp(vffrexpBC[i]); !alike(frexpBC[i].f, f) || frexpBC[i].i != j { + t.Errorf("math.Frexp(%g) = %g, %d, want %g, %d", vffrexpBC[i], f, j, frexpBC[i].f, frexpBC[i].i) + } + } +} + +func TestGamma(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Gamma(vf[i]); !close(gamma[i], f) { + t.Errorf("math.Gamma(%g) = %g, want %g", vf[i], f, gamma[i]) + } + } + for _, g := range vfgamma { + f := math.Gamma(g[0]) + var ok bool + if math.IsNaN(g[1]) || math.IsInf(g[1], 0) || g[1] == 0 || f == 0 { + ok = alike(g[1], f) + } else if g[0] > -50 && g[0] <= 171 { + ok = veryclose(g[1], f) + } else { + ok = close(g[1], f) + } + if !ok { + t.Errorf("math.Gamma(%g) = %g, want %g", g[0], f, g[1]) + } + } +} + +func TestHypot(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(1e200 * tanh[i] * math.Sqrt(2)) + if f := math.Hypot(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) { + t.Errorf("math.Hypot(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a) + } + } + for i := 0; i < len(vfhypotSC); i++ { + if f := math.Hypot(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) { + t.Errorf("math.Hypot(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i]) + } + } +} + +func TestHypotGo(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(1e200 * tanh[i] * math.Sqrt(2)) + if f := math.HypotGo(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) { + t.Errorf("math.HypotGo(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a) + } + } + for i := 0; i < len(vfhypotSC); i++ { + if f := math.HypotGo(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) { + t.Errorf("math.HypotGo(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i]) + } + } +} + +func TestIlogb(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := frexp[i].i - 1 // adjust because fr in the interval [½, 1) + if e := math.Ilogb(vf[i]); a != e { + t.Errorf("math.Ilogb(%g) = %d, want %d", vf[i], e, a) + } + } + for i := 0; i < len(vflogbSC); i++ { + if e := math.Ilogb(vflogbSC[i]); ilogbSC[i] != e { + t.Errorf("math.Ilogb(%g) = %d, want %d", vflogbSC[i], e, ilogbSC[i]) + } + } + for i := 0; i < len(vffrexpBC); i++ { + if e := math.Ilogb(vffrexpBC[i]); int(logbBC[i]) != e { + t.Errorf("math.Ilogb(%g) = %d, want %d", vffrexpBC[i], e, int(logbBC[i])) + } + } +} + +func TestJ0(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.J0(vf[i]); !soclose(j0[i], f, 4e-14) { + t.Errorf("math.J0(%g) = %g, want %g", vf[i], f, j0[i]) + } + } + for i := 0; i < len(vfj0SC); i++ { + if f := math.J0(vfj0SC[i]); !alike(j0SC[i], f) { + t.Errorf("math.J0(%g) = %g, want %g", vfj0SC[i], f, j0SC[i]) + } + } +} + +func TestJ1(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.J1(vf[i]); !close(j1[i], f) { + t.Errorf("math.J1(%g) = %g, want %g", vf[i], f, j1[i]) + } + } + for i := 0; i < len(vfj0SC); i++ { + if f := math.J1(vfj0SC[i]); !alike(j1SC[i], f) { + t.Errorf("math.J1(%g) = %g, want %g", vfj0SC[i], f, j1SC[i]) + } + } +} + +func TestJn(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Jn(2, vf[i]); !close(j2[i], f) { + t.Errorf("math.Jn(2, %g) = %g, want %g", vf[i], f, j2[i]) + } + if f := math.Jn(-3, vf[i]); !close(jM3[i], f) { + t.Errorf("math.Jn(-3, %g) = %g, want %g", vf[i], f, jM3[i]) + } + } + for i := 0; i < len(vfj0SC); i++ { + if f := math.Jn(2, vfj0SC[i]); !alike(j2SC[i], f) { + t.Errorf("math.Jn(2, %g) = %g, want %g", vfj0SC[i], f, j2SC[i]) + } + if f := math.Jn(-3, vfj0SC[i]); !alike(jM3SC[i], f) { + t.Errorf("math.Jn(-3, %g) = %g, want %g", vfj0SC[i], f, jM3SC[i]) + } + } +} + +func TestLdexp(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Ldexp(frexp[i].f, frexp[i].i); !veryclose(vf[i], f) { + t.Errorf("math.Ldexp(%g, %d) = %g, want %g", frexp[i].f, frexp[i].i, f, vf[i]) + } + } + for i := 0; i < len(vffrexpSC); i++ { + if f := math.Ldexp(frexpSC[i].f, frexpSC[i].i); !alike(vffrexpSC[i], f) { + t.Errorf("math.Ldexp(%g, %d) = %g, want %g", frexpSC[i].f, frexpSC[i].i, f, vffrexpSC[i]) + } + } + for i := 0; i < len(vfldexpSC); i++ { + if f := math.Ldexp(vfldexpSC[i].f, vfldexpSC[i].i); !alike(ldexpSC[i], f) { + t.Errorf("math.Ldexp(%g, %d) = %g, want %g", vfldexpSC[i].f, vfldexpSC[i].i, f, ldexpSC[i]) + } + } + for i := 0; i < len(vffrexpBC); i++ { + if f := math.Ldexp(frexpBC[i].f, frexpBC[i].i); !alike(vffrexpBC[i], f) { + t.Errorf("math.Ldexp(%g, %d) = %g, want %g", frexpBC[i].f, frexpBC[i].i, f, vffrexpBC[i]) + } + } + for i := 0; i < len(vfldexpBC); i++ { + if f := math.Ldexp(vfldexpBC[i].f, vfldexpBC[i].i); !alike(ldexpBC[i], f) { + t.Errorf("math.Ldexp(%g, %d) = %g, want %g", vfldexpBC[i].f, vfldexpBC[i].i, f, ldexpBC[i]) + } + } +} + +func TestLgamma(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f, s := math.Lgamma(vf[i]); !close(lgamma[i].f, f) || lgamma[i].i != s { + t.Errorf("math.Lgamma(%g) = %g, %d, want %g, %d", vf[i], f, s, lgamma[i].f, lgamma[i].i) + } + } + for i := 0; i < len(vflgammaSC); i++ { + if f, s := math.Lgamma(vflgammaSC[i]); !alike(lgammaSC[i].f, f) || lgammaSC[i].i != s { + t.Errorf("math.Lgamma(%g) = %g, %d, want %g, %d", vflgammaSC[i], f, s, lgammaSC[i].f, lgammaSC[i].i) + } + } +} + +func TestLog(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(vf[i]) + if f := math.Log(a); log[i] != f { + t.Errorf("math.Log(%g) = %g, want %g", a, f, log[i]) + } + } + if f := math.Log(10); f != math.Ln10 { + t.Errorf("math.Log(%g) = %g, want %g", 10.0, f, math.Ln10) + } + for i := 0; i < len(vflogSC); i++ { + if f := math.Log(vflogSC[i]); !alike(logSC[i], f) { + t.Errorf("math.Log(%g) = %g, want %g", vflogSC[i], f, logSC[i]) + } + } +} + +func TestLogb(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Logb(vf[i]); logb[i] != f { + t.Errorf("math.Logb(%g) = %g, want %g", vf[i], f, logb[i]) + } + } + for i := 0; i < len(vflogbSC); i++ { + if f := math.Logb(vflogbSC[i]); !alike(logbSC[i], f) { + t.Errorf("math.Logb(%g) = %g, want %g", vflogbSC[i], f, logbSC[i]) + } + } + for i := 0; i < len(vffrexpBC); i++ { + if f := math.Logb(vffrexpBC[i]); !alike(logbBC[i], f) { + t.Errorf("math.Logb(%g) = %g, want %g", vffrexpBC[i], f, logbBC[i]) + } + } +} + +func TestLog10(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(vf[i]) + if f := math.Log10(a); !veryclose(log10[i], f) { + t.Errorf("math.Log10(%g) = %g, want %g", a, f, log10[i]) + } + } + if f := math.Log10(math.E); f != math.Log10E { + t.Errorf("math.Log10(%g) = %g, want %g", math.E, f, math.Log10E) + } + for i := 0; i < len(vflogSC); i++ { + if f := math.Log10(vflogSC[i]); !alike(logSC[i], f) { + t.Errorf("math.Log10(%g) = %g, want %g", vflogSC[i], f, logSC[i]) + } + } +} + +func TestLog1p(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := vf[i] / 100 + if f := math.Log1p(a); !veryclose(log1p[i], f) { + t.Errorf("math.Log1p(%g) = %g, want %g", a, f, log1p[i]) + } + } + a := 9.0 + if f := math.Log1p(a); f != math.Ln10 { + t.Errorf("math.Log1p(%g) = %g, want %g", a, f, math.Ln10) + } + for i := 0; i < len(vflogSC); i++ { + if f := math.Log1p(vflog1pSC[i]); !alike(log1pSC[i], f) { + t.Errorf("math.Log1p(%g) = %g, want %g", vflog1pSC[i], f, log1pSC[i]) + } + } +} + +func TestLog2(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(vf[i]) + if f := math.Log2(a); !veryclose(log2[i], f) { + t.Errorf("math.Log2(%g) = %g, want %g", a, f, log2[i]) + } + } + if f := math.Log2(math.E); f != math.Log2E { + t.Errorf("math.Log2(%g) = %g, want %g", math.E, f, math.Log2E) + } + for i := 0; i < len(vflogSC); i++ { + if f := math.Log2(vflogSC[i]); !alike(logSC[i], f) { + t.Errorf("math.Log2(%g) = %g, want %g", vflogSC[i], f, logSC[i]) + } + } + for i := -1074; i <= 1023; i++ { + f := math.Ldexp(1, i) + l := math.Log2(f) + if l != float64(i) { + t.Errorf("math.Log2(2**%d) = %g, want %d", i, l, i) + } + } +} + +func TestModf(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f, g := math.Modf(vf[i]); !veryclose(modf[i][0], f) || !veryclose(modf[i][1], g) { + t.Errorf("math.Modf(%g) = %g, %g, want %g, %g", vf[i], f, g, modf[i][0], modf[i][1]) + } + } + for i := 0; i < len(vfmodfSC); i++ { + if f, g := math.Modf(vfmodfSC[i]); !alike(modfSC[i][0], f) || !alike(modfSC[i][1], g) { + t.Errorf("math.Modf(%g) = %g, %g, want %g, %g", vfmodfSC[i], f, g, modfSC[i][0], modfSC[i][1]) + } + } +} + +func TestNextafter32(t *testing.T) { + for i := 0; i < len(vf); i++ { + vfi := float32(vf[i]) + if f := math.Nextafter32(vfi, 10); nextafter32[i] != f { + t.Errorf("math.Nextafter32(%g, %g) = %g want %g", vfi, 10.0, f, nextafter32[i]) + } + } + for i := 0; i < len(vfnextafter32SC); i++ { + if f := math.Nextafter32(vfnextafter32SC[i][0], vfnextafter32SC[i][1]); !alike(float64(nextafter32SC[i]), float64(f)) { + t.Errorf("math.Nextafter32(%g, %g) = %g want %g", vfnextafter32SC[i][0], vfnextafter32SC[i][1], f, nextafter32SC[i]) + } + } +} + +func TestNextafter64(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Nextafter(vf[i], 10); nextafter64[i] != f { + t.Errorf("math.Nextafter64(%g, %g) = %g want %g", vf[i], 10.0, f, nextafter64[i]) + } + } + for i := 0; i < len(vfnextafter64SC); i++ { + if f := math.Nextafter(vfnextafter64SC[i][0], vfnextafter64SC[i][1]); !alike(nextafter64SC[i], f) { + t.Errorf("math.Nextafter64(%g, %g) = %g want %g", vfnextafter64SC[i][0], vfnextafter64SC[i][1], f, nextafter64SC[i]) + } + } +} + +func TestPow(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Pow(10, vf[i]); !close(pow[i], f) { + t.Errorf("math.Pow(10, %g) = %g, want %g", vf[i], f, pow[i]) + } + } + for i := 0; i < len(vfpowSC); i++ { + if f := math.Pow(vfpowSC[i][0], vfpowSC[i][1]); !alike(powSC[i], f) { + t.Errorf("math.Pow(%g, %g) = %g, want %g", vfpowSC[i][0], vfpowSC[i][1], f, powSC[i]) + } + } +} + +func TestPow10(t *testing.T) { + for i := 0; i < len(vfpow10SC); i++ { + if f := math.Pow10(vfpow10SC[i]); !alike(pow10SC[i], f) { + t.Errorf("math.Pow10(%d) = %g, want %g", vfpow10SC[i], f, pow10SC[i]) + } + } +} + +func TestRemainder(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Remainder(10, vf[i]); remainder[i] != f { + t.Errorf("math.Remainder(10, %g) = %g, want %g", vf[i], f, remainder[i]) + } + } + for i := 0; i < len(vffmodSC); i++ { + if f := math.Remainder(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) { + t.Errorf("math.Remainder(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i]) + } + } + // verify precision of result for extreme inputs + if f := math.Remainder(5.9790119248836734e+200, 1.1258465975523544); -0.4810497673014966 != f { + t.Errorf("math.Remainder(5.9790119248836734e+200, 1.1258465975523544) = %g, want -0.4810497673014966", f) + } + // verify that sign is correct when r == 0. + test := func(x, y float64) { + if r := math.Remainder(x, y); r == 0 && math.Signbit(r) != math.Signbit(x) { + t.Errorf("math.Remainder(x=%f, y=%f) = %f, sign of (zero) result should agree with sign of x", x, y, r) + } + } + for x := 0.0; x <= 3.0; x += 1 { + for y := 1.0; y <= 3.0; y += 1 { + test(x, y) + test(x, -y) + test(-x, y) + test(-x, -y) + } + } +} + +func TestRound(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Round(vf[i]); !alike(round[i], f) { + t.Errorf("math.Round(%g) = %g, want %g", vf[i], f, round[i]) + } + } + for i := 0; i < len(vfroundSC); i++ { + if f := math.Round(vfroundSC[i][0]); !alike(vfroundSC[i][1], f) { + t.Errorf("math.Round(%g) = %g, want %g", vfroundSC[i][0], f, vfroundSC[i][1]) + } + } +} + +func TestRoundToEven(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.RoundToEven(vf[i]); !alike(round[i], f) { + t.Errorf("math.RoundToEven(%g) = %g, want %g", vf[i], f, round[i]) + } + } + for i := 0; i < len(vfroundEvenSC); i++ { + if f := math.RoundToEven(vfroundEvenSC[i][0]); !alike(vfroundEvenSC[i][1], f) { + t.Errorf("math.RoundToEven(%g) = %g, want %g", vfroundEvenSC[i][0], f, vfroundEvenSC[i][1]) + } + } +} + +func TestSignbit(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Signbit(vf[i]); signbit[i] != f { + t.Errorf("math.Signbit(%g) = %t, want %t", vf[i], f, signbit[i]) + } + } + for i := 0; i < len(vfsignbitSC); i++ { + if f := math.Signbit(vfsignbitSC[i]); signbitSC[i] != f { + t.Errorf("math.Signbit(%g) = %t, want %t", vfsignbitSC[i], f, signbitSC[i]) + } + } +} + +func TestSin(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Sin(vf[i]); !veryclose(sin[i], f) { + t.Errorf("math.Sin(%g) = %g, want %g", vf[i], f, sin[i]) + } + } + for i := 0; i < len(vfsinSC); i++ { + if f := math.Sin(vfsinSC[i]); !alike(sinSC[i], f) { + t.Errorf("math.Sin(%g) = %g, want %g", vfsinSC[i], f, sinSC[i]) + } + } +} + +func TestSincos(t *testing.T) { + for i := 0; i < len(vf); i++ { + if s, c := math.Sincos(vf[i]); !veryclose(sin[i], s) || !veryclose(cos[i], c) { + t.Errorf("math.Sincos(%g) = %g, %g want %g, %g", vf[i], s, c, sin[i], cos[i]) + } + } +} + +func TestSinh(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Sinh(vf[i]); !close(sinh[i], f) { + t.Errorf("math.Sinh(%g) = %g, want %g", vf[i], f, sinh[i]) + } + } + for i := 0; i < len(vfsinhSC); i++ { + if f := math.Sinh(vfsinhSC[i]); !alike(sinhSC[i], f) { + t.Errorf("math.Sinh(%g) = %g, want %g", vfsinhSC[i], f, sinhSC[i]) + } + } +} + +func TestSqrt(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(vf[i]) + if f := math.SqrtGo(a); sqrt[i] != f { + t.Errorf("math.SqrtGo(%g) = %g, want %g", a, f, sqrt[i]) + } + a = math.Abs(vf[i]) + if f := math.Sqrt(a); sqrt[i] != f { + t.Errorf("math.Sqrt(%g) = %g, want %g", a, f, sqrt[i]) + } + } + for i := 0; i < len(vfsqrtSC); i++ { + if f := math.SqrtGo(vfsqrtSC[i]); !alike(sqrtSC[i], f) { + t.Errorf("math.SqrtGo(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i]) + } + if f := math.Sqrt(vfsqrtSC[i]); !alike(sqrtSC[i], f) { + t.Errorf("math.Sqrt(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i]) + } + } +} + +func TestTan(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Tan(vf[i]); !veryclose(tan[i], f) { + t.Errorf("math.Tan(%g) = %g, want %g", vf[i], f, tan[i]) + } + } + // same special cases as Sin + for i := 0; i < len(vfsinSC); i++ { + if f := math.Tan(vfsinSC[i]); !alike(sinSC[i], f) { + t.Errorf("math.Tan(%g) = %g, want %g", vfsinSC[i], f, sinSC[i]) + } + } +} + +func TestTanh(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Tanh(vf[i]); !veryclose(tanh[i], f) { + t.Errorf("math.Tanh(%g) = %g, want %g", vf[i], f, tanh[i]) + } + } + for i := 0; i < len(vftanhSC); i++ { + if f := math.Tanh(vftanhSC[i]); !alike(tanhSC[i], f) { + t.Errorf("math.Tanh(%g) = %g, want %g", vftanhSC[i], f, tanhSC[i]) + } + } +} + +func TestTrunc(t *testing.T) { + for i := 0; i < len(vf); i++ { + if f := math.Trunc(vf[i]); !alike(trunc[i], f) { + t.Errorf("math.Trunc(%g) = %g, want %g", vf[i], f, trunc[i]) + } + } + for i := 0; i < len(vfceilSC); i++ { + if f := math.Trunc(vfceilSC[i]); !alike(ceilSC[i], f) { + t.Errorf("math.Trunc(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) + } + } +} + +func TestY0(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(vf[i]) + if f := math.Y0(a); !close(y0[i], f) { + t.Errorf("math.Y0(%g) = %g, want %g", a, f, y0[i]) + } + } + for i := 0; i < len(vfy0SC); i++ { + if f := math.Y0(vfy0SC[i]); !alike(y0SC[i], f) { + t.Errorf("math.Y0(%g) = %g, want %g", vfy0SC[i], f, y0SC[i]) + } + } +} + +func TestY1(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(vf[i]) + if f := math.Y1(a); !soclose(y1[i], f, 2e-14) { + t.Errorf("math.Y1(%g) = %g, want %g", a, f, y1[i]) + } + } + for i := 0; i < len(vfy0SC); i++ { + if f := math.Y1(vfy0SC[i]); !alike(y1SC[i], f) { + t.Errorf("math.Y1(%g) = %g, want %g", vfy0SC[i], f, y1SC[i]) + } + } +} + +func TestYn(t *testing.T) { + for i := 0; i < len(vf); i++ { + a := math.Abs(vf[i]) + if f := math.Yn(2, a); !close(y2[i], f) { + t.Errorf("math.Yn(2, %g) = %g, want %g", a, f, y2[i]) + } + if f := math.Yn(-3, a); !close(yM3[i], f) { + t.Errorf("math.Yn(-3, %g) = %g, want %g", a, f, yM3[i]) + } + } + for i := 0; i < len(vfy0SC); i++ { + if f := math.Yn(2, vfy0SC[i]); !alike(y2SC[i], f) { + t.Errorf("math.Yn(2, %g) = %g, want %g", vfy0SC[i], f, y2SC[i]) + } + if f := math.Yn(-3, vfy0SC[i]); !alike(yM3SC[i], f) { + t.Errorf("math.Yn(-3, %g) = %g, want %g", vfy0SC[i], f, yM3SC[i]) + } + } + if f := math.Yn(0, 0); !alike(math.Inf(-1), f) { + t.Errorf("math.Yn(0, 0) = %g, want %g", f, math.Inf(-1)) + } +} + +var PortableFMA = math.FMA // hide call from compiler intrinsic; falls back to portable code + +func TestFMA(t *testing.T) { + for _, c := range fmaC { + got := math.FMA(c.x, c.y, c.z) + if !alike(got, c.want) { + t.Errorf("math.FMA(%g,%g,%g) == %g; want %g", c.x, c.y, c.z, got, c.want) + } + got = PortableFMA(c.x, c.y, c.z) + if !alike(got, c.want) { + t.Errorf("PortableFMA(%g,%g,%g) == %g; want %g", c.x, c.y, c.z, got, c.want) + } + } +} + +//go:noinline +func fmsub(x, y, z float64) float64 { + return math.FMA(x, y, -z) +} + +//go:noinline +func fnmsub(x, y, z float64) float64 { + return math.FMA(-x, y, z) +} + +//go:noinline +func fnmadd(x, y, z float64) float64 { + return math.FMA(-x, y, -z) +} + +func TestFMANegativeArgs(t *testing.T) { + // Some architectures have instructions for fused multiply-subtract and + // also negated variants of fused multiply-add and subtract. This test + // aims to check that the optimizations that generate those instructions + // are applied correctly, if they exist. + for _, c := range fmaC { + want := PortableFMA(c.x, c.y, -c.z) + got := fmsub(c.x, c.y, c.z) + if !alike(got, want) { + t.Errorf("math.FMA(%g, %g, -(%g)) == %g, want %g", c.x, c.y, c.z, got, want) + } + want = PortableFMA(-c.x, c.y, c.z) + got = fnmsub(c.x, c.y, c.z) + if !alike(got, want) { + t.Errorf("math.FMA(-(%g), %g, %g) == %g, want %g", c.x, c.y, c.z, got, want) + } + want = PortableFMA(-c.x, c.y, -c.z) + got = fnmadd(c.x, c.y, c.z) + if !alike(got, want) { + t.Errorf("math.FMA(-(%g), %g, -(%g)) == %g, want %g", c.x, c.y, c.z, got, want) + } + } +} + +// Check that math functions of high angle values +// return accurate results. [Since (vf[i] + large) - large != vf[i], +// testing for math.Trig(vf[i] + large) == math.Trig(vf[i]), where large is +// a multiple of 2*math.Pi, is misleading.] +func TestLargeCos(t *testing.T) { + large := float64(100000 * math.Pi) + for i := 0; i < len(vf); i++ { + f1 := cosLarge[i] + f2 := math.Cos(vf[i] + large) + if !close(f1, f2) { + t.Errorf("math.Cos(%g) = %g, want %g", vf[i]+large, f2, f1) + } + } +} + +func TestLargeSin(t *testing.T) { + large := float64(100000 * math.Pi) + for i := 0; i < len(vf); i++ { + f1 := sinLarge[i] + f2 := math.Sin(vf[i] + large) + if !close(f1, f2) { + t.Errorf("math.Sin(%g) = %g, want %g", vf[i]+large, f2, f1) + } + } +} + +func TestLargeSincos(t *testing.T) { + large := float64(100000 * math.Pi) + for i := 0; i < len(vf); i++ { + f1, g1 := sinLarge[i], cosLarge[i] + f2, g2 := math.Sincos(vf[i] + large) + if !close(f1, f2) || !close(g1, g2) { + t.Errorf("math.Sincos(%g) = %g, %g, want %g, %g", vf[i]+large, f2, g2, f1, g1) + } + } +} + +func TestLargeTan(t *testing.T) { + large := float64(100000 * math.Pi) + for i := 0; i < len(vf); i++ { + f1 := tanLarge[i] + f2 := math.Tan(vf[i] + large) + if !close(f1, f2) { + t.Errorf("math.Tan(%g) = %g, want %g", vf[i]+large, f2, f1) + } + } +} + +// Check that trigReduce matches the standard reduction results for input values +// below reduceThreshold. +func TestTrigReduce(t *testing.T) { + inputs := make([]float64, len(vf)) + // all of the standard inputs + copy(inputs, vf) + // all of the large inputs + large := float64(100000 * math.Pi) + for _, v := range vf { + inputs = append(inputs, v+large) + } + // Also test some special inputs, math.Pi and right below the reduceThreshold + // XXX: https://github.com/gnolang/gno/issues/1149 + inputs = append(inputs, float64(math.Pi), math.Nextafter(math.ReduceThreshold, 0)) + for _, x := range inputs { + // reduce the value to compare + j, z := math.TrigReduce(x) + xred := float64(j)*(math.Pi/4) + z + + if f, fred := math.Sin(x), math.Sin(xred); !close(f, fred) { + t.Errorf("math.Sin(trigmath.Reduce(%g)) != math.Sin(%g), got %g, want %g", x, x, fred, f) + } + if f, fred := math.Cos(x), math.Cos(xred); !close(f, fred) { + t.Errorf("math.Cos(trigmath.Reduce(%g)) != math.Cos(%g), got %g, want %g", x, x, fred, f) + } + if f, fred := math.Tan(x), math.Tan(xred); !close(f, fred) { + t.Errorf(" math.Tan(trigmath.Reduce(%g)) != math.Tan(%g), got %g, want %g", x, x, fred, f) + } + f, g := math.Sincos(x) + fred, gred := math.Sincos(xred) + if !close(f, fred) || !close(g, gred) { + t.Errorf(" math.Sincos(trigmath.Reduce(%g)) != math.Sincos(%g), got %g, %g, want %g, %g", x, x, fred, gred, f, g) + } + } +} + +// Check that math constants are accepted by compiler +// and have right value (assumes strconv.ParseFloat works). +// https://golang.org/issue/201 + +type floatTest struct { + val interface{} + name string + str string +} + +var floatTests = []floatTest{ + {float64(math.MaxFloat64), "MaxFloat64", "1.7976931348623157e+308"}, + {float64(math.SmallestNonzeroFloat64), "SmallestNonzeroFloat64", "5e-324"}, + {float32(math.MaxFloat32), "MaxFloat32", "3.4028235e+38"}, + {float32(math.SmallestNonzeroFloat32), "SmallestNonzeroFloat32", "1e-45"}, +} + +func TestFloatMinMax(t *testing.T) { + for _, tt := range floatTests { + s := fmt.Sprint(tt.val) + if s != tt.str { + t.Errorf("math.Sprint(%v) = %s, want %s", tt.name, s, tt.str) + } + } +} + +func TestFloatMinima(t *testing.T) { + if q := float32(math.SmallestNonzeroFloat32 / 2); q != 0 { + t.Errorf("float32(math.SmallestNonzeroFloat32 / 2) = %g, want 0", q) + } + if q := float64(math.SmallestNonzeroFloat64 / 2); q != 0 { + t.Errorf("float64(math.SmallestNonzeroFloat64 / 2) = %g, want 0", q) + } +} + +var indirectSqrt = math.Sqrt + +// TestFloat32Sqrt checks the correctness of the float32 square root optimization result. +func TestFloat32Sqrt(t *testing.T) { + for _, v := range sqrt32 { + want := float32(indirectSqrt(float64(v))) + got := float32(math.Sqrt(float64(v))) + if math.IsNaN(float64(want)) { + if !math.IsNaN(float64(got)) { + t.Errorf("got=%#v want=NaN, v=%#v", got, v) + } + continue + } + if got != want { + t.Errorf("got=%#v want=%#v, v=%#v", got, want, v) + } + } +} + +// Benchmarks + +// Global exported variables are used to store the +// return values of functions measured in the benchmarks. +// Storing the results in these variables prevents the compiler +// from completely optimizing the benchmarked functions away. +var ( + GlobalI int + GlobalB bool + GlobalF float64 +) + +func BenchmarkAcos(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Acos(.5) + } + GlobalF = x +} + +func BenchmarkAcosh(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Acosh(1.5) + } + GlobalF = x +} + +func BenchmarkAsin(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Asin(.5) + } + GlobalF = x +} + +func BenchmarkAsinh(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Asinh(.5) + } + GlobalF = x +} + +func BenchmarkAtan(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Atan(.5) + } + GlobalF = x +} + +func BenchmarkAtanh(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Atanh(.5) + } + GlobalF = x +} + +func BenchmarkAtan2(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Atan2(.5, 1) + } + GlobalF = x +} + +func BenchmarkCbrt(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Cbrt(10) + } + GlobalF = x +} + +func BenchmarkCeil(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Ceil(.5) + } + GlobalF = x +} + +var copysignNeg = -1.0 + +func BenchmarkCopysign(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Copysign(.5, copysignNeg) + } + GlobalF = x +} + +func BenchmarkCos(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Cos(.5) + } + GlobalF = x +} + +func BenchmarkCosh(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Cosh(2.5) + } + GlobalF = x +} + +func BenchmarkErf(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Erf(.5) + } + GlobalF = x +} + +func BenchmarkErfc(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Erfc(.5) + } + GlobalF = x +} + +func BenchmarkErfinv(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Erfinv(.5) + } + GlobalF = x +} + +func BenchmarkErfcinv(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Erfcinv(.5) + } + GlobalF = x +} + +func BenchmarkExp(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Exp(.5) + } + GlobalF = x +} + +func BenchmarkExpGo(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.ExpGo(.5) + } + GlobalF = x +} + +func BenchmarkExpm1(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Expm1(.5) + } + GlobalF = x +} + +func BenchmarkExp2(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Exp2(.5) + } + GlobalF = x +} + +func BenchmarkExp2Go(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Exp2Go(.5) + } + GlobalF = x +} + +var absPos = .5 + +func BenchmarkAbs(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Abs(absPos) + } + GlobalF = x +} + +func BenchmarkDim(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Dim(GlobalF, x) + } + GlobalF = x +} + +func BenchmarkFloor(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Floor(.5) + } + GlobalF = x +} + +func BenchmarkMax(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Max(10, 3) + } + GlobalF = x +} + +func BenchmarkMin(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Min(10, 3) + } + GlobalF = x +} + +func BenchmarkMod(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Mod(10, 3) + } + GlobalF = x +} + +func BenchmarkFrexp(b *testing.B) { + x := 0.0 + y := 0 + for i := 0; i < b.N; i++ { + x, y = math.Frexp(8) + } + GlobalF = x + GlobalI = y +} + +func BenchmarkGamma(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Gamma(2.5) + } + GlobalF = x +} + +func BenchmarkHypot(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Hypot(3, 4) + } + GlobalF = x +} + +func BenchmarkHypotGo(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.HypotGo(3, 4) + } + GlobalF = x +} + +func BenchmarkIlogb(b *testing.B) { + x := 0 + for i := 0; i < b.N; i++ { + x = math.Ilogb(.5) + } + GlobalI = x +} + +func BenchmarkJ0(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.J0(2.5) + } + GlobalF = x +} + +func BenchmarkJ1(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.J1(2.5) + } + GlobalF = x +} + +func BenchmarkJn(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Jn(2, 2.5) + } + GlobalF = x +} + +func BenchmarkLdexp(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Ldexp(.5, 2) + } + GlobalF = x +} + +func BenchmarkLgamma(b *testing.B) { + x := 0.0 + y := 0 + for i := 0; i < b.N; i++ { + x, y = math.Lgamma(2.5) + } + GlobalF = x + GlobalI = y +} + +func BenchmarkLog(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Log(.5) + } + GlobalF = x +} + +func BenchmarkLogb(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Logb(.5) + } + GlobalF = x +} + +func BenchmarkLog1p(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Log1p(.5) + } + GlobalF = x +} + +func BenchmarkLog10(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Log10(.5) + } + GlobalF = x +} + +func BenchmarkLog2(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Log2(.5) + } + GlobalF += x +} + +func BenchmarkModf(b *testing.B) { + x := 0.0 + y := 0.0 + for i := 0; i < b.N; i++ { + x, y = math.Modf(1.5) + } + GlobalF += x + GlobalF += y +} + +func BenchmarkNextafter32(b *testing.B) { + x := float32(0.0) + for i := 0; i < b.N; i++ { + x = math.Nextafter32(.5, 1) + } + GlobalF = float64(x) +} + +func BenchmarkNextafter64(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Nextafter(.5, 1) + } + GlobalF = x +} + +func BenchmarkPowInt(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Pow(2, 2) + } + GlobalF = x +} + +func BenchmarkPowFrac(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Pow(2.5, 1.5) + } + GlobalF = x +} + +var pow10pos = int(300) + +func BenchmarkPow10Pos(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Pow10(pow10pos) + } + GlobalF = x +} + +var pow10neg = int(-300) + +func BenchmarkPow10Neg(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Pow10(pow10neg) + } + GlobalF = x +} + +var roundNeg = float64(-2.5) + +func BenchmarkRound(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Round(roundNeg) + } + GlobalF = x +} + +func BenchmarkRoundToEven(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.RoundToEven(roundNeg) + } + GlobalF = x +} + +func BenchmarkRemainder(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Remainder(10, 3) + } + GlobalF = x +} + +var signbitPos = 2.5 + +func BenchmarkSignbit(b *testing.B) { + x := false + for i := 0; i < b.N; i++ { + x = math.Signbit(signbitPos) + } + GlobalB = x +} + +func BenchmarkSin(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Sin(.5) + } + GlobalF = x +} + +func BenchmarkSincos(b *testing.B) { + x := 0.0 + y := 0.0 + for i := 0; i < b.N; i++ { + x, y = math.Sincos(.5) + } + GlobalF += x + GlobalF += y +} + +func BenchmarkSinh(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Sinh(2.5) + } + GlobalF = x +} + +func BenchmarkSqrtIndirect(b *testing.B) { + x, y := 0.0, 10.0 + f := math.Sqrt + for i := 0; i < b.N; i++ { + x += f(y) + } + GlobalF = x +} + +func BenchmarkSqrtLatency(b *testing.B) { + x := 10.0 + for i := 0; i < b.N; i++ { + x = math.Sqrt(x) + } + GlobalF = x +} + +func BenchmarkSqrtIndirectLatency(b *testing.B) { + x := 10.0 + f := math.Sqrt + for i := 0; i < b.N; i++ { + x = f(x) + } + GlobalF = x +} + +func BenchmarkSqrtGoLatency(b *testing.B) { + x := 10.0 + for i := 0; i < b.N; i++ { + x = math.SqrtGo(x) + } + GlobalF = x +} + +func isPrime(i int) bool { + // Yes, this is a dumb way to write this code, + // but calling Sqrt repeatedly in this way demonstrates + // the benefit of using a direct SQRT instruction on systems + // that have one, whereas the obvious loop seems not to + // demonstrate such a benefit. + for j := 2; float64(j) <= math.Sqrt(float64(i)); j++ { + if i%j == 0 { + return false + } + } + return true +} + +func BenchmarkSqrtPrime(b *testing.B) { + x := false + for i := 0; i < b.N; i++ { + x = isPrime(100003) + } + GlobalB = x +} + +func BenchmarkTan(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Tan(.5) + } + GlobalF = x +} + +func BenchmarkTanh(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Tanh(2.5) + } + GlobalF = x +} + +func BenchmarkTrunc(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Trunc(.5) + } + GlobalF = x +} + +func BenchmarkY0(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Y0(2.5) + } + GlobalF = x +} + +func BenchmarkY1(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Y1(2.5) + } + GlobalF = x +} + +func BenchmarkYn(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Yn(2, 2.5) + } + GlobalF = x +} + +func BenchmarkFloat64bits(b *testing.B) { + y := uint64(0) + for i := 0; i < b.N; i++ { + y = math.Float64bits(roundNeg) + } + GlobalI = int(y) +} + +var roundUint64 = uint64(5) + +func BenchmarkFloat64frombits(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.Float64frombits(roundUint64) + } + GlobalF = x +} + +var roundFloat32 = float32(-2.5) + +func BenchmarkFloat32bits(b *testing.B) { + y := uint32(0) + for i := 0; i < b.N; i++ { + y = math.Float32bits(roundFloat32) + } + GlobalI = int(y) +} + +var roundUint32 = uint32(5) + +func BenchmarkFloat32frombits(b *testing.B) { + x := float32(0.0) + for i := 0; i < b.N; i++ { + x = math.Float32frombits(roundUint32) + } + GlobalF = float64(x) +} + +func BenchmarkFMA(b *testing.B) { + x := 0.0 + for i := 0; i < b.N; i++ { + x = math.FMA(math.E, math.Pi, x) } + GlobalF = x } diff --git a/gnovm/stdlibs/math/asin.gno b/gnovm/stdlibs/math/asin.gno new file mode 100644 index 00000000000..d99f5664332 --- /dev/null +++ b/gnovm/stdlibs/math/asin.gno @@ -0,0 +1,61 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Floating-point arcsine and arccosine. + + They are implemented by computing the arctangent + after appropriate range reduction. +*/ + +// Asin returns the arcsine, in radians, of x. +// +// Special cases are: +// +// Asin(±0) = ±0 +// Asin(x) = NaN if x < -1 or x > 1 +func Asin(x float64) float64 { + return asin(x) +} + +func asin(x float64) float64 { + if x == 0 { + return x // special case + } + sign := false + if x < 0 { + x = -x + sign = true + } + if x > 1 { + return NaN() // special case + } + + temp := Sqrt(1 - x*x) + if x > 0.7 { + temp = Pi/2 - satan(temp/x) + } else { + temp = satan(x / temp) + } + + if sign { + temp = -temp + } + return temp +} + +// Acos returns the arccosine, in radians, of x. +// +// Special case is: +// +// Acos(x) = NaN if x < -1 or x > 1 +func Acos(x float64) float64 { + return acos(x) +} + +func acos(x float64) float64 { + return Pi/2 - Asin(x) +} diff --git a/gnovm/stdlibs/math/asinh.gno b/gnovm/stdlibs/math/asinh.gno new file mode 100644 index 00000000000..59fc3d7ad7e --- /dev/null +++ b/gnovm/stdlibs/math/asinh.gno @@ -0,0 +1,74 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code, the long comment, and the constants +// below are from FreeBSD's /usr/src/lib/msun/src/s_asinh.c +// and came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// +// asinh(x) +// Method : +// Based on +// asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ] +// we have +// asinh(x) := x if 1+x*x=1, +// := sign(x)*(log(x)+ln2) for large |x|, else +// := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else +// := sign(x)*log1p(|x| + x**2/(1 + sqrt(1+x**2))) +// + +// Asinh returns the inverse hyperbolic sine of x. +// +// Special cases are: +// +// Asinh(±0) = ±0 +// Asinh(±Inf) = ±Inf +// Asinh(NaN) = NaN +func Asinh(x float64) float64 { + return asinh(x) +} + +func asinh(x float64) float64 { + const ( + Ln2 = 6.93147180559945286227e-01 // 0x3FE62E42FEFA39EF + NearZero = 1.0 / (1 << 28) // 2**-28 + Large = 1 << 28 // 2**28 + ) + // special cases + if IsNaN(x) || IsInf(x, 0) { + return x + } + sign := false + if x < 0 { + x = -x + sign = true + } + var temp float64 + switch { + case x > Large: + temp = Log(x) + Ln2 // |x| > 2**28 + case x > 2: + temp = Log(2*x + 1/(Sqrt(x*x+1)+x)) // 2**28 > |x| > 2.0 + case x < NearZero: + temp = x // |x| < 2**-28 + default: + temp = Log1p(x + x*x/(1+Sqrt(1+x*x))) // 2.0 > |x| > 2**-28 + } + if sign { + temp = -temp + } + return temp +} diff --git a/gnovm/stdlibs/math/atan.gno b/gnovm/stdlibs/math/atan.gno new file mode 100644 index 00000000000..23cae2dbfec --- /dev/null +++ b/gnovm/stdlibs/math/atan.gno @@ -0,0 +1,108 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Floating-point arctangent. +*/ + +// The original C code, the long comment, and the constants below were +// from http://netlib.sandia.gov/cephes/cmath/atan.c, available from +// http://www.netlib.org/cephes/cmath.tgz. +// The go code is a version of the original C. +// +// atan.c +// Inverse circular tangent (arctangent) +// +// SYNOPSIS: +// double x, y, atan(); +// y = atan( x ); +// +// DESCRIPTION: +// Returns radian angle between -pi/2 and +pi/2 whose tangent is x. +// +// Range reduction is from three intervals into the interval from zero to 0.66. +// The approximant uses a rational function of degree 4/5 of the form +// x + x**3 P(x)/Q(x). +// +// ACCURACY: +// Relative error: +// arithmetic domain # trials peak rms +// DEC -10, 10 50000 2.4e-17 8.3e-18 +// IEEE -10, 10 10^6 1.8e-16 5.0e-17 +// +// Cephes Math Library Release 2.8: June, 2000 +// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier +// +// The readme file at http://netlib.sandia.gov/cephes/ says: +// Some software in this archive may be from the book _Methods and +// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster +// International, 1989) or from the Cephes Mathematical Library, a +// commercial product. In either event, it is copyrighted by the author. +// What you see here may be used freely but it comes with no support or +// guarantee. +// +// The two known misprints in the book are repaired here in the +// source listings for the gamma function and the incomplete beta +// integral. +// +// Stephen L. Moshier +// moshier@na-net.ornl.gov + +// xatan evaluates a series valid in the range [0, 0.66]. +func xatan(x float64) float64 { + const ( + P0 = -8.750608600031904122785e-01 + P1 = -1.615753718733365076637e+01 + P2 = -7.500855792314704667340e+01 + P3 = -1.228866684490136173410e+02 + P4 = -6.485021904942025371773e+01 + Q0 = +2.485846490142306297962e+01 + Q1 = +1.650270098316988542046e+02 + Q2 = +4.328810604912902668951e+02 + Q3 = +4.853903996359136964868e+02 + Q4 = +1.945506571482613964425e+02 + ) + z := x * x + z = z * ((((P0*z+P1)*z+P2)*z+P3)*z + P4) / (((((z+Q0)*z+Q1)*z+Q2)*z+Q3)*z + Q4) + z = x*z + x + return z +} + +// satan reduces its argument (known to be positive) +// to the range [0, 0.66] and calls xatan. +func satan(x float64) float64 { + const ( + Morebits = 6.123233995736765886130e-17 // pi/2 = PIO2 + Morebits + Tan3pio8 = 2.41421356237309504880 // tan(3*pi/8) + ) + if x <= 0.66 { + return xatan(x) + } + if x > Tan3pio8 { + return Pi/2 - xatan(1/x) + Morebits + } + return Pi/4 + xatan((x-1)/(x+1)) + 0.5*Morebits +} + +// Atan returns the arctangent, in radians, of x. +// +// Special cases are: +// +// Atan(±0) = ±0 +// Atan(±Inf) = ±Pi/2 +func Atan(x float64) float64 { + return atan(x) +} + +func atan(x float64) float64 { + if x == 0 { + return x + } + if x > 0 { + return satan(x) + } + return -satan(-x) +} diff --git a/gnovm/stdlibs/math/atan2.gno b/gnovm/stdlibs/math/atan2.gno new file mode 100644 index 00000000000..f474cf11e03 --- /dev/null +++ b/gnovm/stdlibs/math/atan2.gno @@ -0,0 +1,74 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// Atan2 returns the arc tangent of y/x, using +// the signs of the two to determine the quadrant +// of the return value. +// +// Special cases are (in order): +// +// Atan2(y, NaN) = NaN +// Atan2(NaN, x) = NaN +// Atan2(+0, x>=0) = +0 +// Atan2(-0, x>=0) = -0 +// Atan2(+0, x<=-0) = +Pi +// Atan2(-0, x<=-0) = -Pi +// Atan2(y>0, 0) = +Pi/2 +// Atan2(y<0, 0) = -Pi/2 +// Atan2(+Inf, +Inf) = +Pi/4 +// Atan2(-Inf, +Inf) = -Pi/4 +// Atan2(+Inf, -Inf) = 3Pi/4 +// Atan2(-Inf, -Inf) = -3Pi/4 +// Atan2(y, +Inf) = 0 +// Atan2(y>0, -Inf) = +Pi +// Atan2(y<0, -Inf) = -Pi +// Atan2(+Inf, x) = +Pi/2 +// Atan2(-Inf, x) = -Pi/2 +func Atan2(y, x float64) float64 { + return atan2(y, x) +} + +func atan2(y, x float64) float64 { + // special cases + switch { + case IsNaN(y) || IsNaN(x): + return NaN() + case y == 0: + if x >= 0 && !Signbit(x) { + return Copysign(0, y) + } + return Copysign(Pi, y) + case x == 0: + return Copysign(Pi/2, y) + case IsInf(x, 0): + if IsInf(x, 1) { + switch { + case IsInf(y, 0): + return Copysign(Pi/4, y) + default: + return Copysign(0, y) + } + } + switch { + case IsInf(y, 0): + return Copysign(3*Pi/4, y) + default: + return Copysign(Pi, y) + } + case IsInf(y, 0): + return Copysign(Pi/2, y) + } + + // Call atan and determine the quadrant. + q := Atan(y / x) + if x < 0 { + if q <= 0 { + return q + Pi + } + return q - Pi + } + return q +} diff --git a/gnovm/stdlibs/math/atanh.gno b/gnovm/stdlibs/math/atanh.gno new file mode 100644 index 00000000000..dcfe7e56382 --- /dev/null +++ b/gnovm/stdlibs/math/atanh.gno @@ -0,0 +1,82 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code, the long comment, and the constants +// below are from FreeBSD's /usr/src/lib/msun/src/e_atanh.c +// and came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// +// __ieee754_atanh(x) +// Method : +// 1. Reduce x to positive by atanh(-x) = -atanh(x) +// 2. For x>=0.5 +// 1 2x x +// atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------) +// 2 1 - x 1 - x +// +// For x<0.5 +// atanh(x) = 0.5*log1p(2x+2x*x/(1-x)) +// +// Special cases: +// atanh(x) is NaN if |x| > 1 with signal; +// atanh(NaN) is that NaN with no signal; +// atanh(+-1) is +-INF with signal. +// + +// Atanh returns the inverse hyperbolic tangent of x. +// +// Special cases are: +// +// Atanh(1) = +Inf +// Atanh(±0) = ±0 +// Atanh(-1) = -Inf +// Atanh(x) = NaN if x < -1 or x > 1 +// Atanh(NaN) = NaN +func Atanh(x float64) float64 { + return atanh(x) +} + +func atanh(x float64) float64 { + const NearZero = 1.0 / (1 << 28) // 2**-28 + // special cases + switch { + case x < -1 || x > 1 || IsNaN(x): + return NaN() + case x == 1: + return Inf(1) + case x == -1: + return Inf(-1) + } + sign := false + if x < 0 { + x = -x + sign = true + } + var temp float64 + switch { + case x < NearZero: + temp = x + case x < 0.5: + temp = x + x + temp = 0.5 * Log1p(temp+temp*x/(1-x)) + default: + temp = 0.5 * Log1p((x+x)/(1-x)) + } + if sign { + temp = -temp + } + return temp +} diff --git a/gnovm/stdlibs/math/bits.gno b/gnovm/stdlibs/math/bits.gno index 6cf646d2f5e..c5cb93b1594 100644 --- a/gnovm/stdlibs/math/bits.gno +++ b/gnovm/stdlibs/math/bits.gno @@ -4,10 +4,6 @@ package math -import ( - imath "internal/math" -) - const ( uvnan = 0x7FF8000000000001 uvinf = 0x7FF0000000000000 @@ -28,11 +24,11 @@ func Inf(sign int) float64 { } else { v = uvneginf } - return imath.Float64frombits(v) + return Float64frombits(v) } // NaN returns an IEEE 754 “not-a-number” value. -func NaN() float64 { return imath.Float64frombits(uvnan) } +func NaN() float64 { return Float64frombits(uvnan) } // IsNaN reports whether f is an IEEE 754 “not-a-number” value. func IsNaN(f float64) (is bool) { diff --git a/gnovm/stdlibs/math/bits/bits.gno b/gnovm/stdlibs/math/bits/bits.gno new file mode 100644 index 00000000000..381244a1118 --- /dev/null +++ b/gnovm/stdlibs/math/bits/bits.gno @@ -0,0 +1,604 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run make_tables.go + +// Package bits implements bit counting and manipulation +// functions for the predeclared unsigned integer types. +// +// Functions in this package may be implemented directly by +// the compiler, for better performance. For those functions +// the code in this package will not be used. Which +// functions are implemented by the compiler depends on the +// architecture and the Go release. +package bits + +const uintSize = 32 << (^uint(0) >> 63) // 32 or 64 + +// UintSize is the size of a uint in bits. +const UintSize = uintSize + +// --- LeadingZeros --- + +// LeadingZeros returns the number of leading zero bits in x; the result is UintSize for x == 0. +func LeadingZeros(x uint) int { return UintSize - Len(x) } + +// LeadingZeros8 returns the number of leading zero bits in x; the result is 8 for x == 0. +func LeadingZeros8(x uint8) int { return 8 - Len8(x) } + +// LeadingZeros16 returns the number of leading zero bits in x; the result is 16 for x == 0. +func LeadingZeros16(x uint16) int { return 16 - Len16(x) } + +// LeadingZeros32 returns the number of leading zero bits in x; the result is 32 for x == 0. +func LeadingZeros32(x uint32) int { return 32 - Len32(x) } + +// LeadingZeros64 returns the number of leading zero bits in x; the result is 64 for x == 0. +func LeadingZeros64(x uint64) int { return 64 - Len64(x) } + +// --- TrailingZeros --- + +// See http://supertech.csail.mit.edu/papers/debruijn.pdf +const deBruijn32 = 0x077CB531 + +var deBruijn32tab = [32]byte{ + 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9, +} + +const deBruijn64 = 0x03f79d71b4ca8b09 + +var deBruijn64tab = [64]byte{ + 0, 1, 56, 2, 57, 49, 28, 3, 61, 58, 42, 50, 38, 29, 17, 4, + 62, 47, 59, 36, 45, 43, 51, 22, 53, 39, 33, 30, 24, 18, 12, 5, + 63, 55, 48, 27, 60, 41, 37, 16, 46, 35, 44, 21, 52, 32, 23, 11, + 54, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6, +} + +// TrailingZeros returns the number of trailing zero bits in x; the result is UintSize for x == 0. +func TrailingZeros(x uint) int { + if UintSize == 32 { + return TrailingZeros32(uint32(x)) + } + return TrailingZeros64(uint64(x)) +} + +// TrailingZeros8 returns the number of trailing zero bits in x; the result is 8 for x == 0. +func TrailingZeros8(x uint8) int { + return int(ntz8tab[x]) +} + +// TrailingZeros16 returns the number of trailing zero bits in x; the result is 16 for x == 0. +func TrailingZeros16(x uint16) int { + if x == 0 { + return 16 + } + // see comment in TrailingZeros64 + return int(deBruijn32tab[uint32(x&-x)*deBruijn32>>(32-5)]) +} + +// TrailingZeros32 returns the number of trailing zero bits in x; the result is 32 for x == 0. +func TrailingZeros32(x uint32) int { + if x == 0 { + return 32 + } + // see comment in TrailingZeros64 + return int(deBruijn32tab[(x&-x)*deBruijn32>>(32-5)]) +} + +// TrailingZeros64 returns the number of trailing zero bits in x; the result is 64 for x == 0. +func TrailingZeros64(x uint64) int { + if x == 0 { + return 64 + } + // If popcount is fast, replace code below with return popcount(^x & (x - 1)). + // + // x & -x leaves only the right-most bit set in the word. Let k be the + // index of that bit. Since only a single bit is set, the value is two + // to the power of k. Multiplying by a power of two is equivalent to + // left shifting, in this case by k bits. The de Bruijn (64 bit) constant + // is such that all six bit, consecutive substrings are distinct. + // Therefore, if we have a left shifted version of this constant we can + // find by how many bits it was shifted by looking at which six bit + // substring ended up at the top of the word. + // (Knuth, volume 4, section 7.3.1) + return int(deBruijn64tab[(x&-x)*deBruijn64>>(64-6)]) +} + +// --- OnesCount --- + +const ( + m0 = 0x5555555555555555 // 01010101 ... + m1 = 0x3333333333333333 // 00110011 ... + m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ... + m3 = 0x00ff00ff00ff00ff // etc. + m4 = 0x0000ffff0000ffff +) + +// OnesCount returns the number of one bits ("population count") in x. +func OnesCount(x uint) int { + if UintSize == 32 { + return OnesCount32(uint32(x)) + } + return OnesCount64(uint64(x)) +} + +// OnesCount8 returns the number of one bits ("population count") in x. +func OnesCount8(x uint8) int { + return int(pop8tab[x]) +} + +// OnesCount16 returns the number of one bits ("population count") in x. +func OnesCount16(x uint16) int { + return int(pop8tab[x>>8] + pop8tab[x&0xff]) +} + +// OnesCount32 returns the number of one bits ("population count") in x. +func OnesCount32(x uint32) int { + return int(pop8tab[x>>24] + pop8tab[x>>16&0xff] + pop8tab[x>>8&0xff] + pop8tab[x&0xff]) +} + +// OnesCount64 returns the number of one bits ("population count") in x. +func OnesCount64(x uint64) int { + // Implementation: Parallel summing of adjacent bits. + // See "Hacker's Delight", Chap. 5: Counting Bits. + // The following pattern shows the general approach: + // + // x = x>>1&(m0&m) + x&(m0&m) + // x = x>>2&(m1&m) + x&(m1&m) + // x = x>>4&(m2&m) + x&(m2&m) + // x = x>>8&(m3&m) + x&(m3&m) + // x = x>>16&(m4&m) + x&(m4&m) + // x = x>>32&(m5&m) + x&(m5&m) + // return int(x) + // + // Masking (& operations) can be left away when there's no + // danger that a field's sum will carry over into the next + // field: Since the result cannot be > 64, 8 bits is enough + // and we can ignore the masks for the shifts by 8 and up. + // Per "Hacker's Delight", the first line can be simplified + // more, but it saves at best one instruction, so we leave + // it alone for clarity. + const m = 1<<64 - 1 + x = x>>1&(m0&m) + x&(m0&m) + x = x>>2&(m1&m) + x&(m1&m) + x = (x>>4 + x) & (m2 & m) + x += x >> 8 + x += x >> 16 + x += x >> 32 + return int(x) & (1<<7 - 1) +} + +// --- RotateLeft --- + +// RotateLeft returns the value of x rotated left by (k mod UintSize) bits. +// To rotate x right by k bits, call RotateLeft(x, -k). +// +// This function's execution time does not depend on the inputs. +func RotateLeft(x uint, k int) uint { + if UintSize == 32 { + return uint(RotateLeft32(uint32(x), k)) + } + return uint(RotateLeft64(uint64(x), k)) +} + +// RotateLeft8 returns the value of x rotated left by (k mod 8) bits. +// To rotate x right by k bits, call RotateLeft8(x, -k). +// +// This function's execution time does not depend on the inputs. +func RotateLeft8(x uint8, k int) uint8 { + const n = 8 + s := uint(k) & (n - 1) + return x<>(n-s) +} + +// RotateLeft16 returns the value of x rotated left by (k mod 16) bits. +// To rotate x right by k bits, call RotateLeft16(x, -k). +// +// This function's execution time does not depend on the inputs. +func RotateLeft16(x uint16, k int) uint16 { + const n = 16 + s := uint(k) & (n - 1) + return x<>(n-s) +} + +// RotateLeft32 returns the value of x rotated left by (k mod 32) bits. +// To rotate x right by k bits, call RotateLeft32(x, -k). +// +// This function's execution time does not depend on the inputs. +func RotateLeft32(x uint32, k int) uint32 { + const n = 32 + s := uint(k) & (n - 1) + return x<>(n-s) +} + +// RotateLeft64 returns the value of x rotated left by (k mod 64) bits. +// To rotate x right by k bits, call RotateLeft64(x, -k). +// +// This function's execution time does not depend on the inputs. +func RotateLeft64(x uint64, k int) uint64 { + const n = 64 + s := uint(k) & (n - 1) + return x<>(n-s) +} + +// --- Reverse --- + +// Reverse returns the value of x with its bits in reversed order. +func Reverse(x uint) uint { + if UintSize == 32 { + return uint(Reverse32(uint32(x))) + } + return uint(Reverse64(uint64(x))) +} + +// Reverse8 returns the value of x with its bits in reversed order. +func Reverse8(x uint8) uint8 { + return rev8tab[x] +} + +// Reverse16 returns the value of x with its bits in reversed order. +func Reverse16(x uint16) uint16 { + return uint16(rev8tab[x>>8]) | uint16(rev8tab[x&0xff])<<8 +} + +// Reverse32 returns the value of x with its bits in reversed order. +func Reverse32(x uint32) uint32 { + const m = 1<<32 - 1 + x = x>>1&(m0&m) | x&(m0&m)<<1 + x = x>>2&(m1&m) | x&(m1&m)<<2 + x = x>>4&(m2&m) | x&(m2&m)<<4 + return ReverseBytes32(x) +} + +// Reverse64 returns the value of x with its bits in reversed order. +func Reverse64(x uint64) uint64 { + const m = 1<<64 - 1 + x = x>>1&(m0&m) | x&(m0&m)<<1 + x = x>>2&(m1&m) | x&(m1&m)<<2 + x = x>>4&(m2&m) | x&(m2&m)<<4 + return ReverseBytes64(x) +} + +// --- ReverseBytes --- + +// ReverseBytes returns the value of x with its bytes in reversed order. +// +// This function's execution time does not depend on the inputs. +func ReverseBytes(x uint) uint { + if UintSize == 32 { + return uint(ReverseBytes32(uint32(x))) + } + return uint(ReverseBytes64(uint64(x))) +} + +// ReverseBytes16 returns the value of x with its bytes in reversed order. +// +// This function's execution time does not depend on the inputs. +func ReverseBytes16(x uint16) uint16 { + return x>>8 | x<<8 +} + +// ReverseBytes32 returns the value of x with its bytes in reversed order. +// +// This function's execution time does not depend on the inputs. +func ReverseBytes32(x uint32) uint32 { + const m = 1<<32 - 1 + x = x>>8&(m3&m) | x&(m3&m)<<8 + return x>>16 | x<<16 +} + +// ReverseBytes64 returns the value of x with its bytes in reversed order. +// +// This function's execution time does not depend on the inputs. +func ReverseBytes64(x uint64) uint64 { + const m = 1<<64 - 1 + x = x>>8&(m3&m) | x&(m3&m)<<8 + x = x>>16&(m4&m) | x&(m4&m)<<16 + return x>>32 | x<<32 +} + +// --- Len --- + +// Len returns the minimum number of bits required to represent x; the result is 0 for x == 0. +func Len(x uint) int { + if UintSize == 32 { + return Len32(uint32(x)) + } + return Len64(uint64(x)) +} + +// Len8 returns the minimum number of bits required to represent x; the result is 0 for x == 0. +func Len8(x uint8) int { + return int(len8tab[x]) +} + +// Len16 returns the minimum number of bits required to represent x; the result is 0 for x == 0. +func Len16(x uint16) (n int) { + if x >= 1<<8 { + x >>= 8 + n = 8 + } + return n + int(len8tab[x]) +} + +// Len32 returns the minimum number of bits required to represent x; the result is 0 for x == 0. +func Len32(x uint32) (n int) { + if x >= 1<<16 { + x >>= 16 + n = 16 + } + if x >= 1<<8 { + x >>= 8 + n += 8 + } + return n + int(len8tab[x]) +} + +// Len64 returns the minimum number of bits required to represent x; the result is 0 for x == 0. +func Len64(x uint64) (n int) { + if x >= 1<<32 { + x >>= 32 + n = 32 + } + if x >= 1<<16 { + x >>= 16 + n += 16 + } + if x >= 1<<8 { + x >>= 8 + n += 8 + } + return n + int(len8tab[x]) +} + +// --- Add with carry --- + +// Add returns the sum with carry of x, y and carry: sum = x + y + carry. +// The carry input must be 0 or 1; otherwise the behavior is undefined. +// The carryOut output is guaranteed to be 0 or 1. +// +// This function's execution time does not depend on the inputs. +func Add(x, y, carry uint) (sum, carryOut uint) { + if UintSize == 32 { + s32, c32 := Add32(uint32(x), uint32(y), uint32(carry)) + return uint(s32), uint(c32) + } + s64, c64 := Add64(uint64(x), uint64(y), uint64(carry)) + return uint(s64), uint(c64) +} + +// Add32 returns the sum with carry of x, y and carry: sum = x + y + carry. +// The carry input must be 0 or 1; otherwise the behavior is undefined. +// The carryOut output is guaranteed to be 0 or 1. +// +// This function's execution time does not depend on the inputs. +func Add32(x, y, carry uint32) (sum, carryOut uint32) { + sum64 := uint64(x) + uint64(y) + uint64(carry) + sum = uint32(sum64) + carryOut = uint32(sum64 >> 32) + return +} + +// Add64 returns the sum with carry of x, y and carry: sum = x + y + carry. +// The carry input must be 0 or 1; otherwise the behavior is undefined. +// The carryOut output is guaranteed to be 0 or 1. +// +// This function's execution time does not depend on the inputs. +func Add64(x, y, carry uint64) (sum, carryOut uint64) { + sum = x + y + carry + // The sum will overflow if both top bits are set (x & y) or if one of them + // is (x | y), and a carry from the lower place happened. If such a carry + // happens, the top bit will be 1 + 0 + 1 = 0 (&^ sum). + carryOut = ((x & y) | ((x | y) &^ sum)) >> 63 + return +} + +// --- Subtract with borrow --- + +// Sub returns the difference of x, y and borrow: diff = x - y - borrow. +// The borrow input must be 0 or 1; otherwise the behavior is undefined. +// The borrowOut output is guaranteed to be 0 or 1. +// +// This function's execution time does not depend on the inputs. +func Sub(x, y, borrow uint) (diff, borrowOut uint) { + if UintSize == 32 { + d32, b32 := Sub32(uint32(x), uint32(y), uint32(borrow)) + return uint(d32), uint(b32) + } + d64, b64 := Sub64(uint64(x), uint64(y), uint64(borrow)) + return uint(d64), uint(b64) +} + +// Sub32 returns the difference of x, y and borrow, diff = x - y - borrow. +// The borrow input must be 0 or 1; otherwise the behavior is undefined. +// The borrowOut output is guaranteed to be 0 or 1. +// +// This function's execution time does not depend on the inputs. +func Sub32(x, y, borrow uint32) (diff, borrowOut uint32) { + diff = x - y - borrow + // The difference will underflow if the top bit of x is not set and the top + // bit of y is set (^x & y) or if they are the same (^(x ^ y)) and a borrow + // from the lower place happens. If that borrow happens, the result will be + // 1 - 1 - 1 = 0 - 0 - 1 = 1 (& diff). + borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 31 + return +} + +// Sub64 returns the difference of x, y and borrow: diff = x - y - borrow. +// The borrow input must be 0 or 1; otherwise the behavior is undefined. +// The borrowOut output is guaranteed to be 0 or 1. +// +// This function's execution time does not depend on the inputs. +func Sub64(x, y, borrow uint64) (diff, borrowOut uint64) { + diff = x - y - borrow + // See Sub32 for the bit logic. + borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 63 + return +} + +// --- Full-width multiply --- + +// Mul returns the full-width product of x and y: (hi, lo) = x * y +// with the product bits' upper half returned in hi and the lower +// half returned in lo. +// +// This function's execution time does not depend on the inputs. +func Mul(x, y uint) (hi, lo uint) { + if UintSize == 32 { + h, l := Mul32(uint32(x), uint32(y)) + return uint(h), uint(l) + } + h, l := Mul64(uint64(x), uint64(y)) + return uint(h), uint(l) +} + +// Mul32 returns the 64-bit product of x and y: (hi, lo) = x * y +// with the product bits' upper half returned in hi and the lower +// half returned in lo. +// +// This function's execution time does not depend on the inputs. +func Mul32(x, y uint32) (hi, lo uint32) { + tmp := uint64(x) * uint64(y) + hi, lo = uint32(tmp>>32), uint32(tmp) + return +} + +// Mul64 returns the 128-bit product of x and y: (hi, lo) = x * y +// with the product bits' upper half returned in hi and the lower +// half returned in lo. +// +// This function's execution time does not depend on the inputs. +func Mul64(x, y uint64) (hi, lo uint64) { + const mask32 = 1<<32 - 1 + x0 := x & mask32 + x1 := x >> 32 + y0 := y & mask32 + y1 := y >> 32 + w0 := x0 * y0 + t := x1*y0 + w0>>32 + w1 := t & mask32 + w2 := t >> 32 + w1 += x0 * y1 + hi = x1*y1 + w2 + w1>>32 + lo = x * y + return +} + +// --- Full-width divide --- + +// Div returns the quotient and remainder of (hi, lo) divided by y: +// quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper +// half in parameter hi and the lower half in parameter lo. +// Div panics for y == 0 (division by zero) or y <= hi (quotient overflow). +func Div(hi, lo, y uint) (quo, rem uint) { + if UintSize == 32 { + q, r := Div32(uint32(hi), uint32(lo), uint32(y)) + return uint(q), uint(r) + } + q, r := Div64(uint64(hi), uint64(lo), uint64(y)) + return uint(q), uint(r) +} + +// Div32 returns the quotient and remainder of (hi, lo) divided by y: +// quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper +// half in parameter hi and the lower half in parameter lo. +// Div32 panics for y == 0 (division by zero) or y <= hi (quotient overflow). +func Div32(hi, lo, y uint32) (quo, rem uint32) { + if y != 0 && y <= hi { + panic(overflowError) + } + if y == 0 { + panic(divideError) + } + z := uint64(hi)<<32 | uint64(lo) + quo, rem = uint32(z/uint64(y)), uint32(z%uint64(y)) + return +} + +// Div64 returns the quotient and remainder of (hi, lo) divided by y: +// quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper +// half in parameter hi and the lower half in parameter lo. +// Div64 panics for y == 0 (division by zero) or y <= hi (quotient overflow). +func Div64(hi, lo, y uint64) (quo, rem uint64) { + if y == 0 { + panic(divideError) + } + if y <= hi { + panic(overflowError) + } + + // If high part is zero, we can directly return the results. + if hi == 0 { + return lo / y, lo % y + } + + s := uint(LeadingZeros64(y)) + y <<= s + + const ( + two32 = 1 << 32 + mask32 = two32 - 1 + ) + yn1 := y >> 32 + yn0 := y & mask32 + un32 := hi<>(64-s) + un10 := lo << s + un1 := un10 >> 32 + un0 := un10 & mask32 + q1 := un32 / yn1 + rhat := un32 - q1*yn1 + + for q1 >= two32 || q1*yn0 > two32*rhat+un1 { + q1-- + rhat += yn1 + if rhat >= two32 { + break + } + } + + un21 := un32*two32 + un1 - q1*y + q0 := un21 / yn1 + rhat = un21 - q0*yn1 + + for q0 >= two32 || q0*yn0 > two32*rhat+un0 { + q0-- + rhat += yn1 + if rhat >= two32 { + break + } + } + + return q1*two32 + q0, (un21*two32 + un0 - q0*y) >> s +} + +// Rem returns the remainder of (hi, lo) divided by y. Rem panics for +// y == 0 (division by zero) but, unlike Div, it doesn't panic on a +// quotient overflow. +func Rem(hi, lo, y uint) uint { + if UintSize == 32 { + return uint(Rem32(uint32(hi), uint32(lo), uint32(y))) + } + return uint(Rem64(uint64(hi), uint64(lo), uint64(y))) +} + +// Rem32 returns the remainder of (hi, lo) divided by y. Rem32 panics +// for y == 0 (division by zero) but, unlike Div32, it doesn't panic +// on a quotient overflow. +func Rem32(hi, lo, y uint32) uint32 { + return uint32((uint64(hi)<<32 | uint64(lo)) % uint64(y)) +} + +// Rem64 returns the remainder of (hi, lo) divided by y. Rem64 panics +// for y == 0 (division by zero) but, unlike Div64, it doesn't panic +// on a quotient overflow. +func Rem64(hi, lo, y uint64) uint64 { + // We scale down hi so that hi < y, then use Div64 to compute the + // rem with the guarantee that it won't panic on quotient overflow. + // Given that + // hi ≡ hi%y (mod y) + // we have + // hi<<64 + lo ≡ (hi%y)<<64 + lo (mod y) + _, rem := Div64(hi%y, lo, y) + return rem +} diff --git a/gnovm/stdlibs/math/bits/bits_errors.gno b/gnovm/stdlibs/math/bits/bits_errors.gno new file mode 100644 index 00000000000..cf8a5198b2f --- /dev/null +++ b/gnovm/stdlibs/math/bits/bits_errors.gno @@ -0,0 +1,13 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bits + +import ( + "errors" +) + +var overflowError = errors.New("math/bits: integer overflow") + +var divideError = errors.New("math/bits: integer divide by zero") diff --git a/gnovm/stdlibs/math/bits/bits_tables.gno b/gnovm/stdlibs/math/bits/bits_tables.gno new file mode 100644 index 00000000000..f869b8d5c37 --- /dev/null +++ b/gnovm/stdlibs/math/bits/bits_tables.gno @@ -0,0 +1,79 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by go run make_tables.go. DO NOT EDIT. + +package bits + +const ntz8tab = "" + + "\x08\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x06\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x07\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x06\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + +const pop8tab = "" + + "\x00\x01\x01\x02\x01\x02\x02\x03\x01\x02\x02\x03\x02\x03\x03\x04" + + "\x01\x02\x02\x03\x02\x03\x03\x04\x02\x03\x03\x04\x03\x04\x04\x05" + + "\x01\x02\x02\x03\x02\x03\x03\x04\x02\x03\x03\x04\x03\x04\x04\x05" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x01\x02\x02\x03\x02\x03\x03\x04\x02\x03\x03\x04\x03\x04\x04\x05" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x03\x04\x04\x05\x04\x05\x05\x06\x04\x05\x05\x06\x05\x06\x06\x07" + + "\x01\x02\x02\x03\x02\x03\x03\x04\x02\x03\x03\x04\x03\x04\x04\x05" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x03\x04\x04\x05\x04\x05\x05\x06\x04\x05\x05\x06\x05\x06\x06\x07" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x03\x04\x04\x05\x04\x05\x05\x06\x04\x05\x05\x06\x05\x06\x06\x07" + + "\x03\x04\x04\x05\x04\x05\x05\x06\x04\x05\x05\x06\x05\x06\x06\x07" + + "\x04\x05\x05\x06\x05\x06\x06\x07\x05\x06\x06\x07\x06\x07\x07\x08" + +const rev8tab = "" + + "\x00\x80\x40\xc0\x20\xa0\x60\xe0\x10\x90\x50\xd0\x30\xb0\x70\xf0" + + "\x08\x88\x48\xc8\x28\xa8\x68\xe8\x18\x98\x58\xd8\x38\xb8\x78\xf8" + + "\x04\x84\x44\xc4\x24\xa4\x64\xe4\x14\x94\x54\xd4\x34\xb4\x74\xf4" + + "\x0c\x8c\x4c\xcc\x2c\xac\x6c\xec\x1c\x9c\x5c\xdc\x3c\xbc\x7c\xfc" + + "\x02\x82\x42\xc2\x22\xa2\x62\xe2\x12\x92\x52\xd2\x32\xb2\x72\xf2" + + "\x0a\x8a\x4a\xca\x2a\xaa\x6a\xea\x1a\x9a\x5a\xda\x3a\xba\x7a\xfa" + + "\x06\x86\x46\xc6\x26\xa6\x66\xe6\x16\x96\x56\xd6\x36\xb6\x76\xf6" + + "\x0e\x8e\x4e\xce\x2e\xae\x6e\xee\x1e\x9e\x5e\xde\x3e\xbe\x7e\xfe" + + "\x01\x81\x41\xc1\x21\xa1\x61\xe1\x11\x91\x51\xd1\x31\xb1\x71\xf1" + + "\x09\x89\x49\xc9\x29\xa9\x69\xe9\x19\x99\x59\xd9\x39\xb9\x79\xf9" + + "\x05\x85\x45\xc5\x25\xa5\x65\xe5\x15\x95\x55\xd5\x35\xb5\x75\xf5" + + "\x0d\x8d\x4d\xcd\x2d\xad\x6d\xed\x1d\x9d\x5d\xdd\x3d\xbd\x7d\xfd" + + "\x03\x83\x43\xc3\x23\xa3\x63\xe3\x13\x93\x53\xd3\x33\xb3\x73\xf3" + + "\x0b\x8b\x4b\xcb\x2b\xab\x6b\xeb\x1b\x9b\x5b\xdb\x3b\xbb\x7b\xfb" + + "\x07\x87\x47\xc7\x27\xa7\x67\xe7\x17\x97\x57\xd7\x37\xb7\x77\xf7" + + "\x0f\x8f\x4f\xcf\x2f\xaf\x6f\xef\x1f\x9f\x5f\xdf\x3f\xbf\x7f\xff" + +const len8tab = "" + + "\x00\x01\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\x04\x04\x04" + + "\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05" + + "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" + + "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" + + "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + + "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + + "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + + "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" diff --git a/gnovm/stdlibs/math/bits/bits_test.gno b/gnovm/stdlibs/math/bits/bits_test.gno new file mode 100644 index 00000000000..2efa8874c66 --- /dev/null +++ b/gnovm/stdlibs/math/bits/bits_test.gno @@ -0,0 +1,1332 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bits + +import ( + "testing" +) + +func TestLeadingZeros(t *testing.T) { + for i := 0; i < 256; i++ { + nlz := tab[i].nlz + for k := 0; k < 64-8; k++ { + x := uint64(i) << uint(k) + if x <= 1<<8-1 { + got := LeadingZeros8(uint8(x)) + want := nlz - k + (8 - 8) + if x == 0 { + want = 8 + } + if got != want { + t.Fatalf("LeadingZeros8(%#02x) == %d; want %d", x, got, want) + } + } + + if x <= 1<<16-1 { + got := LeadingZeros16(uint16(x)) + want := nlz - k + (16 - 8) + if x == 0 { + want = 16 + } + if got != want { + t.Fatalf("LeadingZeros16(%#04x) == %d; want %d", x, got, want) + } + } + + if x <= 1<<32-1 { + got := LeadingZeros32(uint32(x)) + want := nlz - k + (32 - 8) + if x == 0 { + want = 32 + } + if got != want { + t.Fatalf("LeadingZeros32(%#08x) == %d; want %d", x, got, want) + } + if UintSize == 32 { + got = LeadingZeros(uint(x)) + if got != want { + t.Fatalf("LeadingZeros(%#08x) == %d; want %d", x, got, want) + } + } + } + + if x <= 1<<64-1 { + got := LeadingZeros64(uint64(x)) + want := nlz - k + (64 - 8) + if x == 0 { + want = 64 + } + if got != want { + t.Fatalf("LeadingZeros64(%#016x) == %d; want %d", x, got, want) + } + if UintSize == 64 { + got = LeadingZeros(uint(x)) + if got != want { + t.Fatalf("LeadingZeros(%#016x) == %d; want %d", x, got, want) + } + } + } + } + } +} + +// Exported (global) variable serving as input for some +// of the benchmarks to ensure side-effect free calls +// are not optimized away. +var Input uint64 = DeBruijn64 + +// Exported (global) variable to store function results +// during benchmarking to ensure side-effect free calls +// are not optimized away. +var Output int + +func BenchmarkLeadingZeros(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += LeadingZeros(uint(Input) >> (uint(i) % UintSize)) + } + Output = s +} + +func BenchmarkLeadingZeros8(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += LeadingZeros8(uint8(Input) >> (uint(i) % 8)) + } + Output = s +} + +func BenchmarkLeadingZeros16(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += LeadingZeros16(uint16(Input) >> (uint(i) % 16)) + } + Output = s +} + +func BenchmarkLeadingZeros32(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += LeadingZeros32(uint32(Input) >> (uint(i) % 32)) + } + Output = s +} + +func BenchmarkLeadingZeros64(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += LeadingZeros64(uint64(Input) >> (uint(i) % 64)) + } + Output = s +} + +func TestTrailingZeros(t *testing.T) { + for i := 0; i < 256; i++ { + ntz := tab[i].ntz + for k := 0; k < 64-8; k++ { + x := uint64(i) << uint(k) + want := ntz + k + if x <= 1<<8-1 { + got := TrailingZeros8(uint8(x)) + if x == 0 { + want = 8 + } + if got != want { + t.Fatalf("TrailingZeros8(%#02x) == %d; want %d", x, got, want) + } + } + + if x <= 1<<16-1 { + got := TrailingZeros16(uint16(x)) + if x == 0 { + want = 16 + } + if got != want { + t.Fatalf("TrailingZeros16(%#04x) == %d; want %d", x, got, want) + } + } + + if x <= 1<<32-1 { + got := TrailingZeros32(uint32(x)) + if x == 0 { + want = 32 + } + if got != want { + t.Fatalf("TrailingZeros32(%#08x) == %d; want %d", x, got, want) + } + if UintSize == 32 { + got = TrailingZeros(uint(x)) + if got != want { + t.Fatalf("TrailingZeros(%#08x) == %d; want %d", x, got, want) + } + } + } + + if x <= 1<<64-1 { + got := TrailingZeros64(uint64(x)) + if x == 0 { + want = 64 + } + if got != want { + t.Fatalf("TrailingZeros64(%#016x) == %d; want %d", x, got, want) + } + if UintSize == 64 { + got = TrailingZeros(uint(x)) + if got != want { + t.Fatalf("TrailingZeros(%#016x) == %d; want %d", x, got, want) + } + } + } + } + } +} + +func BenchmarkTrailingZeros(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += TrailingZeros(uint(Input) << (uint(i) % UintSize)) + } + Output = s +} + +func BenchmarkTrailingZeros8(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += TrailingZeros8(uint8(Input) << (uint(i) % 8)) + } + Output = s +} + +func BenchmarkTrailingZeros16(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += TrailingZeros16(uint16(Input) << (uint(i) % 16)) + } + Output = s +} + +func BenchmarkTrailingZeros32(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += TrailingZeros32(uint32(Input) << (uint(i) % 32)) + } + Output = s +} + +func BenchmarkTrailingZeros64(b *testing.B) { + var s int + for i := 0; i < b.N; i++ { + s += TrailingZeros64(uint64(Input) << (uint(i) % 64)) + } + Output = s +} + +func TestOnesCount(t *testing.T) { + var x uint64 + for i := 0; i <= 64; i++ { + testOnesCount(t, x, i) + x = x<<1 | 1 + } + + for i := 64; i >= 0; i-- { + testOnesCount(t, x, i) + x = x << 1 + } + + for i := 0; i < 256; i++ { + for k := 0; k < 64-8; k++ { + testOnesCount(t, uint64(i)<>(8-k&0x7) + if got8 != want8 { + t.Fatalf("RotateLeft8(%#02x, %d) == %#02x; want %#02x", x8, k, got8, want8) + } + got8 = RotateLeft8(want8, -int(k)) + if got8 != x8 { + t.Fatalf("RotateLeft8(%#02x, -%d) == %#02x; want %#02x", want8, k, got8, x8) + } + + x16 := uint16(m) + got16 := RotateLeft16(x16, int(k)) + want16 := x16<<(k&0xf) | x16>>(16-k&0xf) + if got16 != want16 { + t.Fatalf("RotateLeft16(%#04x, %d) == %#04x; want %#04x", x16, k, got16, want16) + } + got16 = RotateLeft16(want16, -int(k)) + if got16 != x16 { + t.Fatalf("RotateLeft16(%#04x, -%d) == %#04x; want %#04x", want16, k, got16, x16) + } + + x32 := uint32(m) + got32 := RotateLeft32(x32, int(k)) + want32 := x32<<(k&0x1f) | x32>>(32-k&0x1f) + if got32 != want32 { + t.Fatalf("RotateLeft32(%#08x, %d) == %#08x; want %#08x", x32, k, got32, want32) + } + got32 = RotateLeft32(want32, -int(k)) + if got32 != x32 { + t.Fatalf("RotateLeft32(%#08x, -%d) == %#08x; want %#08x", want32, k, got32, x32) + } + if UintSize == 32 { + x := uint(m) + got := RotateLeft(x, int(k)) + want := x<<(k&0x1f) | x>>(32-k&0x1f) + if got != want { + t.Fatalf("RotateLeft(%#08x, %d) == %#08x; want %#08x", x, k, got, want) + } + got = RotateLeft(want, -int(k)) + if got != x { + t.Fatalf("RotateLeft(%#08x, -%d) == %#08x; want %#08x", want, k, got, x) + } + } + + x64 := uint64(m) + got64 := RotateLeft64(x64, int(k)) + want64 := x64<<(k&0x3f) | x64>>(64-k&0x3f) + if got64 != want64 { + t.Fatalf("RotateLeft64(%#016x, %d) == %#016x; want %#016x", x64, k, got64, want64) + } + got64 = RotateLeft64(want64, -int(k)) + if got64 != x64 { + t.Fatalf("RotateLeft64(%#016x, -%d) == %#016x; want %#016x", want64, k, got64, x64) + } + if UintSize == 64 { + x := uint(m) + got := RotateLeft(x, int(k)) + want := x<<(k&0x3f) | x>>(64-k&0x3f) + if got != want { + t.Fatalf("RotateLeft(%#016x, %d) == %#016x; want %#016x", x, k, got, want) + } + got = RotateLeft(want, -int(k)) + if got != x { + t.Fatalf("RotateLeft(%#08x, -%d) == %#08x; want %#08x", want, k, got, x) + } + } + } +} + +func BenchmarkRotateLeft(b *testing.B) { + var s uint + for i := 0; i < b.N; i++ { + s += RotateLeft(uint(Input), i) + } + Output = int(s) +} + +func BenchmarkRotateLeft8(b *testing.B) { + var s uint8 + for i := 0; i < b.N; i++ { + s += RotateLeft8(uint8(Input), i) + } + Output = int(s) +} + +func BenchmarkRotateLeft16(b *testing.B) { + var s uint16 + for i := 0; i < b.N; i++ { + s += RotateLeft16(uint16(Input), i) + } + Output = int(s) +} + +func BenchmarkRotateLeft32(b *testing.B) { + var s uint32 + for i := 0; i < b.N; i++ { + s += RotateLeft32(uint32(Input), i) + } + Output = int(s) +} + +func BenchmarkRotateLeft64(b *testing.B) { + var s uint64 + for i := 0; i < b.N; i++ { + s += RotateLeft64(uint64(Input), i) + } + Output = int(s) +} + +func TestReverse(t *testing.T) { + // test each bit + for i := uint(0); i < 64; i++ { + testReverse(t, uint64(1)<> (64 - 8)) + if got8 != want8 { + t.Fatalf("Reverse8(%#02x) == %#02x; want %#02x", x8, got8, want8) + } + + x16 := uint16(x64) + got16 := Reverse16(x16) + want16 := uint16(want64 >> (64 - 16)) + if got16 != want16 { + t.Fatalf("Reverse16(%#04x) == %#04x; want %#04x", x16, got16, want16) + } + + x32 := uint32(x64) + got32 := Reverse32(x32) + want32 := uint32(want64 >> (64 - 32)) + if got32 != want32 { + t.Fatalf("Reverse32(%#08x) == %#08x; want %#08x", x32, got32, want32) + } + if UintSize == 32 { + x := uint(x32) + got := Reverse(x) + want := uint(want32) + if got != want { + t.Fatalf("Reverse(%#08x) == %#08x; want %#08x", x, got, want) + } + } + + got64 := Reverse64(x64) + if got64 != want64 { + t.Fatalf("Reverse64(%#016x) == %#016x; want %#016x", x64, got64, want64) + } + if UintSize == 64 { + x := uint(x64) + got := Reverse(x) + want := uint(want64) + if got != want { + t.Fatalf("Reverse(%#08x) == %#016x; want %#016x", x, got, want) + } + } +} + +func BenchmarkReverse(b *testing.B) { + var s uint + for i := 0; i < b.N; i++ { + s += Reverse(uint(i)) + } + Output = int(s) +} + +func BenchmarkReverse8(b *testing.B) { + var s uint8 + for i := 0; i < b.N; i++ { + s += Reverse8(uint8(i)) + } + Output = int(s) +} + +func BenchmarkReverse16(b *testing.B) { + var s uint16 + for i := 0; i < b.N; i++ { + s += Reverse16(uint16(i)) + } + Output = int(s) +} + +func BenchmarkReverse32(b *testing.B) { + var s uint32 + for i := 0; i < b.N; i++ { + s += Reverse32(uint32(i)) + } + Output = int(s) +} + +func BenchmarkReverse64(b *testing.B) { + var s uint64 + for i := 0; i < b.N; i++ { + s += Reverse64(uint64(i)) + } + Output = int(s) +} + +func TestReverseBytes(t *testing.T) { + for _, test := range []struct { + x, r uint64 + }{ + {0, 0}, + {0x01, 0x01 << 56}, + {0x0123, 0x2301 << 48}, + {0x012345, 0x452301 << 40}, + {0x01234567, 0x67452301 << 32}, + {0x0123456789, 0x8967452301 << 24}, + {0x0123456789ab, 0xab8967452301 << 16}, + {0x0123456789abcd, 0xcdab8967452301 << 8}, + {0x0123456789abcdef, 0xefcdab8967452301 << 0}, + } { + testReverseBytes(t, test.x, test.r) + testReverseBytes(t, test.r, test.x) + } +} + +func testReverseBytes(t *testing.T, x64, want64 uint64) { + x16 := uint16(x64) + got16 := ReverseBytes16(x16) + want16 := uint16(want64 >> (64 - 16)) + if got16 != want16 { + t.Fatalf("ReverseBytes16(%#04x) == %#04x; want %#04x", x16, got16, want16) + } + + x32 := uint32(x64) + got32 := ReverseBytes32(x32) + want32 := uint32(want64 >> (64 - 32)) + if got32 != want32 { + t.Fatalf("ReverseBytes32(%#08x) == %#08x; want %#08x", x32, got32, want32) + } + if UintSize == 32 { + x := uint(x32) + got := ReverseBytes(x) + want := uint(want32) + if got != want { + t.Fatalf("ReverseBytes(%#08x) == %#08x; want %#08x", x, got, want) + } + } + + got64 := ReverseBytes64(x64) + if got64 != want64 { + t.Fatalf("ReverseBytes64(%#016x) == %#016x; want %#016x", x64, got64, want64) + } + if UintSize == 64 { + x := uint(x64) + got := ReverseBytes(x) + want := uint(want64) + if got != want { + t.Fatalf("ReverseBytes(%#016x) == %#016x; want %#016x", x, got, want) + } + } +} + +func BenchmarkReverseBytes(b *testing.B) { + var s uint + for i := 0; i < b.N; i++ { + s += ReverseBytes(uint(i)) + } + Output = int(s) +} + +func BenchmarkReverseBytes16(b *testing.B) { + var s uint16 + for i := 0; i < b.N; i++ { + s += ReverseBytes16(uint16(i)) + } + Output = int(s) +} + +func BenchmarkReverseBytes32(b *testing.B) { + var s uint32 + for i := 0; i < b.N; i++ { + s += ReverseBytes32(uint32(i)) + } + Output = int(s) +} + +func BenchmarkReverseBytes64(b *testing.B) { + var s uint64 + for i := 0; i < b.N; i++ { + s += ReverseBytes64(uint64(i)) + } + Output = int(s) +} + +func TestLen(t *testing.T) { + for i := 0; i < 256; i++ { + len := 8 - tab[i].nlz + for k := 0; k < 64-8; k++ { + x := uint64(i) << uint(k) + want := 0 + if x != 0 { + want = len + k + } + if x <= 1<<8-1 { + got := Len8(uint8(x)) + if got != want { + t.Fatalf("Len8(%#02x) == %d; want %d", x, got, want) + } + } + + if x <= 1<<16-1 { + got := Len16(uint16(x)) + if got != want { + t.Fatalf("Len16(%#04x) == %d; want %d", x, got, want) + } + } + + if x <= 1<<32-1 { + got := Len32(uint32(x)) + if got != want { + t.Fatalf("Len32(%#08x) == %d; want %d", x, got, want) + } + if UintSize == 32 { + got := Len(uint(x)) + if got != want { + t.Fatalf("Len(%#08x) == %d; want %d", x, got, want) + } + } + } + + if x <= 1<<64-1 { + got := Len64(uint64(x)) + if got != want { + t.Fatalf("Len64(%#016x) == %d; want %d", x, got, want) + } + if UintSize == 64 { + got := Len(uint(x)) + if got != want { + t.Fatalf("Len(%#016x) == %d; want %d", x, got, want) + } + } + } + } + } +} + +const ( + _M = 1< 0 { + panic("overflow") + } + return x + }, + func(a, b uint64) uint64 { + x, c := Add64(a, b, 0) + if c != 0 { + panic("overflow") + } + return x + }, + func(a, b uint64) uint64 { + x, c := Add64(a, b, 0) + if c == 1 { + panic("overflow") + } + return x + }, + func(a, b uint64) uint64 { + x, c := Add64(a, b, 0) + if c != 1 { + return x + } + panic("overflow") + }, + func(a, b uint64) uint64 { + x, c := Add64(a, b, 0) + if c == 0 { + return x + } + panic("overflow") + }, + } + for _, test := range tests { + shouldPanic := func(f func()) { + defer func() { + if err := recover(); err == nil { + t.Fatalf("expected panic") + } + }() + f() + } + + // overflow + shouldPanic(func() { test(_M64, 1) }) + shouldPanic(func() { test(1, _M64) }) + shouldPanic(func() { test(_M64, _M64) }) + + // no overflow + test(_M64, 0) + test(0, 0) + test(1, 1) + } +} + +func TestSub64OverflowPanic(t *testing.T) { + // Test that 64-bit overflow panics fire correctly. + // These are designed to improve coverage of compiler intrinsics. + tests := []func(uint64, uint64) uint64{ + func(a, b uint64) uint64 { + x, c := Sub64(a, b, 0) + if c > 0 { + panic("overflow") + } + return x + }, + func(a, b uint64) uint64 { + x, c := Sub64(a, b, 0) + if c != 0 { + panic("overflow") + } + return x + }, + func(a, b uint64) uint64 { + x, c := Sub64(a, b, 0) + if c == 1 { + panic("overflow") + } + return x + }, + func(a, b uint64) uint64 { + x, c := Sub64(a, b, 0) + if c != 1 { + return x + } + panic("overflow") + }, + func(a, b uint64) uint64 { + x, c := Sub64(a, b, 0) + if c == 0 { + return x + } + panic("overflow") + }, + } + for _, test := range tests { + shouldPanic := func(f func()) { + defer func() { + if err := recover(); err == nil { + t.Fatalf("expected panic") + } + }() + f() + } + + // overflow + shouldPanic(func() { test(0, 1) }) + shouldPanic(func() { test(1, _M64) }) + shouldPanic(func() { test(_M64-1, _M64) }) + + // no overflow + test(_M64, 0) + test(0, 0) + test(1, 1) + } +} + +func TestMulDiv(t *testing.T) { + testMul := func(msg string, f func(x, y uint) (hi, lo uint), x, y, hi, lo uint) { + hi1, lo1 := f(x, y) + if hi1 != hi || lo1 != lo { + t.Errorf("%s: got hi:lo = %#x:%#x; want %#x:%#x", msg, hi1, lo1, hi, lo) + } + } + testDiv := func(msg string, f func(hi, lo, y uint) (q, r uint), hi, lo, y, q, r uint) { + q1, r1 := f(hi, lo, y) + if q1 != q || r1 != r { + t.Errorf("%s: got q:r = %#x:%#x; want %#x:%#x", msg, q1, r1, q, r) + } + } + for _, a := range []struct { + x, y uint + hi, lo, r uint + }{ + {1 << (UintSize - 1), 2, 1, 0, 1}, + {_M, _M, _M - 1, 1, 42}, + } { + testMul("Mul", Mul, a.x, a.y, a.hi, a.lo) + testMul("Mul symmetric", Mul, a.y, a.x, a.hi, a.lo) + testDiv("Div", Div, a.hi, a.lo+a.r, a.y, a.x, a.r) + testDiv("Div symmetric", Div, a.hi, a.lo+a.r, a.x, a.y, a.r) + // The above code can't test intrinsic implementation, because the passed function is not called directly. + // The following code uses a closure to test the intrinsic version in case the function is intrinsified. + testMul("Mul intrinsic", func(x, y uint) (uint, uint) { return Mul(x, y) }, a.x, a.y, a.hi, a.lo) + testMul("Mul intrinsic symmetric", func(x, y uint) (uint, uint) { return Mul(x, y) }, a.y, a.x, a.hi, a.lo) + testDiv("Div intrinsic", func(hi, lo, y uint) (uint, uint) { return Div(hi, lo, y) }, a.hi, a.lo+a.r, a.y, a.x, a.r) + testDiv("Div intrinsic symmetric", func(hi, lo, y uint) (uint, uint) { return Div(hi, lo, y) }, a.hi, a.lo+a.r, a.x, a.y, a.r) + } +} + +func TestMulDiv32(t *testing.T) { + testMul := func(msg string, f func(x, y uint32) (hi, lo uint32), x, y, hi, lo uint32) { + hi1, lo1 := f(x, y) + if hi1 != hi || lo1 != lo { + t.Errorf("%s: got hi:lo = %#x:%#x; want %#x:%#x", msg, hi1, lo1, hi, lo) + } + } + testDiv := func(msg string, f func(hi, lo, y uint32) (q, r uint32), hi, lo, y, q, r uint32) { + q1, r1 := f(hi, lo, y) + if q1 != q || r1 != r { + t.Errorf("%s: got q:r = %#x:%#x; want %#x:%#x", msg, q1, r1, q, r) + } + } + for _, a := range []struct { + x, y uint32 + hi, lo, r uint32 + }{ + {1 << 31, 2, 1, 0, 1}, + {0xc47dfa8c, 50911, 0x98a4, 0x998587f4, 13}, + {_M32, _M32, _M32 - 1, 1, 42}, + } { + testMul("Mul32", Mul32, a.x, a.y, a.hi, a.lo) + testMul("Mul32 symmetric", Mul32, a.y, a.x, a.hi, a.lo) + testDiv("Div32", Div32, a.hi, a.lo+a.r, a.y, a.x, a.r) + testDiv("Div32 symmetric", Div32, a.hi, a.lo+a.r, a.x, a.y, a.r) + } +} + +func TestMulDiv64(t *testing.T) { + testMul := func(msg string, f func(x, y uint64) (hi, lo uint64), x, y, hi, lo uint64) { + hi1, lo1 := f(x, y) + if hi1 != hi || lo1 != lo { + t.Errorf("%s: got hi:lo = %#x:%#x; want %#x:%#x", msg, hi1, lo1, hi, lo) + } + } + testDiv := func(msg string, f func(hi, lo, y uint64) (q, r uint64), hi, lo, y, q, r uint64) { + q1, r1 := f(hi, lo, y) + if q1 != q || r1 != r { + t.Errorf("%s: got q:r = %#x:%#x; want %#x:%#x", msg, q1, r1, q, r) + } + } + for _, a := range []struct { + x, y uint64 + hi, lo, r uint64 + }{ + {1 << 63, 2, 1, 0, 1}, + {0x3626229738a3b9, 0xd8988a9f1cc4a61, 0x2dd0712657fe8, 0x9dd6a3364c358319, 13}, + {_M64, _M64, _M64 - 1, 1, 42}, + } { + testMul("Mul64", Mul64, a.x, a.y, a.hi, a.lo) + testMul("Mul64 symmetric", Mul64, a.y, a.x, a.hi, a.lo) + testDiv("Div64", Div64, a.hi, a.lo+a.r, a.y, a.x, a.r) + testDiv("Div64 symmetric", Div64, a.hi, a.lo+a.r, a.x, a.y, a.r) + // The above code can't test intrinsic implementation, because the passed function is not called directly. + // The following code uses a closure to test the intrinsic version in case the function is intrinsified. + testMul("Mul64 intrinsic", func(x, y uint64) (uint64, uint64) { return Mul64(x, y) }, a.x, a.y, a.hi, a.lo) + testMul("Mul64 intrinsic symmetric", func(x, y uint64) (uint64, uint64) { return Mul64(x, y) }, a.y, a.x, a.hi, a.lo) + testDiv("Div64 intrinsic", func(hi, lo, y uint64) (uint64, uint64) { return Div64(hi, lo, y) }, a.hi, a.lo+a.r, a.y, a.x, a.r) + testDiv("Div64 intrinsic symmetric", func(hi, lo, y uint64) (uint64, uint64) { return Div64(hi, lo, y) }, a.hi, a.lo+a.r, a.x, a.y, a.r) + } +} + +func TestDivPanicOverflow(t *testing.T) { + // Expect a panic + defer func() { + if err := recover(); err == nil { + t.Error("Div should have panicked when y<=hi") + } else if err != overflowError { + t.Errorf("Div expected panic: %q, got: %v ", overflowError, err) + } + }() + q, r := Div(1, 0, 1) + t.Errorf("undefined q, r = %v, %v calculated when Div should have panicked", q, r) +} + +func TestDiv32PanicOverflow(t *testing.T) { + // Expect a panic + defer func() { + if err := recover(); err == nil { + t.Error("Div32 should have panicked when y<=hi") + } else if err != overflowError { + t.Errorf("Div32 expected panic: %q, got: %v ", overflowError, err) + } + }() + q, r := Div32(1, 0, 1) + t.Errorf("undefined q, r = %v, %v calculated when Div32 should have panicked", q, r) +} + +func TestDiv64PanicOverflow(t *testing.T) { + // Expect a panic + defer func() { + if err := recover(); err == nil { + t.Error("Div64 should have panicked when y<=hi") + } else if err != overflowError { + t.Errorf("Div64 expected panic: %q, got: %v ", overflowError, err) + } + }() + q, r := Div64(1, 0, 1) + t.Errorf("undefined q, r = %v, %v calculated when Div64 should have panicked", q, r) +} + +func TestDivPanicZero(t *testing.T) { + // Expect a panic + defer func() { + if err := recover(); err == nil { + t.Error("Div should have panicked when y==0") + } else if err != divideError { + t.Errorf("Div expected panic: %q, got: %q ", divideError, err) + } + }() + q, r := Div(1, 1, 0) + t.Errorf("undefined q, r = %v, %v calculated when Div should have panicked", q, r) +} + +func TestDiv32PanicZero(t *testing.T) { + // Expect a panic + defer func() { + if err := recover(); err == nil { + t.Error("Div32 should have panicked when y==0") + } else if err != divideError { + t.Errorf("Div32 expected panic: %q, got: %q ", divideError, err) + } + }() + q, r := Div32(1, 1, 0) + t.Errorf("undefined q, r = %v, %v calculated when Div32 should have panicked", q, r) +} + +func TestDiv64PanicZero(t *testing.T) { + // Expect a panic + defer func() { + if err := recover(); err == nil { + t.Error("Div64 should have panicked when y==0") + } else if err != divideError { + t.Errorf("Div64 expected panic: %q, got: %q ", divideError, err) + } + }() + q, r := Div64(1, 1, 0) + t.Errorf("undefined q, r = %v, %v calculated when Div64 should have panicked", q, r) +} + +func TestRem32(t *testing.T) { + // Sanity check: for non-oveflowing dividends, the result is the + // same as the rem returned by Div32 + hi, lo, y := uint32(510510), uint32(9699690), uint32(510510+1) // ensure hi < y + for i := 0; i < 1000; i++ { + r := Rem32(hi, lo, y) + _, r2 := Div32(hi, lo, y) + if r != r2 { + t.Errorf("Rem32(%v, %v, %v) returned %v, but Div32 returned rem %v", hi, lo, y, r, r2) + } + y += 13 + } +} + +func TestRem32Overflow(t *testing.T) { + // To trigger a quotient overflow, we need y <= hi + hi, lo, y := uint32(510510), uint32(9699690), uint32(7) + for i := 0; i < 1000; i++ { + r := Rem32(hi, lo, y) + _, r2 := Div64(0, uint64(hi)<<32|uint64(lo), uint64(y)) + if r != uint32(r2) { + t.Errorf("Rem32(%v, %v, %v) returned %v, but Div64 returned rem %v", hi, lo, y, r, r2) + } + y += 13 + } +} + +func TestRem64(t *testing.T) { + // Sanity check: for non-oveflowing dividends, the result is the + // same as the rem returned by Div64 + hi, lo, y := uint64(510510), uint64(9699690), uint64(510510+1) // ensure hi < y + for i := 0; i < 1000; i++ { + r := Rem64(hi, lo, y) + _, r2 := Div64(hi, lo, y) + if r != r2 { + t.Errorf("Rem64(%v, %v, %v) returned %v, but Div64 returned rem %v", hi, lo, y, r, r2) + } + y += 13 + } +} + +func TestRem64Overflow(t *testing.T) { + Rem64Tests := []struct { + hi, lo, y uint64 + rem uint64 + }{ + // Testcases computed using Python 3, as: + // >>> hi = 42; lo = 1119; y = 42 + // >>> ((hi<<64)+lo) % y + {42, 1119, 42, 27}, + {42, 1119, 38, 9}, + {42, 1119, 26, 23}, + {469, 0, 467, 271}, + {469, 0, 113, 58}, + {111111, 111111, 1171, 803}, + {3968194946088682615, 3192705705065114702, 1000037, 56067}, + } + + for _, rt := range Rem64Tests { + if rt.hi < rt.y { + t.Fatalf("Rem64(%v, %v, %v) is not a test with quo overflow", rt.hi, rt.lo, rt.y) + } + rem := Rem64(rt.hi, rt.lo, rt.y) + if rem != rt.rem { + t.Errorf("Rem64(%v, %v, %v) returned %v, wanted %v", + rt.hi, rt.lo, rt.y, rem, rt.rem) + } + } +} + +func BenchmarkAdd(b *testing.B) { + var z, c uint + for i := 0; i < b.N; i++ { + z, c = Add(uint(Input), uint(i), c) + } + Output = int(z + c) +} + +func BenchmarkAdd32(b *testing.B) { + var z, c uint32 + for i := 0; i < b.N; i++ { + z, c = Add32(uint32(Input), uint32(i), c) + } + Output = int(z + c) +} + +func BenchmarkAdd64(b *testing.B) { + var z, c uint64 + for i := 0; i < b.N; i++ { + z, c = Add64(uint64(Input), uint64(i), c) + } + Output = int(z + c) +} + +func BenchmarkAdd64multiple(b *testing.B) { + z0 := uint64(Input) + z1 := uint64(Input) + z2 := uint64(Input) + z3 := uint64(Input) + for i := 0; i < b.N; i++ { + var c uint64 + z0, c = Add64(z0, uint64(i), c) + z1, c = Add64(z1, uint64(i), c) + z2, c = Add64(z2, uint64(i), c) + z3, _ = Add64(z3, uint64(i), c) + } + Output = int(z0 + z1 + z2 + z3) +} + +func BenchmarkSub(b *testing.B) { + var z, c uint + for i := 0; i < b.N; i++ { + z, c = Sub(uint(Input), uint(i), c) + } + Output = int(z + c) +} + +func BenchmarkSub32(b *testing.B) { + var z, c uint32 + for i := 0; i < b.N; i++ { + z, c = Sub32(uint32(Input), uint32(i), c) + } + Output = int(z + c) +} + +func BenchmarkSub64(b *testing.B) { + var z, c uint64 + for i := 0; i < b.N; i++ { + z, c = Sub64(uint64(Input), uint64(i), c) + } + Output = int(z + c) +} + +func BenchmarkSub64multiple(b *testing.B) { + z0 := uint64(Input) + z1 := uint64(Input) + z2 := uint64(Input) + z3 := uint64(Input) + for i := 0; i < b.N; i++ { + var c uint64 + z0, c = Sub64(z0, uint64(i), c) + z1, c = Sub64(z1, uint64(i), c) + z2, c = Sub64(z2, uint64(i), c) + z3, _ = Sub64(z3, uint64(i), c) + } + Output = int(z0 + z1 + z2 + z3) +} + +func BenchmarkMul(b *testing.B) { + var hi, lo uint + for i := 0; i < b.N; i++ { + hi, lo = Mul(uint(Input), uint(i)) + } + Output = int(hi + lo) +} + +func BenchmarkMul32(b *testing.B) { + var hi, lo uint32 + for i := 0; i < b.N; i++ { + hi, lo = Mul32(uint32(Input), uint32(i)) + } + Output = int(hi + lo) +} + +func BenchmarkMul64(b *testing.B) { + var hi, lo uint64 + for i := 0; i < b.N; i++ { + hi, lo = Mul64(uint64(Input), uint64(i)) + } + Output = int(hi + lo) +} + +func BenchmarkDiv(b *testing.B) { + var q, r uint + for i := 0; i < b.N; i++ { + q, r = Div(1, uint(i), uint(Input)) + } + Output = int(q + r) +} + +func BenchmarkDiv32(b *testing.B) { + var q, r uint32 + for i := 0; i < b.N; i++ { + q, r = Div32(1, uint32(i), uint32(Input)) + } + Output = int(q + r) +} + +func BenchmarkDiv64(b *testing.B) { + var q, r uint64 + for i := 0; i < b.N; i++ { + q, r = Div64(1, uint64(i), uint64(Input)) + } + Output = int(q + r) +} + +// ---------------------------------------------------------------------------- +// Testing support + +type entry = struct { + nlz, ntz, pop int +} + +// tab contains results for all uint8 values +var tab [256]entry + +func init() { + tab[0] = entry{8, 8, 0} + for i := 1; i < len(tab); i++ { + // nlz + x := i // x != 0 + n := 0 + for x&0x80 == 0 { + n++ + x <<= 1 + } + tab[i].nlz = n + + // ntz + x = i // x != 0 + n = 0 + for x&1 == 0 { + n++ + x >>= 1 + } + tab[i].ntz = n + + // pop + x = i // x != 0 + n = 0 + for x != 0 { + n += int(x & 1) + x >>= 1 + } + tab[i].pop = n + } +} diff --git a/gnovm/stdlibs/math/bits/export_test.gno b/gnovm/stdlibs/math/bits/export_test.gno new file mode 100644 index 00000000000..8c6f9332cca --- /dev/null +++ b/gnovm/stdlibs/math/bits/export_test.gno @@ -0,0 +1,7 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bits + +const DeBruijn64 = deBruijn64 diff --git a/gnovm/stdlibs/math/cbrt.gno b/gnovm/stdlibs/math/cbrt.gno new file mode 100644 index 00000000000..b8e6c3e8012 --- /dev/null +++ b/gnovm/stdlibs/math/cbrt.gno @@ -0,0 +1,82 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The go code is a modified version of the original C code from +// http://www.netlib.org/fdlibm/s_cbrt.c and came with this notice. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunSoft, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== + +// Cbrt returns the cube root of x. +// +// Special cases are: +// +// Cbrt(±0) = ±0 +// Cbrt(±Inf) = ±Inf +// Cbrt(NaN) = NaN +func Cbrt(x float64) float64 { + return cbrt(x) +} + +func cbrt(x float64) float64 { + const ( + B1 = 715094163 // (682-0.03306235651)*2**20 + B2 = 696219795 // (664-0.03306235651)*2**20 + C = 5.42857142857142815906e-01 // 19/35 = 0x3FE15F15F15F15F1 + D = -7.05306122448979611050e-01 // -864/1225 = 0xBFE691DE2532C834 + E = 1.41428571428571436819e+00 // 99/70 = 0x3FF6A0EA0EA0EA0F + F = 1.60714285714285720630e+00 // 45/28 = 0x3FF9B6DB6DB6DB6E + G = 3.57142857142857150787e-01 // 5/14 = 0x3FD6DB6DB6DB6DB7 + SmallestNormal = 2.22507385850720138309e-308 // 2**-1022 = 0x0010000000000000 + ) + // special cases + switch { + case x == 0 || IsNaN(x) || IsInf(x, 0): + return x + } + + sign := false + if x < 0 { + x = -x + sign = true + } + + // rough cbrt to 5 bits + t := Float64frombits(Float64bits(x)/3 + B1<<32) + if x < SmallestNormal { + // subnormal number + t = float64(1 << 54) // set t= 2**54 + t *= x + t = Float64frombits(Float64bits(t)/3 + B2<<32) + } + + // new cbrt to 23 bits + r := t * t / x + s := C + r*t + t *= G + F/(s+E+D/s) + + // chop to 22 bits, make larger than cbrt(x) + t = Float64frombits(Float64bits(t)&(0xFFFFFFFFC<<28) + 1<<30) + + // one step newton iteration to 53 bits with error less than 0.667ulps + s = t * t // t*t is exact + r = x / s + w := t + t + r = (r - t) / (w + r) // r-s is exact + t = t + t*r + + // restore the sign bit + if sign { + t = -t + } + return t +} diff --git a/gnovm/stdlibs/math/const.gno b/gnovm/stdlibs/math/const.gno index 5ea935fb425..ad13d53477e 100644 --- a/gnovm/stdlibs/math/const.gno +++ b/gnovm/stdlibs/math/const.gno @@ -39,19 +39,19 @@ const ( const ( intSize = 32 << (^uint(0) >> 63) // 32 or 64 - MaxInt = 1<<(intSize-1) - 1 - MinInt = -1 << (intSize - 1) - MaxInt8 = 1<<7 - 1 - MinInt8 = -1 << 7 - MaxInt16 = 1<<15 - 1 - MinInt16 = -1 << 15 - MaxInt32 = 1<<31 - 1 - MinInt32 = -1 << 31 - MaxInt64 = 1<<63 - 1 - MinInt64 = -1 << 63 - MaxUint = 1< y { + return x + } + return y +} + +// Min returns the smaller of x or y. +// +// Special cases are: +// +// Min(x, -Inf) = Min(-Inf, x) = -Inf +// Min(x, NaN) = Min(NaN, x) = NaN +// Min(-0, ±0) = Min(±0, -0) = -0 +func Min(x, y float64) float64 { + return min(x, y) +} + +func min(x, y float64) float64 { + // special cases + switch { + case IsInf(x, -1) || IsInf(y, -1): + return Inf(-1) + case IsNaN(x) || IsNaN(y): + return NaN() + case x == 0 && x == y: + if Signbit(x) { + return x + } + return y + } + if x < y { + return x + } + return y +} diff --git a/gnovm/stdlibs/math/erf.gno b/gnovm/stdlibs/math/erf.gno new file mode 100644 index 00000000000..717a812caa1 --- /dev/null +++ b/gnovm/stdlibs/math/erf.gno @@ -0,0 +1,345 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Floating-point error function and complementary error function. +*/ + +// The original C code and the long comment below are +// from FreeBSD's /usr/src/lib/msun/src/s_erf.c and +// came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// +// double erf(double x) +// double erfc(double x) +// x +// 2 |\ +// erf(x) = --------- | exp(-t*t)dt +// sqrt(pi) \| +// 0 +// +// erfc(x) = 1-erf(x) +// Note that +// erf(-x) = -erf(x) +// erfc(-x) = 2 - erfc(x) +// +// Method: +// 1. For |x| in [0, 0.84375] +// erf(x) = x + x*R(x**2) +// erfc(x) = 1 - erf(x) if x in [-.84375,0.25] +// = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375] +// where R = P/Q where P is an odd poly of degree 8 and +// Q is an odd poly of degree 10. +// -57.90 +// | R - (erf(x)-x)/x | <= 2 +// +// +// Remark. The formula is derived by noting +// erf(x) = (2/sqrt(pi))*(x - x**3/3 + x**5/10 - x**7/42 + ....) +// and that +// 2/sqrt(pi) = 1.128379167095512573896158903121545171688 +// is close to one. The interval is chosen because the fix +// point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is +// near 0.6174), and by some experiment, 0.84375 is chosen to +// guarantee the error is less than one ulp for erf. +// +// 2. For |x| in [0.84375,1.25], let s = |x| - 1, and +// c = 0.84506291151 rounded to single (24 bits) +// erf(x) = sign(x) * (c + P1(s)/Q1(s)) +// erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0 +// 1+(c+P1(s)/Q1(s)) if x < 0 +// |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06 +// Remark: here we use the taylor series expansion at x=1. +// erf(1+s) = erf(1) + s*Poly(s) +// = 0.845.. + P1(s)/Q1(s) +// That is, we use rational approximation to approximate +// erf(1+s) - (c = (single)0.84506291151) +// Note that |P1/Q1|< 0.078 for x in [0.84375,1.25] +// where +// P1(s) = degree 6 poly in s +// Q1(s) = degree 6 poly in s +// +// 3. For x in [1.25,1/0.35(~2.857143)], +// erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1) +// erf(x) = 1 - erfc(x) +// where +// R1(z) = degree 7 poly in z, (z=1/x**2) +// S1(z) = degree 8 poly in z +// +// 4. For x in [1/0.35,28] +// erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0 +// = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6 x >= 28 +// erf(x) = sign(x) *(1 - tiny) (raise inexact) +// erfc(x) = tiny*tiny (raise underflow) if x > 0 +// = 2 - tiny if x<0 +// +// 7. Special case: +// erf(0) = 0, erf(inf) = 1, erf(-inf) = -1, +// erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2, +// erfc/erf(NaN) is NaN + +const ( + erx = 8.45062911510467529297e-01 // 0x3FEB0AC160000000 + // Coefficients for approximation to erf in [0, 0.84375] + efx = 1.28379167095512586316e-01 // 0x3FC06EBA8214DB69 + efx8 = 1.02703333676410069053e+00 // 0x3FF06EBA8214DB69 + pp0 = 1.28379167095512558561e-01 // 0x3FC06EBA8214DB68 + pp1 = -3.25042107247001499370e-01 // 0xBFD4CD7D691CB913 + pp2 = -2.84817495755985104766e-02 // 0xBF9D2A51DBD7194F + pp3 = -5.77027029648944159157e-03 // 0xBF77A291236668E4 + pp4 = -2.37630166566501626084e-05 // 0xBEF8EAD6120016AC + qq1 = 3.97917223959155352819e-01 // 0x3FD97779CDDADC09 + qq2 = 6.50222499887672944485e-02 // 0x3FB0A54C5536CEBA + qq3 = 5.08130628187576562776e-03 // 0x3F74D022C4D36B0F + qq4 = 1.32494738004321644526e-04 // 0x3F215DC9221C1A10 + qq5 = -3.96022827877536812320e-06 // 0xBED09C4342A26120 + // Coefficients for approximation to erf in [0.84375, 1.25] + pa0 = -2.36211856075265944077e-03 // 0xBF6359B8BEF77538 + pa1 = 4.14856118683748331666e-01 // 0x3FDA8D00AD92B34D + pa2 = -3.72207876035701323847e-01 // 0xBFD7D240FBB8C3F1 + pa3 = 3.18346619901161753674e-01 // 0x3FD45FCA805120E4 + pa4 = -1.10894694282396677476e-01 // 0xBFBC63983D3E28EC + pa5 = 3.54783043256182359371e-02 // 0x3FA22A36599795EB + pa6 = -2.16637559486879084300e-03 // 0xBF61BF380A96073F + qa1 = 1.06420880400844228286e-01 // 0x3FBB3E6618EEE323 + qa2 = 5.40397917702171048937e-01 // 0x3FE14AF092EB6F33 + qa3 = 7.18286544141962662868e-02 // 0x3FB2635CD99FE9A7 + qa4 = 1.26171219808761642112e-01 // 0x3FC02660E763351F + qa5 = 1.36370839120290507362e-02 // 0x3F8BEDC26B51DD1C + qa6 = 1.19844998467991074170e-02 // 0x3F888B545735151D + // Coefficients for approximation to erfc in [1.25, 1/0.35] + ra0 = -9.86494403484714822705e-03 // 0xBF843412600D6435 + ra1 = -6.93858572707181764372e-01 // 0xBFE63416E4BA7360 + ra2 = -1.05586262253232909814e+01 // 0xC0251E0441B0E726 + ra3 = -6.23753324503260060396e+01 // 0xC04F300AE4CBA38D + ra4 = -1.62396669462573470355e+02 // 0xC0644CB184282266 + ra5 = -1.84605092906711035994e+02 // 0xC067135CEBCCABB2 + ra6 = -8.12874355063065934246e+01 // 0xC054526557E4D2F2 + ra7 = -9.81432934416914548592e+00 // 0xC023A0EFC69AC25C + sa1 = 1.96512716674392571292e+01 // 0x4033A6B9BD707687 + sa2 = 1.37657754143519042600e+02 // 0x4061350C526AE721 + sa3 = 4.34565877475229228821e+02 // 0x407B290DD58A1A71 + sa4 = 6.45387271733267880336e+02 // 0x40842B1921EC2868 + sa5 = 4.29008140027567833386e+02 // 0x407AD02157700314 + sa6 = 1.08635005541779435134e+02 // 0x405B28A3EE48AE2C + sa7 = 6.57024977031928170135e+00 // 0x401A47EF8E484A93 + sa8 = -6.04244152148580987438e-02 // 0xBFAEEFF2EE749A62 + // Coefficients for approximation to erfc in [1/.35, 28] + rb0 = -9.86494292470009928597e-03 // 0xBF84341239E86F4A + rb1 = -7.99283237680523006574e-01 // 0xBFE993BA70C285DE + rb2 = -1.77579549177547519889e+01 // 0xC031C209555F995A + rb3 = -1.60636384855821916062e+02 // 0xC064145D43C5ED98 + rb4 = -6.37566443368389627722e+02 // 0xC083EC881375F228 + rb5 = -1.02509513161107724954e+03 // 0xC09004616A2E5992 + rb6 = -4.83519191608651397019e+02 // 0xC07E384E9BDC383F + sb1 = 3.03380607434824582924e+01 // 0x403E568B261D5190 + sb2 = 3.25792512996573918826e+02 // 0x40745CAE221B9F0A + sb3 = 1.53672958608443695994e+03 // 0x409802EB189D5118 + sb4 = 3.19985821950859553908e+03 // 0x40A8FFB7688C246A + sb5 = 2.55305040643316442583e+03 // 0x40A3F219CEDF3BE6 + sb6 = 4.74528541206955367215e+02 // 0x407DA874E79FE763 + sb7 = -2.24409524465858183362e+01 // 0xC03670E242712D62 +) + +// Erf returns the error function of x. +// +// Special cases are: +// +// Erf(+Inf) = 1 +// Erf(-Inf) = -1 +// Erf(NaN) = NaN +func Erf(x float64) float64 { + return erf(x) +} + +func erf(x float64) float64 { + const ( + VeryTiny = 2.848094538889218e-306 // 0x0080000000000000 + Small = 1.0 / (1 << 28) // 2**-28 + ) + // special cases + switch { + case IsNaN(x): + return NaN() + case IsInf(x, 1): + return 1 + case IsInf(x, -1): + return -1 + } + sign := false + if x < 0 { + x = -x + sign = true + } + if x < 0.84375 { // |x| < 0.84375 + var temp float64 + if x < Small { // |x| < 2**-28 + if x < VeryTiny { + temp = 0.125 * (8.0*x + efx8*x) // avoid underflow + } else { + temp = x + efx*x + } + } else { + z := x * x + r := pp0 + z*(pp1+z*(pp2+z*(pp3+z*pp4))) + s := 1 + z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))) + y := r / s + temp = x + x*y + } + if sign { + return -temp + } + return temp + } + if x < 1.25 { // 0.84375 <= |x| < 1.25 + s := x - 1 + P := pa0 + s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))) + Q := 1 + s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))) + if sign { + return -erx - P/Q + } + return erx + P/Q + } + if x >= 6 { // inf > |x| >= 6 + if sign { + return -1 + } + return 1 + } + s := 1 / (x * x) + var R, S float64 + if x < 1/0.35 { // |x| < 1 / 0.35 ~ 2.857143 + R = ra0 + s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*ra7)))))) + S = 1 + s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+s*sa8))))))) + } else { // |x| >= 1 / 0.35 ~ 2.857143 + R = rb0 + s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*rb6))))) + S = 1 + s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7)))))) + } + z := Float64frombits(Float64bits(x) & 0xffffffff00000000) // pseudo-single (20-bit) precision x + r := Exp(-z*z-0.5625) * Exp((z-x)*(z+x)+R/S) + if sign { + return r/x - 1 + } + return 1 - r/x +} + +// Erfc returns the complementary error function of x. +// +// Special cases are: +// +// Erfc(+Inf) = 0 +// Erfc(-Inf) = 2 +// Erfc(NaN) = NaN +func Erfc(x float64) float64 { + return erfc(x) +} + +func erfc(x float64) float64 { + const Tiny = 1.0 / (1 << 56) // 2**-56 + // special cases + switch { + case IsNaN(x): + return NaN() + case IsInf(x, 1): + return 0 + case IsInf(x, -1): + return 2 + } + sign := false + if x < 0 { + x = -x + sign = true + } + if x < 0.84375 { // |x| < 0.84375 + var temp float64 + if x < Tiny { // |x| < 2**-56 + temp = x + } else { + z := x * x + r := pp0 + z*(pp1+z*(pp2+z*(pp3+z*pp4))) + s := 1 + z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))) + y := r / s + if x < 0.25 { // |x| < 1/4 + temp = x + x*y + } else { + temp = 0.5 + (x*y + (x - 0.5)) + } + } + if sign { + return 1 + temp + } + return 1 - temp + } + if x < 1.25 { // 0.84375 <= |x| < 1.25 + s := x - 1 + P := pa0 + s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))) + Q := 1 + s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))) + if sign { + return 1 + erx + P/Q + } + return 1 - erx - P/Q + + } + if x < 28 { // |x| < 28 + s := 1 / (x * x) + var R, S float64 + if x < 1/0.35 { // |x| < 1 / 0.35 ~ 2.857143 + R = ra0 + s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*ra7)))))) + S = 1 + s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+s*sa8))))))) + } else { // |x| >= 1 / 0.35 ~ 2.857143 + if sign && x > 6 { + return 2 // x < -6 + } + R = rb0 + s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*rb6))))) + S = 1 + s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7)))))) + } + z := Float64frombits(Float64bits(x) & 0xffffffff00000000) // pseudo-single (20-bit) precision x + r := Exp(-z*z-0.5625) * Exp((z-x)*(z+x)+R/S) + if sign { + return 2 - r/x + } + return r / x + } + if sign { + return 2 + } + return 0 +} diff --git a/gnovm/stdlibs/math/erfinv.gno b/gnovm/stdlibs/math/erfinv.gno new file mode 100644 index 00000000000..eed0feb42dd --- /dev/null +++ b/gnovm/stdlibs/math/erfinv.gno @@ -0,0 +1,129 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Inverse of the floating-point error function. +*/ + +// This implementation is based on the rational approximation +// of percentage points of normal distribution available from +// https://www.jstor.org/stable/2347330. + +const ( + // Coefficients for approximation to erf in |x| <= 0.85 + a0 = 1.1975323115670912564578e0 + a1 = 4.7072688112383978012285e1 + a2 = 6.9706266534389598238465e2 + a3 = 4.8548868893843886794648e3 + a4 = 1.6235862515167575384252e4 + a5 = 2.3782041382114385731252e4 + a6 = 1.1819493347062294404278e4 + a7 = 8.8709406962545514830200e2 + b0 = 1.0000000000000000000e0 + b1 = 4.2313330701600911252e1 + b2 = 6.8718700749205790830e2 + b3 = 5.3941960214247511077e3 + b4 = 2.1213794301586595867e4 + b5 = 3.9307895800092710610e4 + b6 = 2.8729085735721942674e4 + b7 = 5.2264952788528545610e3 + // Coefficients for approximation to erf in 0.85 < |x| <= 1-2*exp(-25) + c0 = 1.42343711074968357734e0 + c1 = 4.63033784615654529590e0 + c2 = 5.76949722146069140550e0 + c3 = 3.64784832476320460504e0 + c4 = 1.27045825245236838258e0 + c5 = 2.41780725177450611770e-1 + c6 = 2.27238449892691845833e-2 + c7 = 7.74545014278341407640e-4 + d0 = 1.4142135623730950488016887e0 + d1 = 2.9036514445419946173133295e0 + d2 = 2.3707661626024532365971225e0 + d3 = 9.7547832001787427186894837e-1 + d4 = 2.0945065210512749128288442e-1 + d5 = 2.1494160384252876777097297e-2 + d6 = 7.7441459065157709165577218e-4 + d7 = 1.4859850019840355905497876e-9 + // Coefficients for approximation to erf in 1-2*exp(-25) < |x| < 1 + e0 = 6.65790464350110377720e0 + e1 = 5.46378491116411436990e0 + e2 = 1.78482653991729133580e0 + e3 = 2.96560571828504891230e-1 + e4 = 2.65321895265761230930e-2 + e5 = 1.24266094738807843860e-3 + e6 = 2.71155556874348757815e-5 + e7 = 2.01033439929228813265e-7 + f0 = 1.414213562373095048801689e0 + f1 = 8.482908416595164588112026e-1 + f2 = 1.936480946950659106176712e-1 + f3 = 2.103693768272068968719679e-2 + f4 = 1.112800997078859844711555e-3 + f5 = 2.611088405080593625138020e-5 + f6 = 2.010321207683943062279931e-7 + f7 = 2.891024605872965461538222e-15 +) + +// Erfinv returns the inverse error function of x. +// +// Special cases are: +// +// Erfinv(1) = +Inf +// Erfinv(-1) = -Inf +// Erfinv(x) = NaN if x < -1 or x > 1 +// Erfinv(NaN) = NaN +func Erfinv(x float64) float64 { + // special cases + if IsNaN(x) || x <= -1 || x >= 1 { + if x == -1 || x == 1 { + return Inf(int(x)) + } + return NaN() + } + + sign := false + if x < 0 { + x = -x + sign = true + } + + var ans float64 + if x <= 0.85 { // |x| <= 0.85 + r := 0.180625 - 0.25*x*x + z1 := ((((((a7*r+a6)*r+a5)*r+a4)*r+a3)*r+a2)*r+a1)*r + a0 + z2 := ((((((b7*r+b6)*r+b5)*r+b4)*r+b3)*r+b2)*r+b1)*r + b0 + ans = (x * z1) / z2 + } else { + var z1, z2 float64 + r := Sqrt(Ln2 - Log(1.0-x)) + if r <= 5.0 { + r -= 1.6 + z1 = ((((((c7*r+c6)*r+c5)*r+c4)*r+c3)*r+c2)*r+c1)*r + c0 + z2 = ((((((d7*r+d6)*r+d5)*r+d4)*r+d3)*r+d2)*r+d1)*r + d0 + } else { + r -= 5.0 + z1 = ((((((e7*r+e6)*r+e5)*r+e4)*r+e3)*r+e2)*r+e1)*r + e0 + z2 = ((((((f7*r+f6)*r+f5)*r+f4)*r+f3)*r+f2)*r+f1)*r + f0 + } + ans = z1 / z2 + } + + if sign { + return -ans + } + return ans +} + +// Erfcinv returns the inverse of Erfc(x). +// +// Special cases are: +// +// Erfcinv(0) = +Inf +// Erfcinv(2) = -Inf +// Erfcinv(x) = NaN if x < 0 or x > 2 +// Erfcinv(NaN) = NaN +func Erfcinv(x float64) float64 { + return Erfinv(1 - x) +} diff --git a/gnovm/stdlibs/math/exp.gno b/gnovm/stdlibs/math/exp.gno index a4112208b62..4ddec051cc7 100644 --- a/gnovm/stdlibs/math/exp.gno +++ b/gnovm/stdlibs/math/exp.gno @@ -14,11 +14,6 @@ package math // Very large values overflow to 0 or +Inf. // Very small values underflow to 1. func Exp(x float64) float64 { - /* XXX - if haveArchExp { - return archExp(x) - } - */ return exp(x) } @@ -142,11 +137,6 @@ func exp(x float64) float64 { // // Special cases are the same as Exp. func Exp2(x float64) float64 { - /* XXX - if haveArchExp2 { - return archExp2(x) - } - */ return exp2(x) } diff --git a/gnovm/stdlibs/math/expm1.gno b/gnovm/stdlibs/math/expm1.gno new file mode 100644 index 00000000000..b1291f7b1ad --- /dev/null +++ b/gnovm/stdlibs/math/expm1.gno @@ -0,0 +1,241 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code, the long comment, and the constants +// below are from FreeBSD's /usr/src/lib/msun/src/s_expm1.c +// and came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// expm1(x) +// Returns exp(x)-1, the exponential of x minus 1. +// +// Method +// 1. Argument reduction: +// Given x, find r and integer k such that +// +// x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658 +// +// Here a correction term c will be computed to compensate +// the error in r when rounded to a floating-point number. +// +// 2. Approximating expm1(r) by a special rational function on +// the interval [0,0.34658]: +// Since +// r*(exp(r)+1)/(exp(r)-1) = 2+ r**2/6 - r**4/360 + ... +// we define R1(r*r) by +// r*(exp(r)+1)/(exp(r)-1) = 2+ r**2/6 * R1(r*r) +// That is, +// R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r) +// = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r)) +// = 1 - r**2/60 + r**4/2520 - r**6/100800 + ... +// We use a special Reme algorithm on [0,0.347] to generate +// a polynomial of degree 5 in r*r to approximate R1. The +// maximum error of this polynomial approximation is bounded +// by 2**-61. In other words, +// R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5 +// where Q1 = -1.6666666666666567384E-2, +// Q2 = 3.9682539681370365873E-4, +// Q3 = -9.9206344733435987357E-6, +// Q4 = 2.5051361420808517002E-7, +// Q5 = -6.2843505682382617102E-9; +// (where z=r*r, and the values of Q1 to Q5 are listed below) +// with error bounded by +// | 5 | -61 +// | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2 +// | | +// +// expm1(r) = exp(r)-1 is then computed by the following +// specific way which minimize the accumulation rounding error: +// 2 3 +// r r [ 3 - (R1 + R1*r/2) ] +// expm1(r) = r + --- + --- * [--------------------] +// 2 2 [ 6 - r*(3 - R1*r/2) ] +// +// To compensate the error in the argument reduction, we use +// expm1(r+c) = expm1(r) + c + expm1(r)*c +// ~ expm1(r) + c + r*c +// Thus c+r*c will be added in as the correction terms for +// expm1(r+c). Now rearrange the term to avoid optimization +// screw up: +// ( 2 2 ) +// ({ ( r [ R1 - (3 - R1*r/2) ] ) } r ) +// expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- ) +// ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 ) +// ( ) +// +// = r - E +// 3. Scale back to obtain expm1(x): +// From step 1, we have +// expm1(x) = either 2**k*[expm1(r)+1] - 1 +// = or 2**k*[expm1(r) + (1-2**-k)] +// 4. Implementation notes: +// (A). To save one multiplication, we scale the coefficient Qi +// to Qi*2**i, and replace z by (x**2)/2. +// (B). To achieve maximum accuracy, we compute expm1(x) by +// (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf) +// (ii) if k=0, return r-E +// (iii) if k=-1, return 0.5*(r-E)-0.5 +// (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E) +// else return 1.0+2.0*(r-E); +// (v) if (k<-2||k>56) return 2**k(1-(E-r)) - 1 (or exp(x)-1) +// (vi) if k <= 20, return 2**k((1-2**-k)-(E-r)), else +// (vii) return 2**k(1-((E+2**-k)-r)) +// +// Special cases: +// expm1(INF) is INF, expm1(NaN) is NaN; +// expm1(-INF) is -1, and +// for finite argument, only expm1(0)=0 is exact. +// +// Accuracy: +// according to an error analysis, the error is always less than +// 1 ulp (unit in the last place). +// +// Misc. info. +// For IEEE double +// if x > 7.09782712893383973096e+02 then expm1(x) overflow +// +// Constants: +// The hexadecimal values are the intended ones for the following +// constants. The decimal values may be used, provided that the +// compiler will convert from decimal to binary accurately enough +// to produce the hexadecimal values shown. +// + +// Expm1 returns e**x - 1, the base-e exponential of x minus 1. +// It is more accurate than Exp(x) - 1 when x is near zero. +// +// Special cases are: +// +// Expm1(+Inf) = +Inf +// Expm1(-Inf) = -1 +// Expm1(NaN) = NaN +// +// Very large values overflow to -1 or +Inf. +func Expm1(x float64) float64 { + return expm1(x) +} + +func expm1(x float64) float64 { + const ( + Othreshold = 7.09782712893383973096e+02 // 0x40862E42FEFA39EF + Ln2X56 = 3.88162421113569373274e+01 // 0x4043687a9f1af2b1 + Ln2HalfX3 = 1.03972077083991796413e+00 // 0x3ff0a2b23f3bab73 + Ln2Half = 3.46573590279972654709e-01 // 0x3fd62e42fefa39ef + Ln2Hi = 6.93147180369123816490e-01 // 0x3fe62e42fee00000 + Ln2Lo = 1.90821492927058770002e-10 // 0x3dea39ef35793c76 + InvLn2 = 1.44269504088896338700e+00 // 0x3ff71547652b82fe + Tiny = 1.0 / (1 << 54) // 2**-54 = 0x3c90000000000000 + // scaled coefficients related to expm1 + Q1 = -3.33333333333331316428e-02 // 0xBFA11111111110F4 + Q2 = 1.58730158725481460165e-03 // 0x3F5A01A019FE5585 + Q3 = -7.93650757867487942473e-05 // 0xBF14CE199EAADBB7 + Q4 = 4.00821782732936239552e-06 // 0x3ED0CFCA86E65239 + Q5 = -2.01099218183624371326e-07 // 0xBE8AFDB76E09C32D + ) + + // special cases + switch { + case IsInf(x, 1) || IsNaN(x): + return x + case IsInf(x, -1): + return -1 + } + + absx := x + sign := false + if x < 0 { + absx = -absx + sign = true + } + + // filter out huge argument + if absx >= Ln2X56 { // if |x| >= 56 * ln2 + if sign { + return -1 // x < -56*ln2, return -1 + } + if absx >= Othreshold { // if |x| >= 709.78... + return Inf(1) + } + } + + // argument reduction + var c float64 + var k int + if absx > Ln2Half { // if |x| > 0.5 * ln2 + var hi, lo float64 + if absx < Ln2HalfX3 { // and |x| < 1.5 * ln2 + if !sign { + hi = x - Ln2Hi + lo = Ln2Lo + k = 1 + } else { + hi = x + Ln2Hi + lo = -Ln2Lo + k = -1 + } + } else { + if !sign { + k = int(InvLn2*x + 0.5) + } else { + k = int(InvLn2*x - 0.5) + } + t := float64(k) + hi = x - t*Ln2Hi // t * Ln2Hi is exact here + lo = t * Ln2Lo + } + x = hi - lo + c = (hi - x) - lo + } else if absx < Tiny { // when |x| < 2**-54, return x + return x + } else { + k = 0 + } + + // x is now in primary range + hfx := 0.5 * x + hxs := x * hfx + r1 := 1 + hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5)))) + t := 3 - r1*hfx + e := hxs * ((r1 - t) / (6.0 - x*t)) + if k == 0 { + return x - (x*e - hxs) // c is 0 + } + e = (x*(e-c) - c) + e -= hxs + switch { + case k == -1: + return 0.5*(x-e) - 0.5 + case k == 1: + if x < -0.25 { + return -2 * (e - (x + 0.5)) + } + return 1 + 2*(x-e) + case k <= -2 || k > 56: // suffice to return exp(x)-1 + y := 1 - (e - x) + y = Float64frombits(Float64bits(y) + uint64(k)<<52) // add k to y's exponent + return y - 1 + } + if k < 20 { + t := Float64frombits(0x3ff0000000000000 - (0x20000000000000 >> uint(k))) // t=1-2**-k + y := t - (e - x) + y = Float64frombits(Float64bits(y) + uint64(k)<<52) // add k to y's exponent + return y + } + t = Float64frombits(uint64(0x3ff-k) << 52) // 2**-k + y := x - (e + t) + y++ + y = Float64frombits(Float64bits(y) + uint64(k)<<52) // add k to y's exponent + return y +} diff --git a/gnovm/stdlibs/math/export_test.gno b/gnovm/stdlibs/math/export_test.gno new file mode 100644 index 00000000000..8b2e36d0788 --- /dev/null +++ b/gnovm/stdlibs/math/export_test.gno @@ -0,0 +1,16 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// Export internal functions for testing. +var ( + ExpGo = exp + Exp2Go = exp2 + HypotGo = hypot + SqrtGo = sqrt + TrigReduce = trigReduce +) + +const ReduceThreshold = reduceThreshold diff --git a/gnovm/stdlibs/math/floor.gno b/gnovm/stdlibs/math/floor.gno index 7d6320a1983..a3b98644856 100644 --- a/gnovm/stdlibs/math/floor.gno +++ b/gnovm/stdlibs/math/floor.gno @@ -4,10 +4,6 @@ package math -import ( - imath "internal/math" -) - // Floor returns the greatest integer value less than or equal to x. // // Special cases are: @@ -16,11 +12,6 @@ import ( // Floor(±Inf) = ±Inf // Floor(NaN) = NaN func Floor(x float64) float64 { - /* XXX - if haveArchFloor { - return archFloor(x) - } - */ return floor(x) } @@ -47,11 +38,6 @@ func floor(x float64) float64 { // Ceil(±Inf) = ±Inf // Ceil(NaN) = NaN func Ceil(x float64) float64 { - /* XXX - if haveArchCeil { - return archCeil(x) - } - */ return ceil(x) } @@ -67,11 +53,6 @@ func ceil(x float64) float64 { // Trunc(±Inf) = ±Inf // Trunc(NaN) = NaN func Trunc(x float64) float64 { - /* XXX - if haveArchTrunc { - return archTrunc(x) - } - */ return trunc(x) } @@ -100,7 +81,7 @@ func Round(x float64) float64 { // } // return t // } - bits := imath.Float64bits(x) + bits := Float64bits(x) e := uint(bits>>shift) & mask if e < bias { // Round abs(x) < 1 including denormals. @@ -118,7 +99,7 @@ func Round(x float64) float64 { bits += half >> e bits &^= fracMask >> e } - return imath.Float64frombits(bits) + return Float64frombits(bits) } // RoundToEven returns the nearest integer, rounding ties to even. @@ -139,7 +120,7 @@ func RoundToEven(x float64) float64 { // } // return t // } - bits := imath.Float64bits(x) + bits := Float64bits(x) e := uint(bits>>shift) & mask if e >= bias { // Round abs(x) >= 1. @@ -157,5 +138,5 @@ func RoundToEven(x float64) float64 { // Round abs(x) <= 0.5 including denormals. bits &= signMask // +-0 } - return imath.Float64frombits(bits) + return Float64frombits(bits) } diff --git a/gnovm/stdlibs/math/fma.gno b/gnovm/stdlibs/math/fma.gno new file mode 100644 index 00000000000..ba03fbe8a93 --- /dev/null +++ b/gnovm/stdlibs/math/fma.gno @@ -0,0 +1,175 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +import "math/bits" + +func zero(x uint64) uint64 { + if x == 0 { + return 1 + } + return 0 + // branchless: + // return ((x>>1 | x&1) - 1) >> 63 +} + +func nonzero(x uint64) uint64 { + if x != 0 { + return 1 + } + return 0 + // branchless: + // return 1 - ((x>>1|x&1)-1)>>63 +} + +func shl(u1, u2 uint64, n uint) (r1, r2 uint64) { + r1 = u1<>(64-n) | u2<<(n-64) + r2 = u2 << n + return +} + +func shr(u1, u2 uint64, n uint) (r1, r2 uint64) { + r2 = u2>>n | u1<<(64-n) | u1>>(n-64) + r1 = u1 >> n + return +} + +// shrcompress compresses the bottom n+1 bits of the two-word +// value into a single bit. the result is equal to the value +// shifted to the right by n, except the result's 0th bit is +// set to the bitwise OR of the bottom n+1 bits. +func shrcompress(u1, u2 uint64, n uint) (r1, r2 uint64) { + // TODO: Performance here is really sensitive to the + // order/placement of these branches. n == 0 is common + // enough to be in the fast path. Perhaps more measurement + // needs to be done to find the optimal order/placement? + switch { + case n == 0: + return u1, u2 + case n == 64: + return 0, u1 | nonzero(u2) + case n >= 128: + return 0, nonzero(u1 | u2) + case n < 64: + r1, r2 = shr(u1, u2, n) + r2 |= nonzero(u2 & (1<> 63) + exp = int32(b>>52) & mask + mantissa = b & fracMask + + if exp == 0 { + // Normalize value if subnormal. + shift := uint(bits.LeadingZeros64(mantissa) - 11) + mantissa <<= shift + exp = 1 - int32(shift) + } else { + // Add implicit 1 bit + mantissa |= 1 << 52 + } + return +} + +// FMA returns x * y + z, computed with only one rounding. +// (That is, FMA returns the fused multiply-add of x, y, and z.) +func FMA(x, y, z float64) float64 { + bx, by, bz := Float64bits(x), Float64bits(y), Float64bits(z) + + // Inf or NaN or zero involved. At most one rounding will occur. + if x == 0.0 || y == 0.0 || z == 0.0 || bx&uvinf == uvinf || by&uvinf == uvinf { + return x*y + z + } + // Handle non-finite z separately. Evaluating x*y+z where + // x and y are finite, but z is infinite, should always result in z. + if bz&uvinf == uvinf { + return z + } + + // Inputs are (sub)normal. + // Split x, y, z into sign, exponent, mantissa. + xs, xe, xm := split(bx) + ys, ye, ym := split(by) + zs, ze, zm := split(bz) + + // Compute product p = x*y as sign, exponent, two-word mantissa. + // Start with exponent. "is normal" bit isn't subtracted yet. + pe := xe + ye - bias + 1 + + // pm1:pm2 is the double-word mantissa for the product p. + // Shift left to leave top bit in product. Effectively + // shifts the 106-bit product to the left by 21. + pm1, pm2 := bits.Mul64(xm<<10, ym<<11) + zm1, zm2 := zm<<10, uint64(0) + ps := xs ^ ys // product sign + + // normalize to 62nd bit + is62zero := uint((^pm1 >> 62) & 1) + pm1, pm2 = shl(pm1, pm2, is62zero) + pe -= int32(is62zero) + + // Swap addition operands so |p| >= |z| + if pe < ze || pe == ze && pm1 < zm1 { + ps, pe, pm1, pm2, zs, ze, zm1, zm2 = zs, ze, zm1, zm2, ps, pe, pm1, pm2 + } + + // Special case: if p == -z the result is always +0 since neither operand is zero. + if ps != zs && pe == ze && pm1 == zm1 && pm2 == zm2 { + return 0 + } + + // Align significands + zm1, zm2 = shrcompress(zm1, zm2, uint(pe-ze)) + + // Compute resulting significands, normalizing if necessary. + var m, c uint64 + if ps == zs { + // Adding (pm1:pm2) + (zm1:zm2) + pm2, c = bits.Add64(pm2, zm2, 0) + pm1, _ = bits.Add64(pm1, zm1, c) + pe -= int32(^pm1 >> 63) + pm1, m = shrcompress(pm1, pm2, uint(64+pm1>>63)) + } else { + // Subtracting (pm1:pm2) - (zm1:zm2) + // TODO: should we special-case cancellation? + pm2, c = bits.Sub64(pm2, zm2, 0) + pm1, _ = bits.Sub64(pm1, zm1, c) + nz := lz(pm1, pm2) + pe -= nz + m, pm2 = shl(pm1, pm2, uint(nz-1)) + m |= nonzero(pm2) + } + + // Round and break ties to even + if pe > 1022+bias || pe == 1022+bias && (m+1<<9)>>63 == 1 { + // rounded value overflows exponent range + return Float64frombits(uint64(ps)<<63 | uvinf) + } + if pe < 0 { + n := uint(-pe) + m = m>>n | nonzero(m&(1<> 10) & ^zero((m&(1<<10-1))^1<<9) + pe &= -int32(nonzero(m)) + return Float64frombits(uint64(ps)<<63 + uint64(pe)<<52 + m) +} diff --git a/gnovm/stdlibs/math/frexp.gno b/gnovm/stdlibs/math/frexp.gno new file mode 100644 index 00000000000..7a196abd01d --- /dev/null +++ b/gnovm/stdlibs/math/frexp.gno @@ -0,0 +1,36 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// Frexp breaks f into a normalized fraction +// and an integral power of two. +// It returns frac and exp satisfying f == frac × 2**exp, +// with the absolute value of frac in the interval [½, 1). +// +// Special cases are: +// +// Frexp(±0) = ±0, 0 +// Frexp(±Inf) = ±Inf, 0 +// Frexp(NaN) = NaN, 0 +func Frexp(f float64) (frac float64, exp int) { + return frexp(f) +} + +func frexp(f float64) (frac float64, exp int) { + // special cases + switch { + case f == 0: + return f, 0 // correctly return -0 + case IsInf(f, 0) || IsNaN(f): + return f, 0 + } + f, exp = normalize(f) + x := Float64bits(f) + exp += int((x>>shift)&mask) - bias + 1 + x &^= mask << shift + x |= (-1 + bias) << shift + frac = Float64frombits(x) + return +} diff --git a/gnovm/stdlibs/math/gamma.gno b/gnovm/stdlibs/math/gamma.gno new file mode 100644 index 00000000000..99f3bd0241f --- /dev/null +++ b/gnovm/stdlibs/math/gamma.gno @@ -0,0 +1,224 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code, the long comment, and the constants +// below are from http://netlib.sandia.gov/cephes/cprob/gamma.c. +// The go code is a simplified version of the original C. +// +// tgamma.c +// +// Gamma function +// +// SYNOPSIS: +// +// double x, y, tgamma(); +// extern int signgam; +// +// y = tgamma( x ); +// +// DESCRIPTION: +// +// Returns gamma function of the argument. The result is +// correctly signed, and the sign (+1 or -1) is also +// returned in a global (extern) variable named signgam. +// This variable is also filled in by the logarithmic gamma +// function lgamma(). +// +// Arguments |x| <= 34 are reduced by recurrence and the function +// approximated by a rational function of degree 6/7 in the +// interval (2,3). Large arguments are handled by Stirling's +// formula. Large negative arguments are made positive using +// a reflection formula. +// +// ACCURACY: +// +// Relative error: +// arithmetic domain # trials peak rms +// DEC -34, 34 10000 1.3e-16 2.5e-17 +// IEEE -170,-33 20000 2.3e-15 3.3e-16 +// IEEE -33, 33 20000 9.4e-16 2.2e-16 +// IEEE 33, 171.6 20000 2.3e-15 3.2e-16 +// +// Error for arguments outside the test range will be larger +// owing to error amplification by the exponential function. +// +// Cephes Math Library Release 2.8: June, 2000 +// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier +// +// The readme file at http://netlib.sandia.gov/cephes/ says: +// Some software in this archive may be from the book _Methods and +// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster +// International, 1989) or from the Cephes Mathematical Library, a +// commercial product. In either event, it is copyrighted by the author. +// What you see here may be used freely but it comes with no support or +// guarantee. +// +// The two known misprints in the book are repaired here in the +// source listings for the gamma function and the incomplete beta +// integral. +// +// Stephen L. Moshier +// moshier@na-net.ornl.gov + +var _gamP = [...]float64{ + 1.60119522476751861407e-04, + 1.19135147006586384913e-03, + 1.04213797561761569935e-02, + 4.76367800457137231464e-02, + 2.07448227648435975150e-01, + 4.94214826801497100753e-01, + 9.99999999999999996796e-01, +} + +var _gamQ = [...]float64{ + -2.31581873324120129819e-05, + 5.39605580493303397842e-04, + -4.45641913851797240494e-03, + 1.18139785222060435552e-02, + 3.58236398605498653373e-02, + -2.34591795718243348568e-01, + 7.14304917030273074085e-02, + 1.00000000000000000320e+00, +} + +var _gamS = [...]float64{ + 7.87311395793093628397e-04, + -2.29549961613378126380e-04, + -2.68132617805781232825e-03, + 3.47222221605458667310e-03, + 8.33333333333482257126e-02, +} + +// Gamma function computed by Stirling's formula. +// The pair of results must be multiplied together to get the actual answer. +// The multiplication is left to the caller so that, if careful, the caller can avoid +// infinity for 172 <= x <= 180. +// The polynomial is valid for 33 <= x <= 172; larger values are only used +// in reciprocal and produce denormalized floats. The lower precision there +// masks any imprecision in the polynomial. +func stirling(x float64) (float64, float64) { + if x > 200 { + return Inf(1), 1 + } + const ( + SqrtTwoPi = 2.506628274631000502417 + MaxStirling = 143.01608 + ) + w := 1 / x + w = 1 + w*((((_gamS[0]*w+_gamS[1])*w+_gamS[2])*w+_gamS[3])*w+_gamS[4]) + y1 := Exp(x) + y2 := 1.0 + if x > MaxStirling { // avoid Pow() overflow + v := Pow(x, 0.5*x-0.25) + y1, y2 = v, v/y1 + } else { + y1 = Pow(x, x-0.5) / y1 + } + return y1, SqrtTwoPi * w * y2 +} + +// Gamma returns the Gamma function of x. +// +// Special cases are: +// +// Gamma(+Inf) = +Inf +// Gamma(+0) = +Inf +// Gamma(-0) = -Inf +// Gamma(x) = NaN for integer x < 0 +// Gamma(-Inf) = NaN +// Gamma(NaN) = NaN +func Gamma(x float64) float64 { + const Euler = 0.57721566490153286060651209008240243104215933593992 // A001620 + // special cases + switch { + case isNegInt(x) || IsInf(x, -1) || IsNaN(x): + return NaN() + case IsInf(x, 1): + return Inf(1) + case x == 0: + if Signbit(x) { + return Inf(-1) + } + return Inf(1) + } + q := Abs(x) + p := Floor(q) + if q > 33 { + if x >= 0 { + y1, y2 := stirling(x) + return y1 * y2 + } + // Note: x is negative but (checked above) not a negative integer, + // so x must be small enough to be in range for conversion to int64. + // If |x| were >= 2⁶³ it would have to be an integer. + signgam := 1 + if ip := int64(p); ip&1 == 0 { + signgam = -1 + } + z := q - p + if z > 0.5 { + p = p + 1 + z = q - p + } + z = q * Sin(Pi*z) + if z == 0 { + return Inf(signgam) + } + sq1, sq2 := stirling(q) + absz := Abs(z) + d := absz * sq1 * sq2 + if IsInf(d, 0) { + z = Pi / absz / sq1 / sq2 + } else { + z = Pi / d + } + return float64(signgam) * z + } + + // Reduce argument + z := 1.0 + for x >= 3 { + x = x - 1 + z = z * x + } + for x < 0 { + if x > -1e-09 { + goto small + } + z = z / x + x = x + 1 + } + for x < 2 { + if x < 1e-09 { + goto small + } + z = z / x + x = x + 1 + } + + if x == 2 { + return z + } + + x = x - 2 + p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] + q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] + return z * p / q + +small: + if x == 0 { + return Inf(1) + } + return z / ((1 + Euler*x) * x) +} + +func isNegInt(x float64) bool { + if x < 0 { + _, xf := Modf(x) + return xf == 0 + } + return false +} diff --git a/gnovm/stdlibs/math/hypot.gno b/gnovm/stdlibs/math/hypot.gno new file mode 100644 index 00000000000..a57835a2601 --- /dev/null +++ b/gnovm/stdlibs/math/hypot.gno @@ -0,0 +1,41 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Hypot -- sqrt(p*p + q*q), but overflows only if the result does. +*/ + +// Hypot returns Sqrt(p*p + q*q), taking care to avoid +// unnecessary overflow and underflow. +// +// Special cases are: +// +// Hypot(±Inf, q) = +Inf +// Hypot(p, ±Inf) = +Inf +// Hypot(NaN, q) = NaN +// Hypot(p, NaN) = NaN +func Hypot(p, q float64) float64 { + return hypot(p, q) +} + +func hypot(p, q float64) float64 { + p, q = Abs(p), Abs(q) + // special cases + switch { + case IsInf(p, 1) || IsInf(q, 1): + return Inf(1) + case IsNaN(p) || IsNaN(q): + return NaN() + } + if p < q { + p, q = q, p + } + if p == 0 { + return 0 + } + q = q / p + return p * Sqrt(1+q*q) +} diff --git a/gnovm/stdlibs/math/j0.gno b/gnovm/stdlibs/math/j0.gno new file mode 100644 index 00000000000..a99e629f042 --- /dev/null +++ b/gnovm/stdlibs/math/j0.gno @@ -0,0 +1,437 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Bessel function of the first and second kinds of order zero. +*/ + +// The original C code and the long comment below are +// from FreeBSD's /usr/src/lib/msun/src/e_j0.c and +// came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// __ieee754_j0(x), __ieee754_y0(x) +// Bessel function of the first and second kinds of order zero. +// Method -- j0(x): +// 1. For tiny x, we use j0(x) = 1 - x**2/4 + x**4/64 - ... +// 2. Reduce x to |x| since j0(x)=j0(-x), and +// for x in (0,2) +// j0(x) = 1-z/4+ z**2*R0/S0, where z = x*x; +// (precision: |j0-1+z/4-z**2R0/S0 |<2**-63.67 ) +// for x in (2,inf) +// j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0)) +// where x0 = x-pi/4. It is better to compute sin(x0),cos(x0) +// as follow: +// cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4) +// = 1/sqrt(2) * (cos(x) + sin(x)) +// sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4) +// = 1/sqrt(2) * (sin(x) - cos(x)) +// (To avoid cancellation, use +// sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) +// to compute the worse one.) +// +// 3 Special cases +// j0(nan)= nan +// j0(0) = 1 +// j0(inf) = 0 +// +// Method -- y0(x): +// 1. For x<2. +// Since +// y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x**2/4 - ...) +// therefore y0(x)-2/pi*j0(x)*ln(x) is an even function. +// We use the following function to approximate y0, +// y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x**2 +// where +// U(z) = u00 + u01*z + ... + u06*z**6 +// V(z) = 1 + v01*z + ... + v04*z**4 +// with absolute approximation error bounded by 2**-72. +// Note: For tiny x, U/V = u0 and j0(x)~1, hence +// y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27) +// 2. For x>=2. +// y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0)) +// where x0 = x-pi/4. It is better to compute sin(x0),cos(x0) +// by the method mentioned above. +// 3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0. +// + +// J0 returns the order-zero Bessel function of the first kind. +// +// Special cases are: +// +// J0(±Inf) = 0 +// J0(0) = 1 +// J0(NaN) = NaN +func J0(x float64) float64 { + const ( + Huge = 1e300 + TwoM27 = 1.0 / (1 << 27) // 2**-27 0x3e40000000000000 + TwoM13 = 1.0 / (1 << 13) // 2**-13 0x3f20000000000000 + Two129 = 1 << 129 // 2**129 0x4800000000000000 + // R0/S0 on [0, 2] + R02 = 1.56249999999999947958e-02 // 0x3F8FFFFFFFFFFFFD + R03 = -1.89979294238854721751e-04 // 0xBF28E6A5B61AC6E9 + R04 = 1.82954049532700665670e-06 // 0x3EBEB1D10C503919 + R05 = -4.61832688532103189199e-09 // 0xBE33D5E773D63FCE + S01 = 1.56191029464890010492e-02 // 0x3F8FFCE882C8C2A4 + S02 = 1.16926784663337450260e-04 // 0x3F1EA6D2DD57DBF4 + S03 = 5.13546550207318111446e-07 // 0x3EA13B54CE84D5A9 + S04 = 1.16614003333790000205e-09 // 0x3E1408BCF4745D8F + ) + // special cases + switch { + case IsNaN(x): + return x + case IsInf(x, 0): + return 0 + case x == 0: + return 1 + } + + x = Abs(x) + if x >= 2 { + s, c := Sincos(x) + ss := s - c + cc := s + c + + // make sure x+x does not overflow + if x < MaxFloat64/2 { + z := -Cos(x + x) + if s*c < 0 { + cc = z / ss + } else { + ss = z / cc + } + } + + // j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x) + // y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x) + + var z float64 + if x > Two129 { // |x| > ~6.8056e+38 + z = (1 / SqrtPi) * cc / Sqrt(x) + } else { + u := pzero(x) + v := qzero(x) + z = (1 / SqrtPi) * (u*cc - v*ss) / Sqrt(x) + } + return z // |x| >= 2.0 + } + if x < TwoM13 { // |x| < ~1.2207e-4 + if x < TwoM27 { + return 1 // |x| < ~7.4506e-9 + } + return 1 - 0.25*x*x // ~7.4506e-9 < |x| < ~1.2207e-4 + } + z := x * x + r := z * (R02 + z*(R03+z*(R04+z*R05))) + s := 1 + z*(S01+z*(S02+z*(S03+z*S04))) + if x < 1 { + return 1 + z*(-0.25+(r/s)) // |x| < 1.00 + } + u := 0.5 * x + return (1+u)*(1-u) + z*(r/s) // 1.0 < |x| < 2.0 +} + +// Y0 returns the order-zero Bessel function of the second kind. +// +// Special cases are: +// +// Y0(+Inf) = 0 +// Y0(0) = -Inf +// Y0(x < 0) = NaN +// Y0(NaN) = NaN +func Y0(x float64) float64 { + const ( + TwoM27 = 1.0 / (1 << 27) // 2**-27 0x3e40000000000000 + Two129 = 1 << 129 // 2**129 0x4800000000000000 + U00 = -7.38042951086872317523e-02 // 0xBFB2E4D699CBD01F + U01 = 1.76666452509181115538e-01 // 0x3FC69D019DE9E3FC + U02 = -1.38185671945596898896e-02 // 0xBF8C4CE8B16CFA97 + U03 = 3.47453432093683650238e-04 // 0x3F36C54D20B29B6B + U04 = -3.81407053724364161125e-06 // 0xBECFFEA773D25CAD + U05 = 1.95590137035022920206e-08 // 0x3E5500573B4EABD4 + U06 = -3.98205194132103398453e-11 // 0xBDC5E43D693FB3C8 + V01 = 1.27304834834123699328e-02 // 0x3F8A127091C9C71A + V02 = 7.60068627350353253702e-05 // 0x3F13ECBBF578C6C1 + V03 = 2.59150851840457805467e-07 // 0x3E91642D7FF202FD + V04 = 4.41110311332675467403e-10 // 0x3DFE50183BD6D9EF + ) + // special cases + switch { + case x < 0 || IsNaN(x): + return NaN() + case IsInf(x, 1): + return 0 + case x == 0: + return Inf(-1) + } + + if x >= 2 { // |x| >= 2.0 + + // y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0)) + // where x0 = x-pi/4 + // Better formula: + // cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4) + // = 1/sqrt(2) * (sin(x) + cos(x)) + // sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) + // = 1/sqrt(2) * (sin(x) - cos(x)) + // To avoid cancellation, use + // sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) + // to compute the worse one. + + s, c := Sincos(x) + ss := s - c + cc := s + c + + // j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x) + // y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x) + + // make sure x+x does not overflow + if x < MaxFloat64/2 { + z := -Cos(x + x) + if s*c < 0 { + cc = z / ss + } else { + ss = z / cc + } + } + var z float64 + if x > Two129 { // |x| > ~6.8056e+38 + z = (1 / SqrtPi) * ss / Sqrt(x) + } else { + u := pzero(x) + v := qzero(x) + z = (1 / SqrtPi) * (u*ss + v*cc) / Sqrt(x) + } + return z // |x| >= 2.0 + } + if x <= TwoM27 { + return U00 + (2/Pi)*Log(x) // |x| < ~7.4506e-9 + } + z := x * x + u := U00 + z*(U01+z*(U02+z*(U03+z*(U04+z*(U05+z*U06))))) + v := 1 + z*(V01+z*(V02+z*(V03+z*V04))) + return u/v + (2/Pi)*J0(x)*Log(x) // ~7.4506e-9 < |x| < 2.0 +} + +// The asymptotic expansions of pzero is +// 1 - 9/128 s**2 + 11025/98304 s**4 - ..., where s = 1/x. +// For x >= 2, We approximate pzero by +// pzero(x) = 1 + (R/S) +// where R = pR0 + pR1*s**2 + pR2*s**4 + ... + pR5*s**10 +// S = 1 + pS0*s**2 + ... + pS4*s**10 +// and +// | pzero(x)-1-R/S | <= 2 ** ( -60.26) + +// for x in [inf, 8]=1/[0,0.125] +var p0R8 = [6]float64{ + 0.00000000000000000000e+00, // 0x0000000000000000 + -7.03124999999900357484e-02, // 0xBFB1FFFFFFFFFD32 + -8.08167041275349795626e+00, // 0xC02029D0B44FA779 + -2.57063105679704847262e+02, // 0xC07011027B19E863 + -2.48521641009428822144e+03, // 0xC0A36A6ECD4DCAFC + -5.25304380490729545272e+03, // 0xC0B4850B36CC643D +} + +var p0S8 = [5]float64{ + 1.16534364619668181717e+02, // 0x405D223307A96751 + 3.83374475364121826715e+03, // 0x40ADF37D50596938 + 4.05978572648472545552e+04, // 0x40E3D2BB6EB6B05F + 1.16752972564375915681e+05, // 0x40FC810F8F9FA9BD + 4.76277284146730962675e+04, // 0x40E741774F2C49DC +} + +// for x in [8,4.5454]=1/[0.125,0.22001] +var p0R5 = [6]float64{ + -1.14125464691894502584e-11, // 0xBDA918B147E495CC + -7.03124940873599280078e-02, // 0xBFB1FFFFE69AFBC6 + -4.15961064470587782438e+00, // 0xC010A370F90C6BBF + -6.76747652265167261021e+01, // 0xC050EB2F5A7D1783 + -3.31231299649172967747e+02, // 0xC074B3B36742CC63 + -3.46433388365604912451e+02, // 0xC075A6EF28A38BD7 +} + +var p0S5 = [5]float64{ + 6.07539382692300335975e+01, // 0x404E60810C98C5DE + 1.05125230595704579173e+03, // 0x40906D025C7E2864 + 5.97897094333855784498e+03, // 0x40B75AF88FBE1D60 + 9.62544514357774460223e+03, // 0x40C2CCB8FA76FA38 + 2.40605815922939109441e+03, // 0x40A2CC1DC70BE864 +} + +// for x in [4.547,2.8571]=1/[0.2199,0.35001] +var p0R3 = [6]float64{ + -2.54704601771951915620e-09, // 0xBE25E1036FE1AA86 + -7.03119616381481654654e-02, // 0xBFB1FFF6F7C0E24B + -2.40903221549529611423e+00, // 0xC00345B2AEA48074 + -2.19659774734883086467e+01, // 0xC035F74A4CB94E14 + -5.80791704701737572236e+01, // 0xC04D0A22420A1A45 + -3.14479470594888503854e+01, // 0xC03F72ACA892D80F +} + +var p0S3 = [5]float64{ + 3.58560338055209726349e+01, // 0x4041ED9284077DD3 + 3.61513983050303863820e+02, // 0x40769839464A7C0E + 1.19360783792111533330e+03, // 0x4092A66E6D1061D6 + 1.12799679856907414432e+03, // 0x40919FFCB8C39B7E + 1.73580930813335754692e+02, // 0x4065B296FC379081 +} + +// for x in [2.8570,2]=1/[0.3499,0.5] +var p0R2 = [6]float64{ + -8.87534333032526411254e-08, // 0xBE77D316E927026D + -7.03030995483624743247e-02, // 0xBFB1FF62495E1E42 + -1.45073846780952986357e+00, // 0xBFF736398A24A843 + -7.63569613823527770791e+00, // 0xC01E8AF3EDAFA7F3 + -1.11931668860356747786e+01, // 0xC02662E6C5246303 + -3.23364579351335335033e+00, // 0xC009DE81AF8FE70F +} + +var p0S2 = [5]float64{ + 2.22202997532088808441e+01, // 0x40363865908B5959 + 1.36206794218215208048e+02, // 0x4061069E0EE8878F + 2.70470278658083486789e+02, // 0x4070E78642EA079B + 1.53875394208320329881e+02, // 0x40633C033AB6FAFF + 1.46576176948256193810e+01, // 0x402D50B344391809 +} + +func pzero(x float64) float64 { + var p *[6]float64 + var q *[5]float64 + if x >= 8 { + p = &p0R8 + q = &p0S8 + } else if x >= 4.5454 { + p = &p0R5 + q = &p0S5 + } else if x >= 2.8571 { + p = &p0R3 + q = &p0S3 + } else if x >= 2 { + p = &p0R2 + q = &p0S2 + } + z := 1 / (x * x) + r := p[0] + z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))) + s := 1 + z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))) + return 1 + r/s +} + +// For x >= 8, the asymptotic expansions of qzero is +// -1/8 s + 75/1024 s**3 - ..., where s = 1/x. +// We approximate pzero by +// qzero(x) = s*(-1.25 + (R/S)) +// where R = qR0 + qR1*s**2 + qR2*s**4 + ... + qR5*s**10 +// S = 1 + qS0*s**2 + ... + qS5*s**12 +// and +// | qzero(x)/s +1.25-R/S | <= 2**(-61.22) + +// for x in [inf, 8]=1/[0,0.125] +var q0R8 = [6]float64{ + 0.00000000000000000000e+00, // 0x0000000000000000 + 7.32421874999935051953e-02, // 0x3FB2BFFFFFFFFE2C + 1.17682064682252693899e+01, // 0x402789525BB334D6 + 5.57673380256401856059e+02, // 0x40816D6315301825 + 8.85919720756468632317e+03, // 0x40C14D993E18F46D + 3.70146267776887834771e+04, // 0x40E212D40E901566 +} + +var q0S8 = [6]float64{ + 1.63776026895689824414e+02, // 0x406478D5365B39BC + 8.09834494656449805916e+03, // 0x40BFA2584E6B0563 + 1.42538291419120476348e+05, // 0x4101665254D38C3F + 8.03309257119514397345e+05, // 0x412883DA83A52B43 + 8.40501579819060512818e+05, // 0x4129A66B28DE0B3D + -3.43899293537866615225e+05, // 0xC114FD6D2C9530C5 +} + +// for x in [8,4.5454]=1/[0.125,0.22001] +var q0R5 = [6]float64{ + 1.84085963594515531381e-11, // 0x3DB43D8F29CC8CD9 + 7.32421766612684765896e-02, // 0x3FB2BFFFD172B04C + 5.83563508962056953777e+00, // 0x401757B0B9953DD3 + 1.35111577286449829671e+02, // 0x4060E3920A8788E9 + 1.02724376596164097464e+03, // 0x40900CF99DC8C481 + 1.98997785864605384631e+03, // 0x409F17E953C6E3A6 +} + +var q0S5 = [6]float64{ + 8.27766102236537761883e+01, // 0x4054B1B3FB5E1543 + 2.07781416421392987104e+03, // 0x40A03BA0DA21C0CE + 1.88472887785718085070e+04, // 0x40D267D27B591E6D + 5.67511122894947329769e+04, // 0x40EBB5E397E02372 + 3.59767538425114471465e+04, // 0x40E191181F7A54A0 + -5.35434275601944773371e+03, // 0xC0B4EA57BEDBC609 +} + +// for x in [4.547,2.8571]=1/[0.2199,0.35001] +var q0R3 = [6]float64{ + 4.37741014089738620906e-09, // 0x3E32CD036ADECB82 + 7.32411180042911447163e-02, // 0x3FB2BFEE0E8D0842 + 3.34423137516170720929e+00, // 0x400AC0FC61149CF5 + 4.26218440745412650017e+01, // 0x40454F98962DAEDD + 1.70808091340565596283e+02, // 0x406559DBE25EFD1F + 1.66733948696651168575e+02, // 0x4064D77C81FA21E0 +} + +var q0S3 = [6]float64{ + 4.87588729724587182091e+01, // 0x40486122BFE343A6 + 7.09689221056606015736e+02, // 0x40862D8386544EB3 + 3.70414822620111362994e+03, // 0x40ACF04BE44DFC63 + 6.46042516752568917582e+03, // 0x40B93C6CD7C76A28 + 2.51633368920368957333e+03, // 0x40A3A8AAD94FB1C0 + -1.49247451836156386662e+02, // 0xC062A7EB201CF40F +} + +// for x in [2.8570,2]=1/[0.3499,0.5] +var q0R2 = [6]float64{ + 1.50444444886983272379e-07, // 0x3E84313B54F76BDB + 7.32234265963079278272e-02, // 0x3FB2BEC53E883E34 + 1.99819174093815998816e+00, // 0x3FFFF897E727779C + 1.44956029347885735348e+01, // 0x402CFDBFAAF96FE5 + 3.16662317504781540833e+01, // 0x403FAA8E29FBDC4A + 1.62527075710929267416e+01, // 0x403040B171814BB4 +} + +var q0S2 = [6]float64{ + 3.03655848355219184498e+01, // 0x403E5D96F7C07AED + 2.69348118608049844624e+02, // 0x4070D591E4D14B40 + 8.44783757595320139444e+02, // 0x408A664522B3BF22 + 8.82935845112488550512e+02, // 0x408B977C9C5CC214 + 2.12666388511798828631e+02, // 0x406A95530E001365 + -5.31095493882666946917e+00, // 0xC0153E6AF8B32931 +} + +func qzero(x float64) float64 { + var p, q *[6]float64 + if x >= 8 { + p = &q0R8 + q = &q0S8 + } else if x >= 4.5454 { + p = &q0R5 + q = &q0S5 + } else if x >= 2.8571 { + p = &q0R3 + q = &q0S3 + } else if x >= 2 { + p = &q0R2 + q = &q0S2 + } + z := 1 / (x * x) + r := p[0] + z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))) + s := 1 + z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))) + return (-0.125 + r/s) / x +} diff --git a/gnovm/stdlibs/math/j1.gno b/gnovm/stdlibs/math/j1.gno new file mode 100644 index 00000000000..1e30a24ab4f --- /dev/null +++ b/gnovm/stdlibs/math/j1.gno @@ -0,0 +1,432 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Bessel function of the first and second kinds of order one. +*/ + +// The original C code and the long comment below are +// from FreeBSD's /usr/src/lib/msun/src/e_j1.c and +// came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// __ieee754_j1(x), __ieee754_y1(x) +// Bessel function of the first and second kinds of order one. +// Method -- j1(x): +// 1. For tiny x, we use j1(x) = x/2 - x**3/16 + x**5/384 - ... +// 2. Reduce x to |x| since j1(x)=-j1(-x), and +// for x in (0,2) +// j1(x) = x/2 + x*z*R0/S0, where z = x*x; +// (precision: |j1/x - 1/2 - R0/S0 |<2**-61.51 ) +// for x in (2,inf) +// j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1)) +// y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1)) +// where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1) +// as follow: +// cos(x1) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4) +// = 1/sqrt(2) * (sin(x) - cos(x)) +// sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) +// = -1/sqrt(2) * (sin(x) + cos(x)) +// (To avoid cancellation, use +// sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) +// to compute the worse one.) +// +// 3 Special cases +// j1(nan)= nan +// j1(0) = 0 +// j1(inf) = 0 +// +// Method -- y1(x): +// 1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN +// 2. For x<2. +// Since +// y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x**3-...) +// therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function. +// We use the following function to approximate y1, +// y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x**2 +// where for x in [0,2] (abs err less than 2**-65.89) +// U(z) = U0[0] + U0[1]*z + ... + U0[4]*z**4 +// V(z) = 1 + v0[0]*z + ... + v0[4]*z**5 +// Note: For tiny x, 1/x dominate y1 and hence +// y1(tiny) = -2/pi/tiny, (choose tiny<2**-54) +// 3. For x>=2. +// y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1)) +// where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1) +// by method mentioned above. + +// J1 returns the order-one Bessel function of the first kind. +// +// Special cases are: +// +// J1(±Inf) = 0 +// J1(NaN) = NaN +func J1(x float64) float64 { + const ( + TwoM27 = 1.0 / (1 << 27) // 2**-27 0x3e40000000000000 + Two129 = 1 << 129 // 2**129 0x4800000000000000 + // R0/S0 on [0, 2] + R00 = -6.25000000000000000000e-02 // 0xBFB0000000000000 + R01 = 1.40705666955189706048e-03 // 0x3F570D9F98472C61 + R02 = -1.59955631084035597520e-05 // 0xBEF0C5C6BA169668 + R03 = 4.96727999609584448412e-08 // 0x3E6AAAFA46CA0BD9 + S01 = 1.91537599538363460805e-02 // 0x3F939D0B12637E53 + S02 = 1.85946785588630915560e-04 // 0x3F285F56B9CDF664 + S03 = 1.17718464042623683263e-06 // 0x3EB3BFF8333F8498 + S04 = 5.04636257076217042715e-09 // 0x3E35AC88C97DFF2C + S05 = 1.23542274426137913908e-11 // 0x3DAB2ACFCFB97ED8 + ) + // special cases + switch { + case IsNaN(x): + return x + case IsInf(x, 0) || x == 0: + return 0 + } + + sign := false + if x < 0 { + x = -x + sign = true + } + if x >= 2 { + s, c := Sincos(x) + ss := -s - c + cc := s - c + + // make sure x+x does not overflow + if x < MaxFloat64/2 { + z := Cos(x + x) + if s*c > 0 { + cc = z / ss + } else { + ss = z / cc + } + } + + // j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x) + // y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x) + + var z float64 + if x > Two129 { + z = (1 / SqrtPi) * cc / Sqrt(x) + } else { + u := pone(x) + v := qone(x) + z = (1 / SqrtPi) * (u*cc - v*ss) / Sqrt(x) + } + if sign { + return -z + } + return z + } + if x < TwoM27 { // |x|<2**-27 + return 0.5 * x // inexact if x!=0 necessary + } + z := x * x + r := z * (R00 + z*(R01+z*(R02+z*R03))) + s := 1.0 + z*(S01+z*(S02+z*(S03+z*(S04+z*S05)))) + r *= x + z = 0.5*x + r/s + if sign { + return -z + } + return z +} + +// Y1 returns the order-one Bessel function of the second kind. +// +// Special cases are: +// +// Y1(+Inf) = 0 +// Y1(0) = -Inf +// Y1(x < 0) = NaN +// Y1(NaN) = NaN +func Y1(x float64) float64 { + const ( + TwoM54 = 1.0 / (1 << 54) // 2**-54 0x3c90000000000000 + Two129 = 1 << 129 // 2**129 0x4800000000000000 + U00 = -1.96057090646238940668e-01 // 0xBFC91866143CBC8A + U01 = 5.04438716639811282616e-02 // 0x3FA9D3C776292CD1 + U02 = -1.91256895875763547298e-03 // 0xBF5F55E54844F50F + U03 = 2.35252600561610495928e-05 // 0x3EF8AB038FA6B88E + U04 = -9.19099158039878874504e-08 // 0xBE78AC00569105B8 + V00 = 1.99167318236649903973e-02 // 0x3F94650D3F4DA9F0 + V01 = 2.02552581025135171496e-04 // 0x3F2A8C896C257764 + V02 = 1.35608801097516229404e-06 // 0x3EB6C05A894E8CA6 + V03 = 6.22741452364621501295e-09 // 0x3E3ABF1D5BA69A86 + V04 = 1.66559246207992079114e-11 // 0x3DB25039DACA772A + ) + // special cases + switch { + case x < 0 || IsNaN(x): + return NaN() + case IsInf(x, 1): + return 0 + case x == 0: + return Inf(-1) + } + + if x >= 2 { + s, c := Sincos(x) + ss := -s - c + cc := s - c + + // make sure x+x does not overflow + if x < MaxFloat64/2 { + z := Cos(x + x) + if s*c > 0 { + cc = z / ss + } else { + ss = z / cc + } + } + // y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0)) + // where x0 = x-3pi/4 + // Better formula: + // cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4) + // = 1/sqrt(2) * (sin(x) - cos(x)) + // sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) + // = -1/sqrt(2) * (cos(x) + sin(x)) + // To avoid cancellation, use + // sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) + // to compute the worse one. + + var z float64 + if x > Two129 { + z = (1 / SqrtPi) * ss / Sqrt(x) + } else { + u := pone(x) + v := qone(x) + z = (1 / SqrtPi) * (u*ss + v*cc) / Sqrt(x) + } + return z + } + if x <= TwoM54 { // x < 2**-54 + return -(2 / Pi) / x + } + z := x * x + u := U00 + z*(U01+z*(U02+z*(U03+z*U04))) + v := 1 + z*(V00+z*(V01+z*(V02+z*(V03+z*V04)))) + return x*(u/v) + (2/Pi)*(J1(x)*Log(x)-1/x) +} + +// For x >= 8, the asymptotic expansions of pone is +// 1 + 15/128 s**2 - 4725/2**15 s**4 - ..., where s = 1/x. +// We approximate pone by +// pone(x) = 1 + (R/S) +// where R = pr0 + pr1*s**2 + pr2*s**4 + ... + pr5*s**10 +// S = 1 + ps0*s**2 + ... + ps4*s**10 +// and +// | pone(x)-1-R/S | <= 2**(-60.06) + +// for x in [inf, 8]=1/[0,0.125] +var p1R8 = [6]float64{ + 0.00000000000000000000e+00, // 0x0000000000000000 + 1.17187499999988647970e-01, // 0x3FBDFFFFFFFFFCCE + 1.32394806593073575129e+01, // 0x402A7A9D357F7FCE + 4.12051854307378562225e+02, // 0x4079C0D4652EA590 + 3.87474538913960532227e+03, // 0x40AE457DA3A532CC + 7.91447954031891731574e+03, // 0x40BEEA7AC32782DD +} + +var p1S8 = [5]float64{ + 1.14207370375678408436e+02, // 0x405C8D458E656CAC + 3.65093083420853463394e+03, // 0x40AC85DC964D274F + 3.69562060269033463555e+04, // 0x40E20B8697C5BB7F + 9.76027935934950801311e+04, // 0x40F7D42CB28F17BB + 3.08042720627888811578e+04, // 0x40DE1511697A0B2D +} + +// for x in [8,4.5454] = 1/[0.125,0.22001] +var p1R5 = [6]float64{ + 1.31990519556243522749e-11, // 0x3DAD0667DAE1CA7D + 1.17187493190614097638e-01, // 0x3FBDFFFFE2C10043 + 6.80275127868432871736e+00, // 0x401B36046E6315E3 + 1.08308182990189109773e+02, // 0x405B13B9452602ED + 5.17636139533199752805e+02, // 0x40802D16D052D649 + 5.28715201363337541807e+02, // 0x408085B8BB7E0CB7 +} + +var p1S5 = [5]float64{ + 5.92805987221131331921e+01, // 0x404DA3EAA8AF633D + 9.91401418733614377743e+02, // 0x408EFB361B066701 + 5.35326695291487976647e+03, // 0x40B4E9445706B6FB + 7.84469031749551231769e+03, // 0x40BEA4B0B8A5BB15 + 1.50404688810361062679e+03, // 0x40978030036F5E51 +} + +// for x in[4.5453,2.8571] = 1/[0.2199,0.35001] +var p1R3 = [6]float64{ + 3.02503916137373618024e-09, // 0x3E29FC21A7AD9EDD + 1.17186865567253592491e-01, // 0x3FBDFFF55B21D17B + 3.93297750033315640650e+00, // 0x400F76BCE85EAD8A + 3.51194035591636932736e+01, // 0x40418F489DA6D129 + 9.10550110750781271918e+01, // 0x4056C3854D2C1837 + 4.85590685197364919645e+01, // 0x4048478F8EA83EE5 +} + +var p1S3 = [5]float64{ + 3.47913095001251519989e+01, // 0x40416549A134069C + 3.36762458747825746741e+02, // 0x40750C3307F1A75F + 1.04687139975775130551e+03, // 0x40905B7C5037D523 + 8.90811346398256432622e+02, // 0x408BD67DA32E31E9 + 1.03787932439639277504e+02, // 0x4059F26D7C2EED53 +} + +// for x in [2.8570,2] = 1/[0.3499,0.5] +var p1R2 = [6]float64{ + 1.07710830106873743082e-07, // 0x3E7CE9D4F65544F4 + 1.17176219462683348094e-01, // 0x3FBDFF42BE760D83 + 2.36851496667608785174e+00, // 0x4002F2B7F98FAEC0 + 1.22426109148261232917e+01, // 0x40287C377F71A964 + 1.76939711271687727390e+01, // 0x4031B1A8177F8EE2 + 5.07352312588818499250e+00, // 0x40144B49A574C1FE +} + +var p1S2 = [5]float64{ + 2.14364859363821409488e+01, // 0x40356FBD8AD5ECDC + 1.25290227168402751090e+02, // 0x405F529314F92CD5 + 2.32276469057162813669e+02, // 0x406D08D8D5A2DBD9 + 1.17679373287147100768e+02, // 0x405D6B7ADA1884A9 + 8.36463893371618283368e+00, // 0x4020BAB1F44E5192 +} + +func pone(x float64) float64 { + var p *[6]float64 + var q *[5]float64 + if x >= 8 { + p = &p1R8 + q = &p1S8 + } else if x >= 4.5454 { + p = &p1R5 + q = &p1S5 + } else if x >= 2.8571 { + p = &p1R3 + q = &p1S3 + } else if x >= 2 { + p = &p1R2 + q = &p1S2 + } + z := 1 / (x * x) + r := p[0] + z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))) + s := 1.0 + z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))) + return 1 + r/s +} + +// For x >= 8, the asymptotic expansions of qone is +// 3/8 s - 105/1024 s**3 - ..., where s = 1/x. +// We approximate qone by +// qone(x) = s*(0.375 + (R/S)) +// where R = qr1*s**2 + qr2*s**4 + ... + qr5*s**10 +// S = 1 + qs1*s**2 + ... + qs6*s**12 +// and +// | qone(x)/s -0.375-R/S | <= 2**(-61.13) + +// for x in [inf, 8] = 1/[0,0.125] +var q1R8 = [6]float64{ + 0.00000000000000000000e+00, // 0x0000000000000000 + -1.02539062499992714161e-01, // 0xBFBA3FFFFFFFFDF3 + -1.62717534544589987888e+01, // 0xC0304591A26779F7 + -7.59601722513950107896e+02, // 0xC087BCD053E4B576 + -1.18498066702429587167e+04, // 0xC0C724E740F87415 + -4.84385124285750353010e+04, // 0xC0E7A6D065D09C6A +} + +var q1S8 = [6]float64{ + 1.61395369700722909556e+02, // 0x40642CA6DE5BCDE5 + 7.82538599923348465381e+03, // 0x40BE9162D0D88419 + 1.33875336287249578163e+05, // 0x4100579AB0B75E98 + 7.19657723683240939863e+05, // 0x4125F65372869C19 + 6.66601232617776375264e+05, // 0x412457D27719AD5C + -2.94490264303834643215e+05, // 0xC111F9690EA5AA18 +} + +// for x in [8,4.5454] = 1/[0.125,0.22001] +var q1R5 = [6]float64{ + -2.08979931141764104297e-11, // 0xBDB6FA431AA1A098 + -1.02539050241375426231e-01, // 0xBFBA3FFFCB597FEF + -8.05644828123936029840e+00, // 0xC0201CE6CA03AD4B + -1.83669607474888380239e+02, // 0xC066F56D6CA7B9B0 + -1.37319376065508163265e+03, // 0xC09574C66931734F + -2.61244440453215656817e+03, // 0xC0A468E388FDA79D +} + +var q1S5 = [6]float64{ + 8.12765501384335777857e+01, // 0x405451B2FF5A11B2 + 1.99179873460485964642e+03, // 0x409F1F31E77BF839 + 1.74684851924908907677e+04, // 0x40D10F1F0D64CE29 + 4.98514270910352279316e+04, // 0x40E8576DAABAD197 + 2.79480751638918118260e+04, // 0x40DB4B04CF7C364B + -4.71918354795128470869e+03, // 0xC0B26F2EFCFFA004 +} + +// for x in [4.5454,2.8571] = 1/[0.2199,0.35001] ??? +var q1R3 = [6]float64{ + -5.07831226461766561369e-09, // 0xBE35CFA9D38FC84F + -1.02537829820837089745e-01, // 0xBFBA3FEB51AEED54 + -4.61011581139473403113e+00, // 0xC01270C23302D9FF + -5.78472216562783643212e+01, // 0xC04CEC71C25D16DA + -2.28244540737631695038e+02, // 0xC06C87D34718D55F + -2.19210128478909325622e+02, // 0xC06B66B95F5C1BF6 +} + +var q1S3 = [6]float64{ + 4.76651550323729509273e+01, // 0x4047D523CCD367E4 + 6.73865112676699709482e+02, // 0x40850EEBC031EE3E + 3.38015286679526343505e+03, // 0x40AA684E448E7C9A + 5.54772909720722782367e+03, // 0x40B5ABBAA61D54A6 + 1.90311919338810798763e+03, // 0x409DBC7A0DD4DF4B + -1.35201191444307340817e+02, // 0xC060E670290A311F +} + +// for x in [2.8570,2] = 1/[0.3499,0.5] +var q1R2 = [6]float64{ + -1.78381727510958865572e-07, // 0xBE87F12644C626D2 + -1.02517042607985553460e-01, // 0xBFBA3E8E9148B010 + -2.75220568278187460720e+00, // 0xC006048469BB4EDA + -1.96636162643703720221e+01, // 0xC033A9E2C168907F + -4.23253133372830490089e+01, // 0xC04529A3DE104AAA + -2.13719211703704061733e+01, // 0xC0355F3639CF6E52 +} + +var q1S2 = [6]float64{ + 2.95333629060523854548e+01, // 0x403D888A78AE64FF + 2.52981549982190529136e+02, // 0x406F9F68DB821CBA + 7.57502834868645436472e+02, // 0x4087AC05CE49A0F7 + 7.39393205320467245656e+02, // 0x40871B2548D4C029 + 1.55949003336666123687e+02, // 0x40637E5E3C3ED8D4 + -4.95949898822628210127e+00, // 0xC013D686E71BE86B +} + +func qone(x float64) float64 { + var p, q *[6]float64 + if x >= 8 { + p = &q1R8 + q = &q1S8 + } else if x >= 4.5454 { + p = &q1R5 + q = &q1S5 + } else if x >= 2.8571 { + p = &q1R3 + q = &q1S3 + } else if x >= 2 { + p = &q1R2 + q = &q1S2 + } + z := 1 / (x * x) + r := p[0] + z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))) + s := 1 + z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))) + return (0.375 + r/s) / x +} diff --git a/gnovm/stdlibs/math/jn.gno b/gnovm/stdlibs/math/jn.gno new file mode 100644 index 00000000000..3491692a96c --- /dev/null +++ b/gnovm/stdlibs/math/jn.gno @@ -0,0 +1,306 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Bessel function of the first and second kinds of order n. +*/ + +// The original C code and the long comment below are +// from FreeBSD's /usr/src/lib/msun/src/e_jn.c and +// came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// __ieee754_jn(n, x), __ieee754_yn(n, x) +// floating point Bessel's function of the 1st and 2nd kind +// of order n +// +// Special cases: +// y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal; +// y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal. +// Note 2. About jn(n,x), yn(n,x) +// For n=0, j0(x) is called, +// for n=1, j1(x) is called, +// for nx, a continued fraction approximation to +// j(n,x)/j(n-1,x) is evaluated and then backward +// recursion is used starting from a supposed value +// for j(n,x). The resulting value of j(0,x) is +// compared with the actual value to correct the +// supposed value of j(n,x). +// +// yn(n,x) is similar in all respects, except +// that forward recursion is used for all +// values of n>1. + +// Jn returns the order-n Bessel function of the first kind. +// +// Special cases are: +// +// Jn(n, ±Inf) = 0 +// Jn(n, NaN) = NaN +func Jn(n int, x float64) float64 { + const ( + TwoM29 = 1.0 / (1 << 29) // 2**-29 0x3e10000000000000 + Two302 = 1 << 302 // 2**302 0x52D0000000000000 + ) + // special cases + switch { + case IsNaN(x): + return x + case IsInf(x, 0): + return 0 + } + // J(-n, x) = (-1)**n * J(n, x), J(n, -x) = (-1)**n * J(n, x) + // Thus, J(-n, x) = J(n, -x) + + if n == 0 { + return J0(x) + } + if x == 0 { + return 0 + } + if n < 0 { + n, x = -n, -x + } + if n == 1 { + return J1(x) + } + sign := false + if x < 0 { + x = -x + if n&1 == 1 { + sign = true // odd n and negative x + } + } + var b float64 + if float64(n) <= x { + // Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) + if x >= Two302 { // x > 2**302 + + // (x >> n**2) + // Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi) + // Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi) + // Let s=sin(x), c=cos(x), + // xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then + // + // n sin(xn)*sqt2 cos(xn)*sqt2 + // ---------------------------------- + // 0 s-c c+s + // 1 -s-c -c+s + // 2 -s+c -c-s + // 3 s+c c-s + + var temp float64 + switch s, c := Sincos(x); n & 3 { + case 0: + temp = c + s + case 1: + temp = -c + s + case 2: + temp = -c - s + case 3: + temp = c - s + } + b = (1 / SqrtPi) * temp / Sqrt(x) + } else { + b = J1(x) + for i, a := 1, J0(x); i < n; i++ { + a, b = b, b*(float64(i+i)/x)-a // avoid underflow + } + } + } else { + if x < TwoM29 { // x < 2**-29 + // x is tiny, return the first Taylor expansion of J(n,x) + // J(n,x) = 1/n!*(x/2)**n - ... + + if n > 33 { // underflow + b = 0 + } else { + temp := x * 0.5 + b = temp + a := 1.0 + for i := 2; i <= n; i++ { + a *= float64(i) // a = n! + b *= temp // b = (x/2)**n + } + b /= a + } + } else { + // use backward recurrence + // x x**2 x**2 + // J(n,x)/J(n-1,x) = ---- ------ ------ ..... + // 2n - 2(n+1) - 2(n+2) + // + // 1 1 1 + // (for large x) = ---- ------ ------ ..... + // 2n 2(n+1) 2(n+2) + // -- - ------ - ------ - + // x x x + // + // Let w = 2n/x and h=2/x, then the above quotient + // is equal to the continued fraction: + // 1 + // = ----------------------- + // 1 + // w - ----------------- + // 1 + // w+h - --------- + // w+2h - ... + // + // To determine how many terms needed, let + // Q(0) = w, Q(1) = w(w+h) - 1, + // Q(k) = (w+k*h)*Q(k-1) - Q(k-2), + // When Q(k) > 1e4 good for single + // When Q(k) > 1e9 good for double + // When Q(k) > 1e17 good for quadruple + + // determine k + w := float64(n+n) / x + h := 2 / x + q0 := w + z := w + h + q1 := w*z - 1 + k := 1 + for q1 < 1e9 { + k++ + z += h + q0, q1 = q1, z*q1-q0 + } + m := n + n + t := 0.0 + for i := 2 * (n + k); i >= m; i -= 2 { + t = 1 / (float64(i)/x - t) + } + a := t + b = 1 + // estimate log((2/x)**n*n!) = n*log(2/x)+n*ln(n) + // Hence, if n*(log(2n/x)) > ... + // single 8.8722839355e+01 + // double 7.09782712893383973096e+02 + // long double 1.1356523406294143949491931077970765006170e+04 + // then recurrent value may overflow and the result is + // likely underflow to zero + + tmp := float64(n) + v := 2 / x + tmp = tmp * Log(Abs(v*tmp)) + if tmp < 7.09782712893383973096e+02 { + for i := n - 1; i > 0; i-- { + di := float64(i + i) + a, b = b, b*di/x-a + } + } else { + for i := n - 1; i > 0; i-- { + di := float64(i + i) + a, b = b, b*di/x-a + // scale b to avoid spurious overflow + if b > 1e100 { + a /= b + t /= b + b = 1 + } + } + } + b = t * J0(x) / b + } + } + if sign { + return -b + } + return b +} + +// Yn returns the order-n Bessel function of the second kind. +// +// Special cases are: +// +// Yn(n, +Inf) = 0 +// Yn(n ≥ 0, 0) = -Inf +// Yn(n < 0, 0) = +Inf if n is odd, -Inf if n is even +// Yn(n, x < 0) = NaN +// Yn(n, NaN) = NaN +func Yn(n int, x float64) float64 { + const Two302 = 1 << 302 // 2**302 0x52D0000000000000 + // special cases + switch { + case x < 0 || IsNaN(x): + return NaN() + case IsInf(x, 1): + return 0 + } + + if n == 0 { + return Y0(x) + } + if x == 0 { + if n < 0 && n&1 == 1 { + return Inf(1) + } + return Inf(-1) + } + sign := false + if n < 0 { + n = -n + if n&1 == 1 { + sign = true // sign true if n < 0 && |n| odd + } + } + if n == 1 { + if sign { + return -Y1(x) + } + return Y1(x) + } + var b float64 + if x >= Two302 { // x > 2**302 + // (x >> n**2) + // Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi) + // Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi) + // Let s=sin(x), c=cos(x), + // xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then + // + // n sin(xn)*sqt2 cos(xn)*sqt2 + // ---------------------------------- + // 0 s-c c+s + // 1 -s-c -c+s + // 2 -s+c -c-s + // 3 s+c c-s + + var temp float64 + switch s, c := Sincos(x); n & 3 { + case 0: + temp = s - c + case 1: + temp = -s - c + case 2: + temp = -s + c + case 3: + temp = s + c + } + b = (1 / SqrtPi) * temp / Sqrt(x) + } else { + a := Y0(x) + b = Y1(x) + // quit if b is -inf + for i := 1; i < n && !IsInf(b, -1); i++ { + a, b = b, (float64(i+i)/x)*b-a + } + } + if sign { + return -b + } + return b +} diff --git a/gnovm/stdlibs/math/ldexp.gno b/gnovm/stdlibs/math/ldexp.gno index 5af0cff2c3b..d82114d5181 100644 --- a/gnovm/stdlibs/math/ldexp.gno +++ b/gnovm/stdlibs/math/ldexp.gno @@ -4,10 +4,6 @@ package math -import ( - imath "internal/math" -) - // Ldexp is the inverse of Frexp. // It returns frac × 2**exp. // @@ -17,11 +13,6 @@ import ( // Ldexp(±Inf, exp) = ±Inf // Ldexp(NaN, exp) = NaN func Ldexp(frac float64, exp int) float64 { - /* XXX - if haveArchLdexp { - return archLdexp(frac, exp) - } - */ return ldexp(frac, exp) } @@ -35,7 +26,7 @@ func ldexp(frac float64, exp int) float64 { } frac, e := normalize(frac) exp += e - x := imath.Float64bits(frac) + x := Float64bits(frac) exp += int(x>>shift)&mask - bias if exp < -1075 { return Copysign(0, frac) // underflow @@ -53,5 +44,5 @@ func ldexp(frac float64, exp int) float64 { } x &^= mask << shift x |= uint64(exp+bias) << shift - return m * imath.Float64frombits(x) + return m * Float64frombits(x) } diff --git a/gnovm/stdlibs/math/lgamma.gno b/gnovm/stdlibs/math/lgamma.gno new file mode 100644 index 00000000000..1fa22f9d5d0 --- /dev/null +++ b/gnovm/stdlibs/math/lgamma.gno @@ -0,0 +1,372 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Floating-point logarithm of the Gamma function. +*/ + +// The original C code and the long comment below are +// from FreeBSD's /usr/src/lib/msun/src/e_lgamma_r.c and +// came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// __ieee754_lgamma_r(x, signgamp) +// Reentrant version of the logarithm of the Gamma function +// with user provided pointer for the sign of Gamma(x). +// +// Method: +// 1. Argument Reduction for 0 < x <= 8 +// Since gamma(1+s)=s*gamma(s), for x in [0,8], we may +// reduce x to a number in [1.5,2.5] by +// lgamma(1+s) = log(s) + lgamma(s) +// for example, +// lgamma(7.3) = log(6.3) + lgamma(6.3) +// = log(6.3*5.3) + lgamma(5.3) +// = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3) +// 2. Polynomial approximation of lgamma around its +// minimum (ymin=1.461632144968362245) to maintain monotonicity. +// On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use +// Let z = x-ymin; +// lgamma(x) = -1.214862905358496078218 + z**2*poly(z) +// poly(z) is a 14 degree polynomial. +// 2. Rational approximation in the primary interval [2,3] +// We use the following approximation: +// s = x-2.0; +// lgamma(x) = 0.5*s + s*P(s)/Q(s) +// with accuracy +// |P/Q - (lgamma(x)-0.5s)| < 2**-61.71 +// Our algorithms are based on the following observation +// +// zeta(2)-1 2 zeta(3)-1 3 +// lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ... +// 2 3 +// +// where Euler = 0.5772156649... is the Euler constant, which +// is very close to 0.5. +// +// 3. For x>=8, we have +// lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+.... +// (better formula: +// lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...) +// Let z = 1/x, then we approximation +// f(z) = lgamma(x) - (x-0.5)(log(x)-1) +// by +// 3 5 11 +// w = w0 + w1*z + w2*z + w3*z + ... + w6*z +// where +// |w - f(z)| < 2**-58.74 +// +// 4. For negative x, since (G is gamma function) +// -x*G(-x)*G(x) = pi/sin(pi*x), +// we have +// G(x) = pi/(sin(pi*x)*(-x)*G(-x)) +// since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0 +// Hence, for x<0, signgam = sign(sin(pi*x)) and +// lgamma(x) = log(|Gamma(x)|) +// = log(pi/(|x*sin(pi*x)|)) - lgamma(-x); +// Note: one should avoid computing pi*(-x) directly in the +// computation of sin(pi*(-x)). +// +// 5. Special Cases +// lgamma(2+s) ~ s*(1-Euler) for tiny s +// lgamma(1)=lgamma(2)=0 +// lgamma(x) ~ -log(x) for tiny x +// lgamma(0) = lgamma(inf) = inf +// lgamma(-integer) = +-inf +// +// + +var _lgamA = [...]float64{ + 7.72156649015328655494e-02, // 0x3FB3C467E37DB0C8 + 3.22467033424113591611e-01, // 0x3FD4A34CC4A60FAD + 6.73523010531292681824e-02, // 0x3FB13E001A5562A7 + 2.05808084325167332806e-02, // 0x3F951322AC92547B + 7.38555086081402883957e-03, // 0x3F7E404FB68FEFE8 + 2.89051383673415629091e-03, // 0x3F67ADD8CCB7926B + 1.19270763183362067845e-03, // 0x3F538A94116F3F5D + 5.10069792153511336608e-04, // 0x3F40B6C689B99C00 + 2.20862790713908385557e-04, // 0x3F2CF2ECED10E54D + 1.08011567247583939954e-04, // 0x3F1C5088987DFB07 + 2.52144565451257326939e-05, // 0x3EFA7074428CFA52 + 4.48640949618915160150e-05, // 0x3F07858E90A45837 +} + +var _lgamR = [...]float64{ + 1.0, // placeholder + 1.39200533467621045958e+00, // 0x3FF645A762C4AB74 + 7.21935547567138069525e-01, // 0x3FE71A1893D3DCDC + 1.71933865632803078993e-01, // 0x3FC601EDCCFBDF27 + 1.86459191715652901344e-02, // 0x3F9317EA742ED475 + 7.77942496381893596434e-04, // 0x3F497DDACA41A95B + 7.32668430744625636189e-06, // 0x3EDEBAF7A5B38140 +} + +var _lgamS = [...]float64{ + -7.72156649015328655494e-02, // 0xBFB3C467E37DB0C8 + 2.14982415960608852501e-01, // 0x3FCB848B36E20878 + 3.25778796408930981787e-01, // 0x3FD4D98F4F139F59 + 1.46350472652464452805e-01, // 0x3FC2BB9CBEE5F2F7 + 2.66422703033638609560e-02, // 0x3F9B481C7E939961 + 1.84028451407337715652e-03, // 0x3F5E26B67368F239 + 3.19475326584100867617e-05, // 0x3F00BFECDD17E945 +} + +var _lgamT = [...]float64{ + 4.83836122723810047042e-01, // 0x3FDEF72BC8EE38A2 + -1.47587722994593911752e-01, // 0xBFC2E4278DC6C509 + 6.46249402391333854778e-02, // 0x3FB08B4294D5419B + -3.27885410759859649565e-02, // 0xBFA0C9A8DF35B713 + 1.79706750811820387126e-02, // 0x3F9266E7970AF9EC + -1.03142241298341437450e-02, // 0xBF851F9FBA91EC6A + 6.10053870246291332635e-03, // 0x3F78FCE0E370E344 + -3.68452016781138256760e-03, // 0xBF6E2EFFB3E914D7 + 2.25964780900612472250e-03, // 0x3F6282D32E15C915 + -1.40346469989232843813e-03, // 0xBF56FE8EBF2D1AF1 + 8.81081882437654011382e-04, // 0x3F4CDF0CEF61A8E9 + -5.38595305356740546715e-04, // 0xBF41A6109C73E0EC + 3.15632070903625950361e-04, // 0x3F34AF6D6C0EBBF7 + -3.12754168375120860518e-04, // 0xBF347F24ECC38C38 + 3.35529192635519073543e-04, // 0x3F35FD3EE8C2D3F4 +} + +var _lgamU = [...]float64{ + -7.72156649015328655494e-02, // 0xBFB3C467E37DB0C8 + 6.32827064025093366517e-01, // 0x3FE4401E8B005DFF + 1.45492250137234768737e+00, // 0x3FF7475CD119BD6F + 9.77717527963372745603e-01, // 0x3FEF497644EA8450 + 2.28963728064692451092e-01, // 0x3FCD4EAEF6010924 + 1.33810918536787660377e-02, // 0x3F8B678BBF2BAB09 +} + +var _lgamV = [...]float64{ + 1.0, + 2.45597793713041134822e+00, // 0x4003A5D7C2BD619C + 2.12848976379893395361e+00, // 0x40010725A42B18F5 + 7.69285150456672783825e-01, // 0x3FE89DFBE45050AF + 1.04222645593369134254e-01, // 0x3FBAAE55D6537C88 + 3.21709242282423911810e-03, // 0x3F6A5ABB57D0CF61 +} + +var _lgamW = [...]float64{ + 4.18938533204672725052e-01, // 0x3FDACFE390C97D69 + 8.33333333333329678849e-02, // 0x3FB555555555553B + -2.77777777728775536470e-03, // 0xBF66C16C16B02E5C + 7.93650558643019558500e-04, // 0x3F4A019F98CF38B6 + -5.95187557450339963135e-04, // 0xBF4380CB8C0FE741 + 8.36339918996282139126e-04, // 0x3F4B67BA4CDAD5D1 + -1.63092934096575273989e-03, // 0xBF5AB89D0B9E43E4 +} + +// Lgamma returns the natural logarithm and sign (-1 or +1) of Gamma(x). +// +// Special cases are: +// +// Lgamma(+Inf) = +Inf +// Lgamma(0) = +Inf +// Lgamma(-integer) = +Inf +// Lgamma(-Inf) = -Inf +// Lgamma(NaN) = NaN +func Lgamma(x float64) (lgamma float64, sign int) { + const ( + Ymin = 1.461632144968362245 + Two52 = 1 << 52 // 0x4330000000000000 ~4.5036e+15 + Two53 = 1 << 53 // 0x4340000000000000 ~9.0072e+15 + Two58 = 1 << 58 // 0x4390000000000000 ~2.8823e+17 + Tiny = 1.0 / (1 << 70) // 0x3b90000000000000 ~8.47033e-22 + Tc = 1.46163214496836224576e+00 // 0x3FF762D86356BE3F + Tf = -1.21486290535849611461e-01 // 0xBFBF19B9BCC38A42 + // Tt = -(tail of Tf) + Tt = -3.63867699703950536541e-18 // 0xBC50C7CAA48A971F + ) + // special cases + sign = 1 + switch { + case IsNaN(x): + lgamma = x + return + case IsInf(x, 0): + lgamma = x + return + case x == 0: + lgamma = Inf(1) + return + } + + neg := false + if x < 0 { + x = -x + neg = true + } + + if x < Tiny { // if |x| < 2**-70, return -log(|x|) + if neg { + sign = -1 + } + lgamma = -Log(x) + return + } + var nadj float64 + if neg { + if x >= Two52 { // |x| >= 2**52, must be -integer + lgamma = Inf(1) + return + } + t := sinPi(x) + if t == 0 { + lgamma = Inf(1) // -integer + return + } + nadj = Log(Pi / Abs(t*x)) + if t < 0 { + sign = -1 + } + } + + switch { + case x == 1 || x == 2: // purge off 1 and 2 + lgamma = 0 + return + case x < 2: // use lgamma(x) = lgamma(x+1) - log(x) + var y float64 + var i int + if x <= 0.9 { + lgamma = -Log(x) + switch { + case x >= (Ymin - 1 + 0.27): // 0.7316 <= x <= 0.9 + y = 1 - x + i = 0 + case x >= (Ymin - 1 - 0.27): // 0.2316 <= x < 0.7316 + y = x - (Tc - 1) + i = 1 + default: // 0 < x < 0.2316 + y = x + i = 2 + } + } else { + lgamma = 0 + switch { + case x >= (Ymin + 0.27): // 1.7316 <= x < 2 + y = 2 - x + i = 0 + case x >= (Ymin - 0.27): // 1.2316 <= x < 1.7316 + y = x - Tc + i = 1 + default: // 0.9 < x < 1.2316 + y = x - 1 + i = 2 + } + } + switch i { + case 0: + z := y * y + p1 := _lgamA[0] + z*(_lgamA[2]+z*(_lgamA[4]+z*(_lgamA[6]+z*(_lgamA[8]+z*_lgamA[10])))) + p2 := z * (_lgamA[1] + z*(+_lgamA[3]+z*(_lgamA[5]+z*(_lgamA[7]+z*(_lgamA[9]+z*_lgamA[11]))))) + p := y*p1 + p2 + lgamma += (p - 0.5*y) + case 1: + z := y * y + w := z * y + p1 := _lgamT[0] + w*(_lgamT[3]+w*(_lgamT[6]+w*(_lgamT[9]+w*_lgamT[12]))) // parallel comp + p2 := _lgamT[1] + w*(_lgamT[4]+w*(_lgamT[7]+w*(_lgamT[10]+w*_lgamT[13]))) + p3 := _lgamT[2] + w*(_lgamT[5]+w*(_lgamT[8]+w*(_lgamT[11]+w*_lgamT[14]))) + p := z*p1 - (Tt - w*(p2+y*p3)) + lgamma += (Tf + p) + case 2: + p1 := y * (_lgamU[0] + y*(_lgamU[1]+y*(_lgamU[2]+y*(_lgamU[3]+y*(_lgamU[4]+y*_lgamU[5]))))) + p2 := 1 + y*(_lgamV[1]+y*(_lgamV[2]+y*(_lgamV[3]+y*(_lgamV[4]+y*_lgamV[5])))) + lgamma += (-0.5*y + p1/p2) + } + case x < 8: // 2 <= x < 8 + i := int(x) + y := x - float64(i) + p := y * (_lgamS[0] + y*(_lgamS[1]+y*(_lgamS[2]+y*(_lgamS[3]+y*(_lgamS[4]+y*(_lgamS[5]+y*_lgamS[6])))))) + q := 1 + y*(_lgamR[1]+y*(_lgamR[2]+y*(_lgamR[3]+y*(_lgamR[4]+y*(_lgamR[5]+y*_lgamR[6]))))) + lgamma = 0.5*y + p/q + z := 1.0 // Lgamma(1+s) = Log(s) + Lgamma(s) + switch i { + case 7: + z *= (y + 6) + fallthrough + case 6: + z *= (y + 5) + fallthrough + case 5: + z *= (y + 4) + fallthrough + case 4: + z *= (y + 3) + fallthrough + case 3: + z *= (y + 2) + lgamma += Log(z) + } + case x < Two58: // 8 <= x < 2**58 + t := Log(x) + z := 1 / x + y := z * z + w := _lgamW[0] + z*(_lgamW[1]+y*(_lgamW[2]+y*(_lgamW[3]+y*(_lgamW[4]+y*(_lgamW[5]+y*_lgamW[6]))))) + lgamma = (x-0.5)*(t-1) + w + default: // 2**58 <= x <= Inf + lgamma = x * (Log(x) - 1) + } + if neg { + lgamma = nadj - lgamma + } + return +} + +// sinPi(x) is a helper function for negative x +func sinPi(x float64) float64 { + const ( + Two52 = 1 << 52 // 0x4330000000000000 ~4.5036e+15 + Two53 = 1 << 53 // 0x4340000000000000 ~9.0072e+15 + ) + if x < 0.25 { + return -Sin(Pi * x) + } + + // argument reduction + z := Floor(x) + var n int + if z != x { // inexact + x = Mod(x, 2) + n = int(x * 4) + } else { + if x >= Two53 { // x must be even + x = 0 + n = 0 + } else { + if x < Two52 { + z = x + Two52 // exact + } + n = int(1 & Float64bits(z)) + x = float64(n) + n <<= 2 + } + } + switch n { + case 0: + x = Sin(Pi * x) + case 1, 2: + x = Cos(Pi * (0.5 - x)) + case 3, 4: + x = Sin(Pi * (1 - x)) + case 5, 6: + x = -Cos(Pi * (x - 1.5)) + default: + x = Sin(Pi * (x - 2)) + } + return -x +} diff --git a/gnovm/stdlibs/math/log.gno b/gnovm/stdlibs/math/log.gno new file mode 100644 index 00000000000..5bcb1600ff9 --- /dev/null +++ b/gnovm/stdlibs/math/log.gno @@ -0,0 +1,126 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Floating-point logarithm. +*/ + +// The original C code, the long comment, and the constants +// below are from FreeBSD's /usr/src/lib/msun/src/e_log.c +// and came with this notice. The go code is a simpler +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// __ieee754_log(x) +// Return the logarithm of x +// +// Method : +// 1. Argument Reduction: find k and f such that +// x = 2**k * (1+f), +// where sqrt(2)/2 < 1+f < sqrt(2) . +// +// 2. Approximation of log(1+f). +// Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s) +// = 2s + 2/3 s**3 + 2/5 s**5 + ....., +// = 2s + s*R +// We use a special Reme algorithm on [0,0.1716] to generate +// a polynomial of degree 14 to approximate R. The maximum error +// of this polynomial approximation is bounded by 2**-58.45. In +// other words, +// 2 4 6 8 10 12 14 +// R(z) ~ L1*s +L2*s +L3*s +L4*s +L5*s +L6*s +L7*s +// (the values of L1 to L7 are listed in the program) and +// | 2 14 | -58.45 +// | L1*s +...+L7*s - R(z) | <= 2 +// | | +// Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2. +// In order to guarantee error in log below 1ulp, we compute log by +// log(1+f) = f - s*(f - R) (if f is not too large) +// log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy) +// +// 3. Finally, log(x) = k*Ln2 + log(1+f). +// = k*Ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*Ln2_lo))) +// Here Ln2 is split into two floating point number: +// Ln2_hi + Ln2_lo, +// where n*Ln2_hi is always exact for |n| < 2000. +// +// Special cases: +// log(x) is NaN with signal if x < 0 (including -INF) ; +// log(+INF) is +INF; log(0) is -INF with signal; +// log(NaN) is that NaN with no signal. +// +// Accuracy: +// according to an error analysis, the error is always less than +// 1 ulp (unit in the last place). +// +// Constants: +// The hexadecimal values are the intended ones for the following +// constants. The decimal values may be used, provided that the +// compiler will convert from decimal to binary accurately enough +// to produce the hexadecimal values shown. + +// Log returns the natural logarithm of x. +// +// Special cases are: +// +// Log(+Inf) = +Inf +// Log(0) = -Inf +// Log(x < 0) = NaN +// Log(NaN) = NaN +func Log(x float64) float64 { + return log(x) +} + +func log(x float64) float64 { + const ( + Ln2Hi = 6.93147180369123816490e-01 /* 3fe62e42 fee00000 */ + Ln2Lo = 1.90821492927058770002e-10 /* 3dea39ef 35793c76 */ + L1 = 6.666666666666735130e-01 /* 3FE55555 55555593 */ + L2 = 3.999999999940941908e-01 /* 3FD99999 9997FA04 */ + L3 = 2.857142874366239149e-01 /* 3FD24924 94229359 */ + L4 = 2.222219843214978396e-01 /* 3FCC71C5 1D8E78AF */ + L5 = 1.818357216161805012e-01 /* 3FC74664 96CB03DE */ + L6 = 1.531383769920937332e-01 /* 3FC39A09 D078C69F */ + L7 = 1.479819860511658591e-01 /* 3FC2F112 DF3E5244 */ + ) + + // special cases + switch { + case IsNaN(x) || IsInf(x, 1): + return x + case x < 0: + return NaN() + case x == 0: + return Inf(-1) + } + + // reduce + f1, ki := Frexp(x) + if f1 < Sqrt2/2 { + f1 *= 2 + ki-- + } + f := f1 - 1 + k := float64(ki) + + // compute + s := f / (2 + f) + s2 := s * s + s4 := s2 * s2 + t1 := s2 * (L1 + s4*(L3+s4*(L5+s4*L7))) + t2 := s4 * (L2 + s4*(L4+s4*L6)) + R := t1 + t2 + hfsq := 0.5 * f * f + return k*Ln2Hi - ((hfsq - (s*(hfsq+R) + k*Ln2Lo)) - f) +} diff --git a/gnovm/stdlibs/math/log10.gno b/gnovm/stdlibs/math/log10.gno new file mode 100644 index 00000000000..7c7d6cf5d3c --- /dev/null +++ b/gnovm/stdlibs/math/log10.gno @@ -0,0 +1,31 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// Log10 returns the decimal logarithm of x. +// The special cases are the same as for Log. +func Log10(x float64) float64 { + return log10(x) +} + +func log10(x float64) float64 { + return Log(x) * (1 / Ln10) +} + +// Log2 returns the binary logarithm of x. +// The special cases are the same as for Log. +func Log2(x float64) float64 { + return log2(x) +} + +func log2(x float64) float64 { + frac, exp := Frexp(x) + // Make sure exact powers of two give an exact answer. + // Don't depend on Log(0.5)*(1/Ln2)+exp being exactly exp-1. + if frac == 0.5 { + return float64(exp - 1) + } + return Log(frac)*(1/Ln2) + float64(exp) +} diff --git a/gnovm/stdlibs/math/log1p.gno b/gnovm/stdlibs/math/log1p.gno new file mode 100644 index 00000000000..819bf123504 --- /dev/null +++ b/gnovm/stdlibs/math/log1p.gno @@ -0,0 +1,200 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code, the long comment, and the constants +// below are from FreeBSD's /usr/src/lib/msun/src/s_log1p.c +// and came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// +// double log1p(double x) +// +// Method : +// 1. Argument Reduction: find k and f such that +// 1+x = 2**k * (1+f), +// where sqrt(2)/2 < 1+f < sqrt(2) . +// +// Note. If k=0, then f=x is exact. However, if k!=0, then f +// may not be representable exactly. In that case, a correction +// term is need. Let u=1+x rounded. Let c = (1+x)-u, then +// log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u), +// and add back the correction term c/u. +// (Note: when x > 2**53, one can simply return log(x)) +// +// 2. Approximation of log1p(f). +// Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s) +// = 2s + 2/3 s**3 + 2/5 s**5 + ....., +// = 2s + s*R +// We use a special Reme algorithm on [0,0.1716] to generate +// a polynomial of degree 14 to approximate R The maximum error +// of this polynomial approximation is bounded by 2**-58.45. In +// other words, +// 2 4 6 8 10 12 14 +// R(z) ~ Lp1*s +Lp2*s +Lp3*s +Lp4*s +Lp5*s +Lp6*s +Lp7*s +// (the values of Lp1 to Lp7 are listed in the program) +// and +// | 2 14 | -58.45 +// | Lp1*s +...+Lp7*s - R(z) | <= 2 +// | | +// Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2. +// In order to guarantee error in log below 1ulp, we compute log +// by +// log1p(f) = f - (hfsq - s*(hfsq+R)). +// +// 3. Finally, log1p(x) = k*ln2 + log1p(f). +// = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo))) +// Here ln2 is split into two floating point number: +// ln2_hi + ln2_lo, +// where n*ln2_hi is always exact for |n| < 2000. +// +// Special cases: +// log1p(x) is NaN with signal if x < -1 (including -INF) ; +// log1p(+INF) is +INF; log1p(-1) is -INF with signal; +// log1p(NaN) is that NaN with no signal. +// +// Accuracy: +// according to an error analysis, the error is always less than +// 1 ulp (unit in the last place). +// +// Constants: +// The hexadecimal values are the intended ones for the following +// constants. The decimal values may be used, provided that the +// compiler will convert from decimal to binary accurately enough +// to produce the hexadecimal values shown. +// +// Note: Assuming log() return accurate answer, the following +// algorithm can be used to compute log1p(x) to within a few ULP: +// +// u = 1+x; +// if(u==1.0) return x ; else +// return log(u)*(x/(u-1.0)); +// +// See HP-15C Advanced Functions Handbook, p.193. + +// Log1p returns the natural logarithm of 1 plus its argument x. +// It is more accurate than Log(1 + x) when x is near zero. +// +// Special cases are: +// +// Log1p(+Inf) = +Inf +// Log1p(±0) = ±0 +// Log1p(-1) = -Inf +// Log1p(x < -1) = NaN +// Log1p(NaN) = NaN +func Log1p(x float64) float64 { + return log1p(x) +} + +func log1p(x float64) float64 { + const ( + Sqrt2M1 = 4.142135623730950488017e-01 // Sqrt(2)-1 = 0x3fda827999fcef34 + Sqrt2HalfM1 = -2.928932188134524755992e-01 // Sqrt(2)/2-1 = 0xbfd2bec333018866 + Small = 1.0 / (1 << 29) // 2**-29 = 0x3e20000000000000 + Tiny = 1.0 / (1 << 54) // 2**-54 + Two53 = 1 << 53 // 2**53 + Ln2Hi = 6.93147180369123816490e-01 // 3fe62e42fee00000 + Ln2Lo = 1.90821492927058770002e-10 // 3dea39ef35793c76 + Lp1 = 6.666666666666735130e-01 // 3FE5555555555593 + Lp2 = 3.999999999940941908e-01 // 3FD999999997FA04 + Lp3 = 2.857142874366239149e-01 // 3FD2492494229359 + Lp4 = 2.222219843214978396e-01 // 3FCC71C51D8E78AF + Lp5 = 1.818357216161805012e-01 // 3FC7466496CB03DE + Lp6 = 1.531383769920937332e-01 // 3FC39A09D078C69F + Lp7 = 1.479819860511658591e-01 // 3FC2F112DF3E5244 + ) + + // special cases + switch { + case x < -1 || IsNaN(x): // includes -Inf + return NaN() + case x == -1: + return Inf(-1) + case IsInf(x, 1): + return Inf(1) + } + + absx := Abs(x) + + var f float64 + var iu uint64 + k := 1 + if absx < Sqrt2M1 { // |x| < Sqrt(2)-1 + if absx < Small { // |x| < 2**-29 + if absx < Tiny { // |x| < 2**-54 + return x + } + return x - x*x*0.5 + } + if x > Sqrt2HalfM1 { // Sqrt(2)/2-1 < x + // (Sqrt(2)/2-1) < x < (Sqrt(2)-1) + k = 0 + f = x + iu = 1 + } + } + var c float64 + if k != 0 { + var u float64 + if absx < Two53 { // 1<<53 + u = 1.0 + x + iu = Float64bits(u) + k = int((iu >> 52) - 1023) + // correction term + if k > 0 { + c = 1.0 - (u - x) + } else { + c = x - (u - 1.0) + } + c /= u + } else { + u = x + iu = Float64bits(u) + k = int((iu >> 52) - 1023) + c = 0 + } + iu &= 0x000fffffffffffff + if iu < 0x0006a09e667f3bcd { // mantissa of Sqrt(2) + u = Float64frombits(iu | 0x3ff0000000000000) // normalize u + } else { + k++ + u = Float64frombits(iu | 0x3fe0000000000000) // normalize u/2 + iu = (0x0010000000000000 - iu) >> 2 + } + f = u - 1.0 // Sqrt(2)/2 < u < Sqrt(2) + } + hfsq := 0.5 * f * f + var s, R, z float64 + if iu == 0 { // |f| < 2**-20 + if f == 0 { + if k == 0 { + return 0 + } + c += float64(k) * Ln2Lo + return float64(k)*Ln2Hi + c + } + R = hfsq * (1.0 - 0.66666666666666666*f) // avoid division + if k == 0 { + return f - R + } + return float64(k)*Ln2Hi - ((R - (float64(k)*Ln2Lo + c)) - f) + } + s = f / (2.0 + f) + z = s * s + R = z * (Lp1 + z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7)))))) + if k == 0 { + return f - (hfsq - s*(hfsq+R)) + } + return float64(k)*Ln2Hi - ((hfsq - (s*(hfsq+R) + (float64(k)*Ln2Lo + c))) - f) +} diff --git a/gnovm/stdlibs/math/logb.gno b/gnovm/stdlibs/math/logb.gno new file mode 100644 index 00000000000..1a46464127c --- /dev/null +++ b/gnovm/stdlibs/math/logb.gno @@ -0,0 +1,52 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// Logb returns the binary exponent of x. +// +// Special cases are: +// +// Logb(±Inf) = +Inf +// Logb(0) = -Inf +// Logb(NaN) = NaN +func Logb(x float64) float64 { + // special cases + switch { + case x == 0: + return Inf(-1) + case IsInf(x, 0): + return Inf(1) + case IsNaN(x): + return x + } + return float64(ilogb(x)) +} + +// Ilogb returns the binary exponent of x as an integer. +// +// Special cases are: +// +// Ilogb(±Inf) = MaxInt32 +// Ilogb(0) = MinInt32 +// Ilogb(NaN) = MaxInt32 +func Ilogb(x float64) int { + // special cases + switch { + case x == 0: + return MinInt32 + case IsNaN(x): + return MaxInt32 + case IsInf(x, 0): + return MaxInt32 + } + return ilogb(x) +} + +// ilogb returns the binary exponent of x. It assumes x is finite and +// non-zero. +func ilogb(x float64) int { + x, exp := normalize(x) + return int((Float64bits(x)>>shift)&mask) - bias + exp +} diff --git a/gnovm/stdlibs/math/mod.gno b/gnovm/stdlibs/math/mod.gno new file mode 100644 index 00000000000..54cf0b88d2a --- /dev/null +++ b/gnovm/stdlibs/math/mod.gno @@ -0,0 +1,49 @@ +// Copyright 2009-2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Floating-point mod function. +*/ + +// Mod returns the floating-point remainder of x/y. +// The magnitude of the result is less than y and its +// sign agrees with that of x. +// +// Special cases are: +// +// Mod(±Inf, y) = NaN +// Mod(NaN, y) = NaN +// Mod(x, 0) = NaN +// Mod(x, ±Inf) = x +// Mod(x, NaN) = NaN +func Mod(x, y float64) float64 { + return mod(x, y) +} + +func mod(x, y float64) float64 { + if y == 0 || IsInf(x, 0) || IsNaN(x) || IsNaN(y) { + return NaN() + } + y = Abs(y) + + yfr, yexp := Frexp(y) + r := x + if x < 0 { + r = -x + } + + for r >= y { + rfr, rexp := Frexp(r) + if rfr < yfr { + rexp = rexp - 1 + } + r = r - Ldexp(y, rexp-yexp) + } + if x < 0 { + r = -r + } + return r +} diff --git a/gnovm/stdlibs/math/modf.gno b/gnovm/stdlibs/math/modf.gno index d0fb27ef007..868d2c6f5f9 100644 --- a/gnovm/stdlibs/math/modf.gno +++ b/gnovm/stdlibs/math/modf.gno @@ -4,10 +4,6 @@ package math -import ( - imath "internal/math" -) - // Modf returns integer and fractional floating-point numbers // that sum to f. Both values have the same sign as f. // @@ -16,11 +12,6 @@ import ( // Modf(±Inf) = ±Inf, NaN // Modf(NaN) = NaN, NaN func Modf(f float64) (int float64, frac float64) { - /* XXX - if haveArchModf { - return archModf(f) - } - */ return modf(f) } @@ -36,14 +27,14 @@ func modf(f float64) (int float64, frac float64) { return 0, f } - x := imath.Float64bits(f) + x := Float64bits(f) e := uint(x>>shift)&mask - bias // Keep the top 12+e bits, the integer part; clear the rest. if e < 64-12 { x &^= 1<<(64-12-e) - 1 } - int = imath.Float64frombits(x) + int = Float64frombits(x) frac = f - int return } diff --git a/gnovm/stdlibs/math/nextafter.gno b/gnovm/stdlibs/math/nextafter.gno new file mode 100644 index 00000000000..ec18d542d9c --- /dev/null +++ b/gnovm/stdlibs/math/nextafter.gno @@ -0,0 +1,51 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// Nextafter32 returns the next representable float32 value after x towards y. +// +// Special cases are: +// +// Nextafter32(x, x) = x +// Nextafter32(NaN, y) = NaN +// Nextafter32(x, NaN) = NaN +func Nextafter32(x, y float32) (r float32) { + switch { + case IsNaN(float64(x)) || IsNaN(float64(y)): // special case + r = float32(NaN()) + case x == y: + r = x + case x == 0: + r = float32(Copysign(float64(Float32frombits(1)), float64(y))) + case (y > x) == (x > 0): + r = Float32frombits(Float32bits(x) + 1) + default: + r = Float32frombits(Float32bits(x) - 1) + } + return +} + +// Nextafter returns the next representable float64 value after x towards y. +// +// Special cases are: +// +// Nextafter(x, x) = x +// Nextafter(NaN, y) = NaN +// Nextafter(x, NaN) = NaN +func Nextafter(x, y float64) (r float64) { + switch { + case IsNaN(x) || IsNaN(y): // special case + r = NaN() + case x == y: + r = x + case x == 0: + r = Copysign(Float64frombits(1), y) + case (y > x) == (x > 0): + r = Float64frombits(Float64bits(x) + 1) + default: + r = Float64frombits(Float64bits(x) - 1) + } + return +} diff --git a/gnovm/stdlibs/math/pow.gno b/gnovm/stdlibs/math/pow.gno new file mode 100644 index 00000000000..b8544e6831f --- /dev/null +++ b/gnovm/stdlibs/math/pow.gno @@ -0,0 +1,163 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +func isOddInt(x float64) bool { + if Abs(x) >= (1 << 53) { + // 1 << 53 is the largest exact integer in the float64 format. + // Any number outside this range will be truncated before the decimal point and therefore will always be + // an even integer. + // Without this check and if x overflows int64 the int64(xi) conversion below may produce incorrect results + // on some architectures (and does so on arm64). See issue #57465. + return false + } + + xi, xf := Modf(x) + return xf == 0 && int64(xi)&1 == 1 +} + +// Special cases taken from FreeBSD's /usr/src/lib/msun/src/e_pow.c +// updated by IEEE Std. 754-2008 "Section 9.2.1 Special values". + +// Pow returns x**y, the base-x exponential of y. +// +// Special cases are (in order): +// +// Pow(x, ±0) = 1 for any x +// Pow(1, y) = 1 for any y +// Pow(x, 1) = x for any x +// Pow(NaN, y) = NaN +// Pow(x, NaN) = NaN +// Pow(±0, y) = ±Inf for y an odd integer < 0 +// Pow(±0, -Inf) = +Inf +// Pow(±0, +Inf) = +0 +// Pow(±0, y) = +Inf for finite y < 0 and not an odd integer +// Pow(±0, y) = ±0 for y an odd integer > 0 +// Pow(±0, y) = +0 for finite y > 0 and not an odd integer +// Pow(-1, ±Inf) = 1 +// Pow(x, +Inf) = +Inf for |x| > 1 +// Pow(x, -Inf) = +0 for |x| > 1 +// Pow(x, +Inf) = +0 for |x| < 1 +// Pow(x, -Inf) = +Inf for |x| < 1 +// Pow(+Inf, y) = +Inf for y > 0 +// Pow(+Inf, y) = +0 for y < 0 +// Pow(-Inf, y) = Pow(-0, -y) +// Pow(x, y) = NaN for finite x < 0 and finite non-integer y +func Pow(x, y float64) float64 { + return pow(x, y) +} + +func pow(x, y float64) float64 { + switch { + case y == 0 || x == 1: + return 1 + case y == 1: + return x + case IsNaN(x) || IsNaN(y): + return NaN() + case x == 0: + switch { + case y < 0: + if Signbit(x) && isOddInt(y) { + return Inf(-1) + } + return Inf(1) + case y > 0: + if Signbit(x) && isOddInt(y) { + return x + } + return 0 + } + case IsInf(y, 0): + switch { + case x == -1: + return 1 + case (Abs(x) < 1) == IsInf(y, 1): + return 0 + default: + return Inf(1) + } + case IsInf(x, 0): + if IsInf(x, -1) { + return Pow(1/x, -y) // Pow(-0, -y) + } + switch { + case y < 0: + return 0 + case y > 0: + return Inf(1) + } + case y == 0.5: + return Sqrt(x) + case y == -0.5: + return 1 / Sqrt(x) + } + + yi, yf := Modf(Abs(y)) + if yf != 0 && x < 0 { + return NaN() + } + if yi >= 1<<63 { + // yi is a large even int that will lead to overflow (or underflow to 0) + // for all x except -1 (x == 1 was handled earlier) + switch { + case x == -1: + return 1 + case (Abs(x) < 1) == (y > 0): + return 0 + default: + return Inf(1) + } + } + + // ans = a1 * 2**ae (= 1 for now). + a1 := 1.0 + ae := 0 + + // ans *= x**yf + if yf != 0 { + if yf > 0.5 { + yf-- + yi++ + } + a1 = Exp(yf * Log(x)) + } + + // ans *= x**yi + // by multiplying in successive squarings + // of x according to bits of yi. + // accumulate powers of two into exp. + x1, xe := Frexp(x) + for i := int64(yi); i != 0; i >>= 1 { + if xe < -1<<12 || 1<<12 < xe { + // catch xe before it overflows the left shift below + // Since i !=0 it has at least one bit still set, so ae will accumulate xe + // on at least one more iteration, ae += xe is a lower bound on ae + // the lower bound on ae exceeds the size of a float64 exp + // so the final call to Ldexp will produce under/overflow (0/Inf) + ae += xe + break + } + if i&1 == 1 { + a1 *= x1 + ae += xe + } + x1 *= x1 + xe <<= 1 + if x1 < .5 { + x1 += x1 + xe-- + } + } + + // ans = a1*2**ae + // if y < 0 { ans = 1 / ans } + // but in the opposite order + if y < 0 { + a1 = 1 / a1 + ae = -ae + } + return Ldexp(a1, ae) +} diff --git a/gnovm/stdlibs/math/pow10.gno b/gnovm/stdlibs/math/pow10.gno new file mode 100644 index 00000000000..c31ad8dbc77 --- /dev/null +++ b/gnovm/stdlibs/math/pow10.gno @@ -0,0 +1,47 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// pow10tab stores the pre-computed values 10**i for i < 32. +var pow10tab = [...]float64{ + 1e00, 1e01, 1e02, 1e03, 1e04, 1e05, 1e06, 1e07, 1e08, 1e09, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, + 1e30, 1e31, +} + +// pow10postab32 stores the pre-computed value for 10**(i*32) at index i. +var pow10postab32 = [...]float64{ + 1e00, 1e32, 1e64, 1e96, 1e128, 1e160, 1e192, 1e224, 1e256, 1e288, +} + +// pow10negtab32 stores the pre-computed value for 10**(-i*32) at index i. +var pow10negtab32 = [...]float64{ + 1e-00, 1e-32, 1e-64, 1e-96, 1e-128, 1e-160, 1e-192, 1e-224, 1e-256, 1e-288, 1e-320, +} + +// Pow10 returns 10**n, the base-10 exponential of n. +// +// Special cases are: +// +// Pow10(n) = 0 for n < -323 +// Pow10(n) = +Inf for n > 308 +func Pow10(n int) float64 { + if 0 <= n && n <= 308 { + return pow10postab32[uint(n)/32] * pow10tab[uint(n)%32] + } + + if -323 <= n && n <= 0 { + return pow10negtab32[uint(-n)/32] / pow10tab[uint(-n)%32] + } + + // n < -323 || 308 < n + if n > 0 { + return Inf(1) + } + + // n < -323 + return 0 +} diff --git a/gnovm/stdlibs/math/remainder.gno b/gnovm/stdlibs/math/remainder.gno new file mode 100644 index 00000000000..436dc595fa1 --- /dev/null +++ b/gnovm/stdlibs/math/remainder.gno @@ -0,0 +1,92 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code and the comment below are from +// FreeBSD's /usr/src/lib/msun/src/e_remainder.c and came +// with this notice. The go code is a simplified version of +// the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// __ieee754_remainder(x,y) +// Return : +// returns x REM y = x - [x/y]*y as if in infinite +// precision arithmetic, where [x/y] is the (infinite bit) +// integer nearest x/y (in half way cases, choose the even one). +// Method : +// Based on Mod() returning x - [x/y]chopped * y exactly. + +// Remainder returns the IEEE 754 floating-point remainder of x/y. +// +// Special cases are: +// +// Remainder(±Inf, y) = NaN +// Remainder(NaN, y) = NaN +// Remainder(x, 0) = NaN +// Remainder(x, ±Inf) = x +// Remainder(x, NaN) = NaN +func Remainder(x, y float64) float64 { + return remainder(x, y) +} + +func remainder(x, y float64) float64 { + const ( + Tiny = 4.45014771701440276618e-308 // 0x0020000000000000 + HalfMax = MaxFloat64 / 2 + ) + // special cases + switch { + case IsNaN(x) || IsNaN(y) || IsInf(x, 0) || y == 0: + return NaN() + case IsInf(y, 0): + return x + } + sign := false + if x < 0 { + x = -x + sign = true + } + if y < 0 { + y = -y + } + if x == y { + if sign { + zero := 0.0 + return -zero + } + return 0 + } + if y <= HalfMax { + x = Mod(x, y+y) // now x < 2y + } + if y < Tiny { + if x+x > y { + x -= y + if x+x >= y { + x -= y + } + } + } else { + yHalf := 0.5 * y + if x > yHalf { + x -= y + if x >= yHalf { + x -= y + } + } + } + if sign { + x = -x + } + return x +} diff --git a/gnovm/stdlibs/math/signbit.gno b/gnovm/stdlibs/math/signbit.gno index 38c2178932e..f6e61d660e2 100644 --- a/gnovm/stdlibs/math/signbit.gno +++ b/gnovm/stdlibs/math/signbit.gno @@ -1,10 +1,10 @@ -package math +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. -import ( - imath "internal/math" -) +package math // Signbit reports whether x is negative or negative zero. func Signbit(x float64) bool { - return imath.Float64bits(x)&(1<<63) != 0 + return Float64bits(x)&(1<<63) != 0 } diff --git a/gnovm/stdlibs/math/sin.gno b/gnovm/stdlibs/math/sin.gno index 40a611edf70..a5c70d8074e 100644 --- a/gnovm/stdlibs/math/sin.gno +++ b/gnovm/stdlibs/math/sin.gno @@ -1,7 +1,6 @@ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// from https://github.com/golang/go/blob/e4de2e7fd04c92d4035cd268d5043f2380aef437/src/pkg/math/sin.go package math @@ -110,42 +109,49 @@ var _cos = [...]float64{ 4.16666666666665929218e-2, // 0x3fa555555555554b } -// Cos returns the cosine of x. +// Cos returns the cosine of the radian argument x. // // Special cases are: // // Cos(±Inf) = NaN // Cos(NaN) = NaN func Cos(x float64) float64 { + return cos(x) +} + +func cos(x float64) float64 { const ( - PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, - PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, - M4PI = 1.273239544735162542821171882678754627704620361328125 // 4/pi + PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, + PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, ) - // TODO(rsc): Remove manual inlining of IsNaN, IsInf - // when compiler does it for us // special cases switch { - case x != x || x < -MaxFloat64 || x > MaxFloat64: // IsNaN(x) || IsInf(x, 0): + case IsNaN(x) || IsInf(x, 0): return NaN() } // make argument positive sign := false - if x < 0 { - x = -x - } + x = Abs(x) - j := int64(x * M4PI) // integer part of x/(Pi/4), as integer for tests on the phase angle - y := float64(j) // integer part of x/(Pi/4), as float + var j uint64 + var y, z float64 + if x >= reduceThreshold { + j, z = trigReduce(x) + } else { + j = uint64(x * (4 / Pi)) // integer part of x/(Pi/4), as integer for tests on the phase angle + y = float64(j) // integer part of x/(Pi/4), as float - // map zeros to origin - if j&1 == 1 { - j += 1 - y += 1 + // map zeros to origin + if j&1 == 1 { + j++ + y++ + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + z = ((x - y*PI4A) - y*PI4B) - y*PI4C // Extended precision modular arithmetic } - j &= 7 // octant modulo 2Pi radians (360 degrees) + if j > 3 { j -= 4 sign = !sign @@ -154,7 +160,6 @@ func Cos(x float64) float64 { sign = !sign } - z := ((x - y*PI4A) - y*PI4B) - y*PI4C // Extended precision modular arithmetic zz := z * z if j == 1 || j == 2 { y = z + z*zz*((((((_sin[0]*zz)+_sin[1])*zz+_sin[2])*zz+_sin[3])*zz+_sin[4])*zz+_sin[5]) @@ -167,7 +172,7 @@ func Cos(x float64) float64 { return y } -// Sin returns the sine of x. +// Sin returns the sine of the radian argument x. // // Special cases are: // @@ -175,19 +180,20 @@ func Cos(x float64) float64 { // Sin(±Inf) = NaN // Sin(NaN) = NaN func Sin(x float64) float64 { + return sin(x) +} + +func sin(x float64) float64 { const ( - PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, - PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, - M4PI = 1.273239544735162542821171882678754627704620361328125 // 4/pi + PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, + PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, ) - // TODO(rsc): Remove manual inlining of IsNaN, IsInf - // when compiler does it for us // special cases switch { - case x == 0 || x != x: // x == 0 || IsNaN(): + case x == 0 || IsNaN(x): return x // return ±0 || NaN() - case x < -MaxFloat64 || x > MaxFloat64: // IsInf(x, 0): + case IsInf(x, 0): return NaN() } @@ -198,22 +204,27 @@ func Sin(x float64) float64 { sign = true } - j := int64(x * M4PI) // integer part of x/(Pi/4), as integer for tests on the phase angle - y := float64(j) // integer part of x/(Pi/4), as float + var j uint64 + var y, z float64 + if x >= reduceThreshold { + j, z = trigReduce(x) + } else { + j = uint64(x * (4 / Pi)) // integer part of x/(Pi/4), as integer for tests on the phase angle + y = float64(j) // integer part of x/(Pi/4), as float - // map zeros to origin - if j&1 == 1 { - j += 1 - y += 1 + // map zeros to origin + if j&1 == 1 { + j++ + y++ + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + z = ((x - y*PI4A) - y*PI4B) - y*PI4C // Extended precision modular arithmetic } - j &= 7 // octant modulo 2Pi radians (360 degrees) // reflect in x axis if j > 3 { sign = !sign j -= 4 } - - z := ((x - y*PI4A) - y*PI4B) - y*PI4C // Extended precision modular arithmetic zz := z * z if j == 1 || j == 2 { y = 1.0 - 0.5*zz + zz*zz*((((((_cos[0]*zz)+_cos[1])*zz+_cos[2])*zz+_cos[3])*zz+_cos[4])*zz+_cos[5]) diff --git a/gnovm/stdlibs/math/sincos.gno b/gnovm/stdlibs/math/sincos.gno new file mode 100644 index 00000000000..e3fb96094fa --- /dev/null +++ b/gnovm/stdlibs/math/sincos.gno @@ -0,0 +1,73 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// Coefficients _sin[] and _cos[] are found in pkg/math/sin.go. + +// Sincos returns Sin(x), Cos(x). +// +// Special cases are: +// +// Sincos(±0) = ±0, 1 +// Sincos(±Inf) = NaN, NaN +// Sincos(NaN) = NaN, NaN +func Sincos(x float64) (sin, cos float64) { + const ( + PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, + PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, + ) + // special cases + switch { + case x == 0: + return x, 1 // return ±0.0, 1.0 + case IsNaN(x) || IsInf(x, 0): + return NaN(), NaN() + } + + // make argument positive + sinSign, cosSign := false, false + if x < 0 { + x = -x + sinSign = true + } + + var j uint64 + var y, z float64 + if x >= reduceThreshold { + j, z = trigReduce(x) + } else { + j = uint64(x * (4 / Pi)) // integer part of x/(Pi/4), as integer for tests on the phase angle + y = float64(j) // integer part of x/(Pi/4), as float + + if j&1 == 1 { // map zeros to origin + j++ + y++ + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + z = ((x - y*PI4A) - y*PI4B) - y*PI4C // Extended precision modular arithmetic + } + if j > 3 { // reflect in x axis + j -= 4 + sinSign, cosSign = !sinSign, !cosSign + } + if j > 1 { + cosSign = !cosSign + } + + zz := z * z + cos = 1.0 - 0.5*zz + zz*zz*((((((_cos[0]*zz)+_cos[1])*zz+_cos[2])*zz+_cos[3])*zz+_cos[4])*zz+_cos[5]) + sin = z + z*zz*((((((_sin[0]*zz)+_sin[1])*zz+_sin[2])*zz+_sin[3])*zz+_sin[4])*zz+_sin[5]) + if j == 1 || j == 2 { + sin, cos = cos, sin + } + if cosSign { + cos = -cos + } + if sinSign { + sin = -sin + } + return +} diff --git a/gnovm/stdlibs/math/sinh.gno b/gnovm/stdlibs/math/sinh.gno new file mode 100644 index 00000000000..b52149e2752 --- /dev/null +++ b/gnovm/stdlibs/math/sinh.gno @@ -0,0 +1,87 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +/* + Floating-point hyperbolic sine and cosine. + + The exponential func is called for arguments + greater in magnitude than 0.5. + + A series is used for arguments smaller in magnitude than 0.5. + + Cosh(x) is computed from the exponential func for + all arguments. +*/ + +// Sinh returns the hyperbolic sine of x. +// +// Special cases are: +// +// Sinh(±0) = ±0 +// Sinh(±Inf) = ±Inf +// Sinh(NaN) = NaN +func Sinh(x float64) float64 { + return sinh(x) +} + +func sinh(x float64) float64 { + // The coefficients are #2029 from Hart & Cheney. (20.36D) + const ( + P0 = -0.6307673640497716991184787251e+6 + P1 = -0.8991272022039509355398013511e+5 + P2 = -0.2894211355989563807284660366e+4 + P3 = -0.2630563213397497062819489e+2 + Q0 = -0.6307673640497716991212077277e+6 + Q1 = 0.1521517378790019070696485176e+5 + Q2 = -0.173678953558233699533450911e+3 + ) + + sign := false + if x < 0 { + x = -x + sign = true + } + + var temp float64 + switch { + case x > 21: + temp = Exp(x) * 0.5 + + case x > 0.5: + ex := Exp(x) + temp = (ex - 1/ex) * 0.5 + + default: + sq := x * x + temp = (((P3*sq+P2)*sq+P1)*sq + P0) * x + temp = temp / (((sq+Q2)*sq+Q1)*sq + Q0) + } + + if sign { + temp = -temp + } + return temp +} + +// Cosh returns the hyperbolic cosine of x. +// +// Special cases are: +// +// Cosh(±0) = 1 +// Cosh(±Inf) = +Inf +// Cosh(NaN) = NaN +func Cosh(x float64) float64 { + return cosh(x) +} + +func cosh(x float64) float64 { + x = Abs(x) + if x > 21 { + return Exp(x) * 0.5 + } + ex := Exp(x) + return (ex + 1/ex) * 0.5 +} diff --git a/gnovm/stdlibs/math/sqrt.gno b/gnovm/stdlibs/math/sqrt.gno new file mode 100644 index 00000000000..54929ebcaf7 --- /dev/null +++ b/gnovm/stdlibs/math/sqrt.gno @@ -0,0 +1,145 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code and the long comment below are +// from FreeBSD's /usr/src/lib/msun/src/e_sqrt.c and +// came with this notice. The go code is a simplified +// version of the original C. +// +// ==================================================== +// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +// +// Developed at SunPro, a Sun Microsystems, Inc. business. +// Permission to use, copy, modify, and distribute this +// software is freely granted, provided that this notice +// is preserved. +// ==================================================== +// +// __ieee754_sqrt(x) +// Return correctly rounded sqrt. +// ----------------------------------------- +// | Use the hardware sqrt if you have one | +// ----------------------------------------- +// Method: +// Bit by bit method using integer arithmetic. (Slow, but portable) +// 1. Normalization +// Scale x to y in [1,4) with even powers of 2: +// find an integer k such that 1 <= (y=x*2**(2k)) < 4, then +// sqrt(x) = 2**k * sqrt(y) +// 2. Bit by bit computation +// Let q = sqrt(y) truncated to i bit after binary point (q = 1), +// i 0 +// i+1 2 +// s = 2*q , and y = 2 * ( y - q ). (1) +// i i i i +// +// To compute q from q , one checks whether +// i+1 i +// +// -(i+1) 2 +// (q + 2 ) <= y. (2) +// i +// -(i+1) +// If (2) is false, then q = q ; otherwise q = q + 2 . +// i+1 i i+1 i +// +// With some algebraic manipulation, it is not difficult to see +// that (2) is equivalent to +// -(i+1) +// s + 2 <= y (3) +// i i +// +// The advantage of (3) is that s and y can be computed by +// i i +// the following recurrence formula: +// if (3) is false +// +// s = s , y = y ; (4) +// i+1 i i+1 i +// +// otherwise, +// -i -(i+1) +// s = s + 2 , y = y - s - 2 (5) +// i+1 i i+1 i i +// +// One may easily use induction to prove (4) and (5). +// Note. Since the left hand side of (3) contain only i+2 bits, +// it is not necessary to do a full (53-bit) comparison +// in (3). +// 3. Final rounding +// After generating the 53 bits result, we compute one more bit. +// Together with the remainder, we can decide whether the +// result is exact, bigger than 1/2ulp, or less than 1/2ulp +// (it will never equal to 1/2ulp). +// The rounding mode can be detected by checking whether +// huge + tiny is equal to huge, and whether huge - tiny is +// equal to huge for some floating point number "huge" and "tiny". +// +// +// Notes: Rounding mode detection omitted. The constants "mask", "shift", +// and "bias" are found in src/math/bits.go + +// Sqrt returns the square root of x. +// +// Special cases are: +// +// Sqrt(+Inf) = +Inf +// Sqrt(±0) = ±0 +// Sqrt(x < 0) = NaN +// Sqrt(NaN) = NaN +func Sqrt(x float64) float64 { + return sqrt(x) +} + +// Note: On systems where Sqrt is a single instruction, the compiler +// may turn a direct call into a direct use of that instruction instead. + +func sqrt(x float64) float64 { + // special cases + switch { + case x == 0 || IsNaN(x) || IsInf(x, 1): + return x + case x < 0: + return NaN() + } + ix := Float64bits(x) + // normalize x + exp := int((ix >> shift) & mask) + if exp == 0 { // subnormal x + for ix&(1<>= 1 // exp = exp/2, exponent of square root + // generate sqrt(x) bit by bit + ix <<= 1 + var q, s uint64 // q = sqrt(x) + r := uint64(1 << (shift + 1)) // r = moving bit from MSB to LSB + for r != 0 { + t := s + r + if t <= ix { + s = t + r + ix -= t + q += r + } + ix <<= 1 + r >>= 1 + } + // final rounding + if ix != 0 { // remainder, result not exact + q += q & 1 // round according to extra bit + } + ix = q>>1 + uint64(exp-1+bias)< 2**49 = 5.6e14. +// [Accuracy loss statement from sin.go comments.] +// +// Cephes Math Library Release 2.8: June, 2000 +// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier +// +// The readme file at http://netlib.sandia.gov/cephes/ says: +// Some software in this archive may be from the book _Methods and +// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster +// International, 1989) or from the Cephes Mathematical Library, a +// commercial product. In either event, it is copyrighted by the author. +// What you see here may be used freely but it comes with no support or +// guarantee. +// +// The two known misprints in the book are repaired here in the +// source listings for the gamma function and the incomplete beta +// integral. +// +// Stephen L. Moshier +// moshier@na-net.ornl.gov + +// tan coefficients +var _tanP = [...]float64{ + -1.30936939181383777646e4, // 0xc0c992d8d24f3f38 + 1.15351664838587416140e6, // 0x413199eca5fc9ddd + -1.79565251976484877988e7, // 0xc1711fead3299176 +} + +var _tanQ = [...]float64{ + 1.00000000000000000000e0, + 1.36812963470692954678e4, // 0x40cab8a5eeb36572 + -1.32089234440210967447e6, // 0xc13427bc582abc96 + 2.50083801823357915839e7, // 0x4177d98fc2ead8ef + -5.38695755929454629881e7, // 0xc189afe03cbe5a31 +} + +// Tan returns the tangent of the radian argument x. +// +// Special cases are: +// +// Tan(±0) = ±0 +// Tan(±Inf) = NaN +// Tan(NaN) = NaN +func Tan(x float64) float64 { + return tan(x) +} + +func tan(x float64) float64 { + const ( + PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, + PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, + ) + // special cases + switch { + case x == 0 || IsNaN(x): + return x // return ±0 || NaN() + case IsInf(x, 0): + return NaN() + } + + // make argument positive but save the sign + sign := false + if x < 0 { + x = -x + sign = true + } + var j uint64 + var y, z float64 + if x >= reduceThreshold { + j, z = trigReduce(x) + } else { + j = uint64(x * (4 / Pi)) // integer part of x/(Pi/4), as integer for tests on the phase angle + y = float64(j) // integer part of x/(Pi/4), as float + + /* map zeros and singularities to origin */ + if j&1 == 1 { + j++ + y++ + } + + z = ((x - y*PI4A) - y*PI4B) - y*PI4C + } + zz := z * z + + if zz > 1e-14 { + y = z + z*(zz*(((_tanP[0]*zz)+_tanP[1])*zz+_tanP[2])/((((zz+_tanQ[1])*zz+_tanQ[2])*zz+_tanQ[3])*zz+_tanQ[4])) + } else { + y = z + } + if j&2 == 2 { + y = -1 / y + } + if sign { + y = -y + } + return y +} diff --git a/gnovm/stdlibs/math/tanh.gno b/gnovm/stdlibs/math/tanh.gno new file mode 100644 index 00000000000..4bb9d5d43d1 --- /dev/null +++ b/gnovm/stdlibs/math/tanh.gno @@ -0,0 +1,103 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +// The original C code, the long comment, and the constants +// below were from http://netlib.sandia.gov/cephes/cmath/sin.c, +// available from http://www.netlib.org/cephes/cmath.tgz. +// The go code is a simplified version of the original C. +// tanh.c +// +// Hyperbolic tangent +// +// SYNOPSIS: +// +// double x, y, tanh(); +// +// y = tanh( x ); +// +// DESCRIPTION: +// +// Returns hyperbolic tangent of argument in the range MINLOG to MAXLOG. +// MAXLOG = 8.8029691931113054295988e+01 = log(2**127) +// MINLOG = -8.872283911167299960540e+01 = log(2**-128) +// +// A rational function is used for |x| < 0.625. The form +// x + x**3 P(x)/Q(x) of Cody & Waite is employed. +// Otherwise, +// tanh(x) = sinh(x)/cosh(x) = 1 - 2/(exp(2x) + 1). +// +// ACCURACY: +// +// Relative error: +// arithmetic domain # trials peak rms +// IEEE -2,2 30000 2.5e-16 5.8e-17 +// +// Cephes Math Library Release 2.8: June, 2000 +// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier +// +// The readme file at http://netlib.sandia.gov/cephes/ says: +// Some software in this archive may be from the book _Methods and +// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster +// International, 1989) or from the Cephes Mathematical Library, a +// commercial product. In either event, it is copyrighted by the author. +// What you see here may be used freely but it comes with no support or +// guarantee. +// +// The two known misprints in the book are repaired here in the +// source listings for the gamma function and the incomplete beta +// integral. +// +// Stephen L. Moshier +// moshier@na-net.ornl.gov +// + +var tanhP = [...]float64{ + -9.64399179425052238628e-1, + -9.92877231001918586564e1, + -1.61468768441708447952e3, +} + +var tanhQ = [...]float64{ + 1.12811678491632931402e2, + 2.23548839060100448583e3, + 4.84406305325125486048e3, +} + +// Tanh returns the hyperbolic tangent of x. +// +// Special cases are: +// +// Tanh(±0) = ±0 +// Tanh(±Inf) = ±1 +// Tanh(NaN) = NaN +func Tanh(x float64) float64 { + return tanh(x) +} + +func tanh(x float64) float64 { + const MAXLOG = 8.8029691931113054295988e+01 // log(2**127) + z := Abs(x) + switch { + case z > 0.5*MAXLOG: + if x < 0 { + return -1 + } + return 1 + case z >= 0.625: + s := Exp(2 * z) + z = 1 - 2/(s+1) + if x < 0 { + z = -z + } + default: + if x == 0 { + return x + } + s := x * x + z = x + x*s*((tanhP[0]*s+tanhP[1])*s+tanhP[2])/(((s+tanhQ[0])*s+tanhQ[1])*s+tanhQ[2]) + } + return z +} diff --git a/gnovm/stdlibs/math/trig_reduce.gno b/gnovm/stdlibs/math/trig_reduce.gno new file mode 100644 index 00000000000..5ecdd8375e3 --- /dev/null +++ b/gnovm/stdlibs/math/trig_reduce.gno @@ -0,0 +1,102 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +import ( + "math/bits" +) + +// reduceThreshold is the maximum value of x where the reduction using Pi/4 +// in 3 float64 parts still gives accurate results. This threshold +// is set by y*C being representable as a float64 without error +// where y is given by y = floor(x * (4 / Pi)) and C is the leading partial +// terms of 4/Pi. Since the leading terms (PI4A and PI4B in sin.go) have 30 +// and 32 trailing zero bits, y should have less than 30 significant bits. +// +// y < 1<<30 -> floor(x*4/Pi) < 1<<30 -> x < (1<<30 - 1) * Pi/4 +// +// So, conservatively we can take x < 1<<29. +// Above this threshold Payne-Hanek range reduction must be used. +const reduceThreshold = 1 << 29 + +// trigReduce implements Payne-Hanek range reduction by Pi/4 +// for x > 0. It returns the integer part mod 8 (j) and +// the fractional part (z) of x / (Pi/4). +// The implementation is based on: +// "ARGUMENT REDUCTION FOR HUGE ARGUMENTS: Good to the Last Bit" +// K. C. Ng et al, March 24, 1992 +// The simulated multi-precision calculation of x*B uses 64-bit integer arithmetic. +func trigReduce(x float64) (j uint64, z float64) { + const PI4 = Pi / 4 + if x < PI4 { + return 0, x + } + // Extract out the integer and exponent such that, + // x = ix * 2 ** exp. + ix := Float64bits(x) + exp := int(ix>>shift&mask) - bias - shift + ix &^= mask << shift + ix |= 1 << shift + // Use the exponent to extract the 3 appropriate uint64 digits from mPi4, + // B ~ (z0, z1, z2), such that the product leading digit has the exponent -61. + // Note, exp >= -53 since x >= PI4 and exp < 971 for maximum float64. + digit, bitshift := uint(exp+61)/64, uint(exp+61)%64 + z0 := (mPi4[digit] << bitshift) | (mPi4[digit+1] >> (64 - bitshift)) + z1 := (mPi4[digit+1] << bitshift) | (mPi4[digit+2] >> (64 - bitshift)) + z2 := (mPi4[digit+2] << bitshift) | (mPi4[digit+3] >> (64 - bitshift)) + // Multiply mantissa by the digits and extract the upper two digits (hi, lo). + z2hi, _ := bits.Mul64(z2, ix) + z1hi, z1lo := bits.Mul64(z1, ix) + z0lo := z0 * ix + lo, c := bits.Add64(z1lo, z2hi, 0) + hi, _ := bits.Add64(z0lo, z1hi, c) + // The top 3 bits are j. + j = hi >> 61 + // Extract the fraction and find its magnitude. + hi = hi<<3 | lo>>61 + lz := uint(bits.LeadingZeros64(hi)) + e := uint64(bias - (lz + 1)) + // Clear implicit mantissa bit and shift into place. + hi = (hi << (lz + 1)) | (lo >> (64 - (lz + 1))) + hi >>= 64 - shift + // Include the exponent and convert to a float. + hi |= e << shift + z = Float64frombits(hi) + // Map zeros to origin. + if j&1 == 1 { + j++ + j &= 7 + z-- + } + // Multiply the fractional part by pi/4. + return j, z * PI4 +} + +// mPi4 is the binary digits of 4/pi as a uint64 array, +// that is, 4/pi = Sum mPi4[i]*2^(-64*i) +// 19 64-bit digits and the leading one bit give 1217 bits +// of precision to handle the largest possible float64 exponent. +var mPi4 = [...]uint64{ + 0x0000000000000001, + 0x45f306dc9c882a53, + 0xf84eafa3ea69bb81, + 0xb6c52b3278872083, + 0xfca2c757bd778ac3, + 0x6e48dc74849ba5c0, + 0x0c925dd413a32439, + 0xfc3bd63962534e7d, + 0xd1046bea5d768909, + 0xd338e04d68befc82, + 0x7323ac7306a673e9, + 0x3908bf177bf25076, + 0x3ff12fffbc0b301f, + 0xde5e2316b414da3e, + 0xda6cfd9e4f96136e, + 0x9e8c7ecd3cbfd45a, + 0xea4f758fd7cbe2f6, + 0x7a0e73ef14a525d4, + 0xd7f6bf623f1aba10, + 0xac06608df8f6d757, +} diff --git a/gnovm/stdlibs/math/unsafe.gno b/gnovm/stdlibs/math/unsafe.gno new file mode 100644 index 00000000000..92d316bab2c --- /dev/null +++ b/gnovm/stdlibs/math/unsafe.gno @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +import imath "internal/math" + +// Float32bits returns the IEEE 754 binary representation of f, +// with the sign bit of f and the result in the same bit position. +// Float32bits(Float32frombits(x)) == x. +func Float32bits(f float32) uint32 { return imath.Float32bits(f) } + +// Float32frombits returns the floating-point number corresponding +// to the IEEE 754 binary representation b, with the sign bit of b +// and the result in the same bit position. +// Float32frombits(Float32bits(x)) == x. +func Float32frombits(b uint32) float32 { return imath.Float32frombits(b) } + +// Float64bits returns the IEEE 754 binary representation of f, +// with the sign bit of f and the result in the same bit position, +// and Float64bits(Float64frombits(x)) == x. +func Float64bits(f float64) uint64 { return imath.Float64bits(f) } + +// Float64frombits returns the floating-point number corresponding +// to the IEEE 754 binary representation b, with the sign bit of b +// and the result in the same bit position. +// Float64frombits(Float64bits(x)) == x. +func Float64frombits(b uint64) float64 { return imath.Float64frombits(b) } diff --git a/gnovm/tests/files/inc.gno b/gnovm/tests/files/inc0.gno similarity index 100% rename from gnovm/tests/files/inc.gno rename to gnovm/tests/files/inc0.gno diff --git a/gnovm/tests/files/inc1.gno b/gnovm/tests/files/inc1.gno new file mode 100644 index 00000000000..f997b3b9a00 --- /dev/null +++ b/gnovm/tests/files/inc1.gno @@ -0,0 +1,15 @@ +package main + +func main() { + var i float64 = 899 + i++ + println(i) + + j := float32(901) + j-- + println(j) +} + +// Output: +// 900 +// 900 diff --git a/go.mod b/go.mod index f8b1ecf669b..f4317389c49 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,10 @@ module github.com/gnolang/gno go 1.20 require ( - github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c - github.com/btcsuite/btcd/btcutil v1.0.0 - github.com/btcsuite/btcutil v1.0.2 + github.com/btcsuite/btcd/btcutil v1.1.3 github.com/cockroachdb/apd v1.1.0 github.com/davecgh/go-spew v1.1.1 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 github.com/dgraph-io/badger/v3 v3.2103.4 github.com/fortytw2/leaktest v1.3.0 github.com/gdamore/tcell/v2 v2.6.0 @@ -21,7 +20,7 @@ require ( github.com/jaekwon/testify v1.6.1 github.com/jmhodges/levigo v1.0.0 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/linxGnu/grocksdb v1.8.4 + github.com/linxGnu/grocksdb v1.8.5 github.com/mattn/go-runewidth v0.0.15 github.com/pelletier/go-toml v1.9.5 github.com/peterbourgon/ff/v3 v3.4.0 @@ -32,16 +31,18 @@ require ( github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c go.etcd.io/bbolt v1.3.8 go.uber.org/multierr v1.9.0 - golang.org/x/crypto v0.14.0 + golang.org/x/crypto v0.15.0 golang.org/x/mod v0.14.0 golang.org/x/net v0.17.0 - golang.org/x/term v0.13.0 + golang.org/x/term v0.14.0 golang.org/x/tools v0.13.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v3 v3.0.1 ) require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect @@ -66,7 +67,7 @@ require ( github.com/rivo/uniseg v0.4.3 // indirect go.opencensus.io v0.22.5 // indirect go.uber.org/atomic v1.7.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go.sum b/go.sum index b9ab94d490c..8569f1e443b 100644 --- a/go.sum +++ b/go.sum @@ -5,17 +5,27 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c h1:lnAMg3ra/Gw4AkRMxrxYs8nrprWsHowg8H9zaYsJOo4= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd/btcutil v1.0.0 h1:dB36qRTOucIh6NUe40UCieOS+axPhP6VNyRtYkTUKKk= +github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= @@ -34,6 +44,12 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2 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/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/dgraph-io/badger/v3 v3.2103.4 h1:WE1B07YNTTJTtG9xjBcSW2wn0RJLyiV99h959RKZqM4= github.com/dgraph-io/badger/v3 v3.2103.4/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= @@ -51,6 +67,7 @@ github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+ne github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -70,6 +87,12 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -79,6 +102,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -102,6 +127,7 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jaekwon/testify v1.6.1 h1:4AtAJcR9GzXN5W4DdY7ie74iCPiJV1JJUJL90t2ZUyw= github.com/jaekwon/testify v1.6.1/go.mod h1:Oun0RXIHI7osufabQ60i4Lqkj0GXLbqI1I7kgzBNm1U= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= @@ -121,8 +147,8 @@ github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/linxGnu/grocksdb v1.8.4 h1:ZMsBpPpJNtRLHiKKp0mI7gW+NT4s7UgfD5xHxx1jVRo= -github.com/linxGnu/grocksdb v1.8.4/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.5 h1:Okfk5B1h0ikCYdDM7Tc5yJUS8LTwAmMBq5IPWTmOLPs= +github.com/linxGnu/grocksdb v1.8.5/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -131,13 +157,19 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 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.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 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 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -169,8 +201,10 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -190,11 +224,10 @@ golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -204,6 +237,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -212,6 +246,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -231,6 +267,12 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -239,19 +281,20 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -273,6 +316,12 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= @@ -286,6 +335,8 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/misc/docusaurus/.gitignore b/misc/docusaurus/.gitignore new file mode 100644 index 00000000000..b2d6de30624 --- /dev/null +++ b/misc/docusaurus/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/misc/docusaurus/babel.config.js b/misc/docusaurus/babel.config.js new file mode 100644 index 00000000000..e00595dae7d --- /dev/null +++ b/misc/docusaurus/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/misc/docusaurus/docusaurus.config.js b/misc/docusaurus/docusaurus.config.js new file mode 100644 index 00000000000..94d28490bd0 --- /dev/null +++ b/misc/docusaurus/docusaurus.config.js @@ -0,0 +1,157 @@ +// @ts-check +// Note: type annotations allow type checking and IDEs autocompletion + +const lightCodeTheme = require("prism-react-renderer/themes/github"); +const darkCodeTheme = require("prism-react-renderer/themes/dracula"); + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: "Gno.land Documentation", + favicon: "img/favicon.ico", + url: "https://docs.gno.land", + baseUrl: "/", + + organizationName: "gnolang", + projectName: "gno", + + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "warn", + + i18n: { + defaultLocale: "en", + locales: ["en"], + }, + + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + path: "../../docs", + routeBasePath: "/", + sidebarPath: require.resolve("./sidebars.js"), + }, + blog: false, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + navbar: { + hideOnScroll: true, + title: "Gno.land", + logo: { + alt: "Gno.land Logo", + src: "img/logo.svg", + srcDark: "img/logo_light.svg", + }, + items: [ + { + type: "docSidebar", + sidebarId: "tutorialSidebar", + position: "left", + label: "Docs", + }, + { + href: "https://github.com/gnolang/gno", + html: ` + + + `, + position: "right", + }, + ], + }, + footer: { + style: "dark", + + links: [ + { + items: [ + { + html: ` + + + + + + `, + }, + ], + }, + { + title: "Gno Libraries", + items: [ + { + label: "gno-js-client", + href: "https://github.com/gnolang/gno-js-client", + }, + { + label: "tm2-js-client", + href: "https://github.com/gnolang/tm2-js-client", + }, + ], + }, + { + title: "Ecosystem", + items: [ + { + label: "Gno by Example", + href: "https://gno-by-example.com/", + }, + { + label: "Awesome GNO", + href: "https://github.com/gnolang/awesome-gno", + }, + ], + }, + ], + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + }), +}; + +module.exports = config; diff --git a/misc/docusaurus/package.json b/misc/docusaurus/package.json new file mode 100644 index 00000000000..7c67713d14c --- /dev/null +++ b/misc/docusaurus/package.json @@ -0,0 +1,47 @@ +{ + "name": "gno-docs", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc", + "embed": "for f in $(find ../../docs -name '*.md'); do embedmd -w $f; done\n" + }, + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/preset-classic": "2.4.1", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "prism-react-renderer": "^1.3.5", + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "2.4.1", + "@tsconfig/docusaurus": "^1.0.5", + "typescript": "^4.7.4" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "engines": { + "node": ">=16.14" + } +} diff --git a/misc/docusaurus/sidebars.js b/misc/docusaurus/sidebars.js new file mode 100644 index 00000000000..265bfb49f9c --- /dev/null +++ b/misc/docusaurus/sidebars.js @@ -0,0 +1,112 @@ +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + tutorialSidebar: [ + 'overview', + { + type: 'category', + label: 'Getting Started', + items: [ + 'getting-started/local-setup', + 'getting-started/working-with-key-pairs', + { + type: 'category', + label: 'Setting up Funds', + items: [ + 'getting-started/setting-up-funds/premining-balances', + 'getting-started/setting-up-funds/running-a-faucet', + ] + }, + 'getting-started/setting-up-a-local-chain', + 'getting-started/browsing-gno-source-code', + ], + }, + { + type: 'category', + label: 'How-to Guides', + items: [ + 'how-to-guides/simple-contract', + 'how-to-guides/simple-library', + 'how-to-guides/testing-gno', + 'how-to-guides/deploy', + 'how-to-guides/write-simple-dapp', + 'how-to-guides/creating-grc20', + 'how-to-guides/creating-grc721', + 'how-to-guides/connect-wallet-dapp', + ], + }, + { + type: 'category', + label: 'Reference', + items: [ + 'reference/rpc-endpoints', + 'reference/standard-library', + 'reference/go-gno-compatibility', + { + type: 'category', + label: 'tm2-js-client', + items: [ + 'reference/tm2-js-client/tm2-js-getting-started', + 'reference/tm2-js-client/tm2-js-wallet', + { + type: 'category', + label: 'Provider', + items: [ + 'reference/tm2-js-client/Provider/tm2-js-provider', + 'reference/tm2-js-client/Provider/tm2-js-json-rpc-provider', + 'reference/tm2-js-client/Provider/tm2-js-ws-provider', + 'reference/tm2-js-client/Provider/tm2-js-utility', + ] + }, + { + type: 'category', + label: 'Signer', + items: [ + 'reference/tm2-js-client/Signer/tm2-js-signer', + 'reference/tm2-js-client/Signer/tm2-js-key', + 'reference/tm2-js-client/Signer/tm2-js-ledger', + ] + }, + ] + }, + { + type: 'category', + label: 'gno-js-client', + items: [ + 'reference/gno-js-client/gno-js-getting-started', + 'reference/gno-js-client/gno-js-provider', + 'reference/gno-js-client/gno-js-wallet', + ] + }, + ], + }, + { + type: 'category', + label: 'Explanation', + items: [ + 'explanation/realms', + 'explanation/tendermint2', + 'explanation/gnovm', + 'explanation/proof-of-contribution', + 'explanation/gno-language', + 'explanation/gno-modules', + 'explanation/gno-test', + 'explanation/from-go-to-gno', + { + type: 'category', + label: 'Gno Tooling', + items: [ + 'explanation/gno-tooling/cli/gno-tooling-gno', + 'explanation/gno-tooling/cli/gno-tooling-gnokey', + 'explanation/gno-tooling/cli/gno-tooling-gnofaucet', + 'explanation/gno-tooling/cli/gno-tooling-gnoland', + 'explanation/gno-tooling/cli/gno-tooling-tm2txsync', + ] + }, + ], + }, + ], +}; + +module.exports = sidebars; diff --git a/misc/docusaurus/src/css/custom.css b/misc/docusaurus/src/css/custom.css new file mode 100644 index 00000000000..58afeea4a35 --- /dev/null +++ b/misc/docusaurus/src/css/custom.css @@ -0,0 +1,280 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;300;400;600&display=swap"); +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --gno-text-font: "Inter"; + --ifm-font-family-base: var(--gno-text-font), -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; + + --ifm-color-primary: #000000; + --ifm-color-primary-light: #6f6f6f; + --ifm-color-primary-lighter: #efefef; + --ifm-color-primary-lightest: #ffffff; + --ifm-font-color-base: #6f6f6f; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + --ifm-global-radius: 1rem; + + --ring-offset-shadow: 0 0 #0000; + --ring-shadow: 0 0 #0000; + --shadow: 14px 26px 100px -6px rgba(0, 0, 0, 0.09); + + --ifm-color-content: var(--ifm-color-primary-light); + --ifm-font-color-base: var(--ifm-color-primary-light); + --ifm-heading-color: var(--ifm-color-primary); + --ifm-background-color: var(--ifm-color-primary-lightest); + --ifm-navbar-background-color: var(--ifm-color-primary-lightest); + --ifm-menu-color: var(--ifm-color-primary-light); + --ifm-code-background-color: var(--ifm-color-primary-lighter); + --ifm-toc-background-color: var(--ifm-color-primary-lightest); + --ifm-links-background-color: var(--ifm-color-primary-lightest); + --ifm-links-hover-background-color: var(--ifm-color-primary-light); + --ifm-color-secondary: var(--ifm-color-primary-light); + --ifm-color-white: var(--ifm-color-primary); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme="dark"]:root { + --ifm-color-primary: white; + --ifm-color-primary-dark: #282828; + --ifm-color-primary-darker: #1c1c1c; + --ifm-color-primary-light: #a8a8a8; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + + --ifm-color-content: var(--ifm-color-primary-light); + --ifm-font-color-base: var(--ifm-color-primary-light); + --ifm-heading-color: var(--ifm-color-primary); + --ifm-background-color: var(--ifm-color-primary-dark); + --ifm-navbar-background-color: var(--ifm-color-primary-darker); + --ifm-menu-color: var(--ifm-color-primary-light); + --ifm-code-background-color: var(--ifm-color-primary-darker); + --ifm-toc-background-color: var(--ifm-color-primary-darker); + --ifm-links-background-color: var(--ifm-color-primary-darker); + --ifm-links-hover-background-color: var(--ifm-color-primary-light); +} + +/* Generic */ +body { + margin-left: auto; + margin-right: auto; + max-width: 84rem; + padding-inline: 1rem; +} + +pre code { + background-color: var(--ifm-code-background-color); + border-radius: 1rem; +} + +/* Header */ +.navbar { + top: 1rem; + border-radius: 1rem; + box-shadow: var(--ring-offset-shadow, 0 0 #0000), var(--ring-shadow, 0 0 #0000), var(--shadow); +} + +.navbarHidden_node_modules-\@docusaurus-theme-classic-lib-theme-Navbar-Layout-styles-module { + transform: translate3d(0, calc(-100% - 2px - 1rem), 0) !important; +} + +.container article a { + color: var(--ifm-color-content); + text-decoration: underline; + transition: color 125ms; +} +.container article a:hover { + color: var(--ifm-color-primary); +} + +.navbar__items--right .navbar__link { + margin-block-start: 0.3rem; +} + +/* Main */ +.main-wrapper { + margin-block-start: 2rem; + transition: filter 0.2s ease; + will-change: filter; +} + +@media (min-width: 997px) { + .main-wrapper { + margin-block-start: 0; + } + .main-wrapper .container { + margin-block-start: 4.5rem; + } + + .main-wrapper .container > div > div:first-child { + padding-inline: 4rem 2rem; + } +} + +.navbar-sidebar--show ~ .main-wrapper { + filter: blur(2px); +} + +/* Links */ +[class*="iconExternalLink_node_modules"] { + display: none; +} + +.pagination-nav { + grid-template-columns: repeat(1, 100%); + grid-template-rows: repeat(2, 1fr); +} +.pagination-nav__link--next { + grid-column: 1/2; +} +@media (min-width: 600px) { + .pagination-nav { + grid-template-columns: repeat(2, 1fr); + } + .pagination-nav__link--next { + grid-column: 2/3; + } +} + +.pagination-nav__link { + background-color: var(--ifm-links-background-color); + border-radius: 1rem; + border-color: transparent; + transition: 0.3s ease opacity; + box-shadow: var(--ring-offset-shadow, 0 0 #0000), var(--ring-shadow, 0 0 #0000), var(--shadow); +} + +.pagination-nav__link:hover { + opacity: 0.7; + border-color: transparent; +} + +.pagination-nav__label { + display: flex; + font-size: 1.1rem; +} + +.pagination-nav__link--next .pagination-nav__label { + justify-content: flex-end; +} +.pagination-nav__link { + position: relative; +} +.pagination-nav__link--prev { + padding-inline-start: 3rem; +} +.pagination-nav__link--next { + padding-inline-end: 3rem; +} +.pagination-nav__link--prev .pagination-nav__label::before { + content: "←"; + position: absolute; + display: block; + left: 1rem; +} +.pagination-nav__link--next .pagination-nav__label::after { + content: "→"; + position: absolute; + display: block; + right: 1rem; +} + +.pagination-nav__sublabel { + opacity: 0.7; +} + +/* Sidebar */ +@media (min-width: 997px) { + .theme-doc-sidebar-container { + border-right: none !important; + } +} + +.menu::-webkit-scrollbar { + display: none; +} +.menu { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +.theme-doc-sidebar-container > div > div > a { + margin-block-start: 1rem; + margin-block-end: 4rem; +} + +.menu__link--active:not(.menu__link--sublist) { + background-color: transparent; +} + +.menu__link:hover, +.menu__caret:hover, +.menu__list-item-collapsible:hover { + background-color: transparent; + color: var(--ifm-color-primary); +} + +/* Breadcrumb */ +.breadcrumbs__item--active .breadcrumbs__link { + background-color: var(--ifm-navbar-background-color); +} + +/* ToC */ +.theme-doc-toc-desktop { + padding-block-start: 3.5rem; + overflow-y: inherit !important; +} +.table-of-contents { + background-color: var(--ifm-toc-background-color); + border-radius: 1rem; + border: none !important; + box-shadow: var(--ring-offset-shadow, 0 0 #0000), var(--ring-shadow, 0 0 #0000), var(--shadow); +} + +/* Footer */ +.footer { + background-color: transparent; + border-top: 1px solid var(--ifm-menu-color); + margin-block-start: 2rem; + padding-inline: 0.5rem; +} + +.footer .container { + max-width: 100%; +} + +.footer__title { + margin-block-start: 1rem; +} + +@media (min-width: 997px) { + .footer .footer__col:first-child { + max-width: var(--doc-sidebar-width); + } + .footer .footer__col:nth-child(2) { + padding-inline-start: 3.75rem; + } +} + +.gno-footer__socials { + margin-block-start: 1rem; + display: flex; +} + +.gno-footer__socials > a { + margin-inline-end: 0.5rem; +} +.gno-footer__socials > a path { + fill: var(--ifm-links-hover-background-color); + transition: 0.3s ease all; +} +.gno-footer__socials > a:hover path { + fill: var(--ifm-color-primary); +} + +.gno-footer__copy { + font-size: 0.8em; +} diff --git a/misc/docusaurus/static/.nojekyll b/misc/docusaurus/static/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/misc/docusaurus/static/img/favicon.ico b/misc/docusaurus/static/img/favicon.ico new file mode 100644 index 00000000000..78b09c04e8d Binary files /dev/null and b/misc/docusaurus/static/img/favicon.ico differ diff --git a/misc/docusaurus/static/img/logo.svg b/misc/docusaurus/static/img/logo.svg new file mode 100644 index 00000000000..0255c945d25 --- /dev/null +++ b/misc/docusaurus/static/img/logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/misc/docusaurus/static/img/logo_light.svg b/misc/docusaurus/static/img/logo_light.svg new file mode 100644 index 00000000000..45cf9c3ada7 --- /dev/null +++ b/misc/docusaurus/static/img/logo_light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/misc/docusaurus/tsconfig.json b/misc/docusaurus/tsconfig.json new file mode 100644 index 00000000000..6f4756980d4 --- /dev/null +++ b/misc/docusaurus/tsconfig.json @@ -0,0 +1,7 @@ +{ + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@tsconfig/docusaurus/tsconfig.json", + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/misc/docusaurus/yarn.lock b/misc/docusaurus/yarn.lock new file mode 100644 index 00000000000..8f58f0af929 --- /dev/null +++ b/misc/docusaurus/yarn.lock @@ -0,0 +1,7726 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" + integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-plugin-algolia-insights@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" + integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== + dependencies: + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-preset-algolia@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" + integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== + dependencies: + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-shared@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" + integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== + +"@algolia/cache-browser-local-storage@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz#357318242fc542ffce41d6eb5b4a9b402921b0bb" + integrity sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ== + dependencies: + "@algolia/cache-common" "4.20.0" + +"@algolia/cache-common@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.20.0.tgz#ec52230509fce891091ffd0d890618bcdc2fa20d" + integrity sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ== + +"@algolia/cache-in-memory@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz#5f18d057bd6b3b075022df085c4f83bcca4e3e67" + integrity sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg== + dependencies: + "@algolia/cache-common" "4.20.0" + +"@algolia/client-account@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.20.0.tgz#23ce0b4cffd63100fb7c1aa1c67a4494de5bd645" + integrity sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q== + dependencies: + "@algolia/client-common" "4.20.0" + "@algolia/client-search" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/client-analytics@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.20.0.tgz#0aa6bef35d3a41ac3991b3f46fcd0bf00d276fa9" + integrity sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug== + dependencies: + "@algolia/client-common" "4.20.0" + "@algolia/client-search" "4.20.0" + "@algolia/requester-common" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/client-common@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.20.0.tgz#ca60f04466515548651c4371a742fbb8971790ef" + integrity sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ== + dependencies: + "@algolia/requester-common" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/client-personalization@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.20.0.tgz#ca81308e8ad0db3b27458b78355f124f29657181" + integrity sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ== + dependencies: + "@algolia/client-common" "4.20.0" + "@algolia/requester-common" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/client-search@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.20.0.tgz#3bcce817ca6caedc835e0eaf6f580e02ee7c3e15" + integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== + dependencies: + "@algolia/client-common" "4.20.0" + "@algolia/requester-common" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/logger-common@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.20.0.tgz#f148ddf67e5d733a06213bebf7117cb8a651ab36" + integrity sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ== + +"@algolia/logger-console@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.20.0.tgz#ac443d27c4e94357f3063e675039cef0aa2de0a7" + integrity sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA== + dependencies: + "@algolia/logger-common" "4.20.0" + +"@algolia/requester-browser-xhr@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz#db16d0bdef018b93b51681d3f1e134aca4f64814" + integrity sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw== + dependencies: + "@algolia/requester-common" "4.20.0" + +"@algolia/requester-common@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.20.0.tgz#65694b2263a8712b4360fef18680528ffd435b5c" + integrity sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng== + +"@algolia/requester-node-http@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz#b52b182b52b0b16dec4070832267d484a6b1d5bb" + integrity sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng== + dependencies: + "@algolia/requester-common" "4.20.0" + +"@algolia/transporter@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.20.0.tgz#7e5b24333d7cc9a926b2f6a249f87c2889b944a9" + integrity sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg== + dependencies: + "@algolia/cache-common" "4.20.0" + "@algolia/logger-common" "4.20.0" + "@algolia/requester-common" "4.20.0" + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.8.3": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.18.6", "@babel/core@^7.19.6": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" + integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.0" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.0": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== + dependencies: + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== + dependencies: + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.18.12": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz#6dfa7c1c37f7d7279e417ceddf5a04abb8bb9c29" + integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.15" + +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.18.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" + integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== + dependencies: + "@babel/compat-data" "^7.22.20" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.19" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" + integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + +"@babel/preset-typescript@^7.18.6": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz#cc6602d13e7e5b2087c811912b87cf937a9129d9" + integrity sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-typescript" "^7.22.15" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime-corejs3@^7.18.6": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.1.tgz#d03f5819f4ba81a21dd1f80edfb19983e9e20fc1" + integrity sha512-OKKfytwoc0tr7cDHwQm0RLVR3y+hDGFz3EPuvLNU/0fOeXJeKNIHj7ffNVFnncWt3sC58uyUCRSzf8nBQbyF6A== + dependencies: + core-js-pure "^3.30.2" + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.8.4": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@docsearch/css@3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.2.tgz#610f47b48814ca94041df969d9fcc47b91fc5aac" + integrity sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA== + +"@docsearch/react@^3.1.1": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.2.tgz#2e6bbee00eb67333b64906352734da6aef1232b9" + integrity sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng== + dependencies: + "@algolia/autocomplete-core" "1.9.3" + "@algolia/autocomplete-preset-algolia" "1.9.3" + "@docsearch/css" "3.5.2" + algoliasearch "^4.19.1" + +"@docusaurus/core@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.4.1.tgz#4b8ff5766131ce3fbccaad0b1daf2ad4dc76f62d" + integrity sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g== + dependencies: + "@babel/core" "^7.18.6" + "@babel/generator" "^7.18.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.18.6" + "@babel/preset-env" "^7.18.6" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@babel/runtime" "^7.18.6" + "@babel/runtime-corejs3" "^7.18.6" + "@babel/traverse" "^7.18.8" + "@docusaurus/cssnano-preset" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@svgr/webpack" "^6.2.1" + autoprefixer "^10.4.7" + babel-loader "^8.2.5" + babel-plugin-dynamic-import-node "^2.3.3" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + clean-css "^5.3.0" + cli-table3 "^0.6.2" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^11.0.0" + core-js "^3.23.3" + css-loader "^6.7.1" + css-minimizer-webpack-plugin "^4.0.0" + cssnano "^5.1.12" + del "^6.1.1" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^2.0.0" + file-loader "^6.2.0" + fs-extra "^10.1.0" + html-minifier-terser "^6.1.0" + html-tags "^3.2.0" + html-webpack-plugin "^5.5.0" + import-fresh "^3.3.0" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.6.1" + postcss "^8.4.14" + postcss-loader "^7.0.0" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.3" + react-router-config "^5.1.1" + react-router-dom "^5.3.3" + rtl-detect "^1.0.4" + semver "^7.3.7" + serve-handler "^6.1.3" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.3" + tslib "^2.4.0" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.1" + webpack "^5.73.0" + webpack-bundle-analyzer "^4.5.0" + webpack-dev-server "^4.9.3" + webpack-merge "^5.8.0" + webpackbar "^5.0.2" + +"@docusaurus/cssnano-preset@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz#eacadefb1e2e0f59df3467a0fe83e4ff79eed163" + integrity sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ== + dependencies: + cssnano-preset-advanced "^5.3.8" + postcss "^8.4.14" + postcss-sort-media-queries "^4.2.1" + tslib "^2.4.0" + +"@docusaurus/logger@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.4.1.tgz#4d2c0626b40752641f9fdd93ad9b5a7a0792f767" + integrity sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg== + dependencies: + chalk "^4.1.2" + tslib "^2.4.0" + +"@docusaurus/mdx-loader@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz#6425075d7fc136dbfdc121349060cedd64118393" + integrity sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ== + dependencies: + "@babel/parser" "^7.18.8" + "@babel/traverse" "^7.18.8" + "@docusaurus/logger" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@mdx-js/mdx" "^1.6.22" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + image-size "^1.0.1" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.2.0" + stringify-object "^3.3.0" + tslib "^2.4.0" + unified "^9.2.2" + unist-util-visit "^2.0.3" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@docusaurus/module-type-aliases@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz#38b3c2d2ae44bea6d57506eccd84280216f0171c" + integrity sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A== + dependencies: + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.4.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/plugin-content-blog@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz#c705a8b1a36a34f181dcf43b7770532e4dcdc4a3" + integrity sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + cheerio "^1.0.0-rc.12" + feed "^4.2.2" + fs-extra "^10.1.0" + lodash "^4.17.21" + reading-time "^1.5.0" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-docs@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz#ed94d9721b5ce7a956fb01cc06c40d8eee8dfca7" + integrity sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@types/react-router-config" "^5.0.6" + combine-promises "^1.1.0" + fs-extra "^10.1.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-pages@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz#c534f7e49967699a45bbe67050d1605ebbf3d285" + integrity sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + fs-extra "^10.1.0" + tslib "^2.4.0" + webpack "^5.73.0" + +"@docusaurus/plugin-debug@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz#461a2c77b0c5a91b2c05257c8f9585412aaa59dc" + integrity sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + fs-extra "^10.1.0" + react-json-view "^1.21.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-analytics@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz#30de1c35773bf9d52bb2d79b201b23eb98022613" + integrity sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-google-gtag@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz#6a3eb91022714735e625c7ca70ef5188fa7bd0dc" + integrity sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-google-tag-manager@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz#b99f71aec00b112bbf509ef2416e404a95eb607e" + integrity sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-sitemap@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz#8a7a76ed69dc3e6b4474b6abb10bb03336a9de6d" + integrity sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + fs-extra "^10.1.0" + sitemap "^7.1.1" + tslib "^2.4.0" + +"@docusaurus/preset-classic@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz#072f22d0332588e9c5f512d4bded8d7c99f91497" + integrity sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/plugin-debug" "2.4.1" + "@docusaurus/plugin-google-analytics" "2.4.1" + "@docusaurus/plugin-google-gtag" "2.4.1" + "@docusaurus/plugin-google-tag-manager" "2.4.1" + "@docusaurus/plugin-sitemap" "2.4.1" + "@docusaurus/theme-classic" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-search-algolia" "2.4.1" + "@docusaurus/types" "2.4.1" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz#0060cb263c1a73a33ac33f79bb6bc2a12a56ad9e" + integrity sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-translations" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@mdx-js/react" "^1.6.22" + clsx "^1.2.1" + copy-text-to-clipboard "^3.0.1" + infima "0.2.0-alpha.43" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.4.14" + prism-react-renderer "^1.3.5" + prismjs "^1.28.0" + react-router-dom "^5.3.3" + rtlcss "^3.5.0" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-common@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.4.1.tgz#03e16f7aa96455e952f3243ac99757b01a3c83d4" + integrity sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA== + dependencies: + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^1.2.1" + parse-numeric-range "^1.3.0" + prism-react-renderer "^1.3.5" + tslib "^2.4.0" + use-sync-external-store "^1.2.0" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz#906bd2cca3fced0241985ef502c892f58ff380fc" + integrity sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ== + dependencies: + "@docsearch/react" "^3.1.1" + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-translations" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + algoliasearch "^4.13.1" + algoliasearch-helper "^3.10.0" + clsx "^1.2.1" + eta "^2.0.0" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz#4d49df5865dae9ef4b98a19284ede62ae6f98726" + integrity sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA== + dependencies: + fs-extra "^10.1.0" + tslib "^2.4.0" + +"@docusaurus/types@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.4.1.tgz#d8e82f9e0f704984f98df1f93d6b4554d5458705" + integrity sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.73.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.4.1.tgz#7f72e873e49bd5179588869cc3ab7449a56aae63" + integrity sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ== + dependencies: + tslib "^2.4.0" + +"@docusaurus/utils-validation@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz#19959856d4a886af0c5cfb357f4ef68b51151244" + integrity sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA== + dependencies: + "@docusaurus/logger" "2.4.1" + "@docusaurus/utils" "2.4.1" + joi "^17.6.0" + js-yaml "^4.1.0" + tslib "^2.4.0" + +"@docusaurus/utils@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.4.1.tgz#9c5f76eae37b71f3819c1c1f0e26e6807c99a4fc" + integrity sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA== + dependencies: + "@docusaurus/logger" "2.4.1" + "@svgr/webpack" "^6.2.1" + escape-string-regexp "^4.0.0" + file-loader "^6.2.0" + fs-extra "^10.1.0" + github-slugger "^1.4.0" + globby "^11.1.0" + gray-matter "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.4.0" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.23" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" + integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@slorber/static-site-generator-webpack-plugin@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" + integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== + dependencies: + eval "^0.1.8" + p-map "^4.0.0" + webpack-sources "^3.2.2" + +"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== + +"@svgr/babel-plugin-remove-jsx-attribute@*": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@*": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== + +"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== + +"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== + +"@svgr/babel-plugin-transform-svg-component@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== + +"@svgr/babel-preset@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" + "@svgr/babel-plugin-remove-jsx-attribute" "*" + "@svgr/babel-plugin-remove-jsx-empty-expression" "*" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" + "@svgr/babel-plugin-transform-svg-component" "^6.5.1" + +"@svgr/core@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== + dependencies: + "@babel/types" "^7.20.0" + entities "^4.4.0" + +"@svgr/plugin-jsx@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/hast-util-to-babel-ast" "^6.5.1" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.8.0" + +"@svgr/webpack@^6.2.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== + dependencies: + "@babel/core" "^7.19.6" + "@babel/plugin-transform-react-constant-elements" "^7.18.12" + "@babel/preset-env" "^7.19.4" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@svgr/core" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + "@svgr/plugin-svgo" "^6.5.1" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@tsconfig/docusaurus@^1.0.5": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz#a3ee3c8109b3fec091e3d61a61834e563aeee3c3" + integrity sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg== + +"@types/body-parser@*": + version "1.19.3" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" + integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.11" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" + integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" + integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" + integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.44.3" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.3.tgz#96614fae4875ea6328f56de38666f582d911d962" + integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" + integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.37" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" + integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.18" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" + integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/hast@^2.0.0": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" + integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== + dependencies: + "@types/unist" "^2" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-errors@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" + integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + +"@types/http-proxy@^1.17.8": + version "1.17.12" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" + integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" + integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" + integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + +"@types/mdast@^3.0.0": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.13.tgz#b7ba6e52d0faeb9c493e32c205f3831022be4e1b" + integrity sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg== + dependencies: + "@types/unist" "^2" + +"@types/mime@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.2.tgz#c1ae807f13d308ee7511a5b81c74f327028e66e8" + integrity sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== + +"@types/mime@^1": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" + integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== + +"@types/node@*": + version "20.8.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.4.tgz#0e9ebb2ff29d5c3302fc84477d066fa7c6b441aa" + integrity sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A== + dependencies: + undici-types "~5.25.1" + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.8" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" + integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== + +"@types/qs@*": + version "6.9.8" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" + integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + +"@types/range-parser@*": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.5.tgz#38bd1733ae299620771bd414837ade2e57757498" + integrity sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA== + +"@types/react-router-config@*", "@types/react-router-config@^5.0.6": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.8.tgz#dd00654de4d79927570a4a8807c4a728feed59f3" + integrity sha512-zBzYZsr05V9xRG96oQ/xBXHy5+fDCX5wL7bboM0FFoOYQp9Gxmz8uvuKSkLesNWHlICl+W1l64F7fmp/KsOkuw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "^5.1.0" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*", "@types/react-router@^5.1.0": + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react@*": + version "18.2.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.27.tgz#746e52b06f3ccd5d7a724fd53769b70792601440" + integrity sha512-Wfv7B7FZiR2r3MIqbAlXoY1+tXm4bOqfz4oRr+nyXdBqapDBZ0l/IGcSlAfvxIHEEJjkPU0MYAc/BlFPOcrgLw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/sax@^1.2.1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.5.tgz#4392799e1770d24b6dc8d0c66c8882f8e1c38b3d" + integrity sha512-9jWta97bBVC027/MShr3gLab8gPhKy4l6qpb+UJLF5pDm3501NvA7uvqVCW+REFtx00oTi6Cq9JzLwgq6evVgw== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.4" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" + integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== + +"@types/send@*": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" + integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.2.tgz#cb26e775678a8526b73a5d980a147518740aaecd" + integrity sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.3" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" + integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.34" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.34.tgz#43e10e549b36d2ba2589278f00f81b5d7ccda167" + integrity sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g== + dependencies: + "@types/node" "*" + +"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" + integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== + +"@types/ws@^8.5.5": + version "8.5.6" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" + integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== + +"@types/yargs@^17.0.8": + version "17.0.28" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.28.tgz#d106e4301fbacde3d1796ab27374dd16588ec851" + integrity sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw== + dependencies: + "@types/yargs-parser" "*" + +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +algoliasearch-helper@^3.10.0: + version "3.14.2" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.14.2.tgz#c34cfe6cefcfecd65c60bcb8bf9b68134472d28c" + integrity sha512-FjDSrjvQvJT/SKMW74nPgFpsoPUwZCzGbCqbp8HhBFfSk/OvNFxzCaCmuO0p7AWeLy1gD+muFwQEkBwcl5H4pg== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^4.13.1, algoliasearch@^4.19.1: + version "4.20.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.20.0.tgz#700c2cb66e14f8a288460036c7b2a554d0d93cf4" + integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== + dependencies: + "@algolia/cache-browser-local-storage" "4.20.0" + "@algolia/cache-common" "4.20.0" + "@algolia/cache-in-memory" "4.20.0" + "@algolia/client-account" "4.20.0" + "@algolia/client-analytics" "4.20.0" + "@algolia/client-common" "4.20.0" + "@algolia/client-personalization" "4.20.0" + "@algolia/client-search" "4.20.0" + "@algolia/logger-common" "4.20.0" + "@algolia/logger-console" "4.20.0" + "@algolia/requester-browser-xhr" "4.20.0" + "@algolia/requester-common" "4.20.0" + "@algolia/requester-node-http" "4.20.0" + "@algolia/transporter" "4.20.0" + +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.12, autoprefixer@^10.4.7: + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +babel-loader@^8.2.5: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz#1fac2b1dcef6274e72b3c72977ed8325cb330591" + integrity sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.32.2" + +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== + dependencies: + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001547" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz#d4f92efc488aab3c7f92c738d3977c2a3180472b" + integrity sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA== + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-css@^5.2.2, clean-css@^5.3.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-table3@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combine-promises@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-text-to-clipboard@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz#0202b2d9bdae30a49a53f898626dcc3b49ad960b" + integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.31.0, core-js-compat@^3.32.2: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" + integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== + dependencies: + browserslist "^4.22.1" + +core-js-pure@^3.30.2: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.0.tgz#938a28754b4d82017a7a8cbd2727b1abecc63591" + integrity sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg== + +core-js@^3.23.3: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.0.tgz#70366dbf737134761edb017990cf5ce6c6369c40" + integrity sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-declaration-sorter@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== + +css-loader@^6.7.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-minimizer-webpack-plugin@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== + dependencies: + cssnano "^5.1.8" + jest-worker "^29.1.2" + postcss "^8.4.17" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.3.8: + version "5.3.10" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" + integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== + dependencies: + autoprefixer "^10.4.12" + cssnano-preset-default "^5.2.14" + postcss-discard-unused "^5.1.0" + postcss-merge-idents "^5.1.1" + postcss-reduce-idents "^5.2.0" + postcss-zindex "^5.1.0" + +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.1.12, cssnano@^5.1.8: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.535: + version "1.4.548" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.548.tgz#e695d769e0e801fa6d438b63f6bc9b80372000d6" + integrity sha512-R77KD6mXv37DOyKLN/eW1rGS61N6yHOfapNSX9w+y9DdPG83l9Gkuv7qkCFZ4Ta4JPhrjgQfYbv4Y3TnM1Hi2Q== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.5" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" + integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^1.0.35" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flux@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572" + integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-slugger@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-tags@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" + integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-size@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.2.tgz#d778b6d0ab75b2737c1556dd631652eb963bc486" + integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== + dependencies: + queue "6.0.2" + +immer@^9.0.7: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.43: + version "0.2.0-alpha.43" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" + integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.1.2: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.18.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + +joi@^17.6.0: + version "17.11.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +launch-editor@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lilconfig@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== + +lodash.invokemap@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" + integrity sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.pullall@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.pullall/-/lodash.pullall-4.2.0.tgz#9d98b8518b7c965b0fae4099bd9fb7df8bbf38ba" + integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== + +lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mini-css-extract-plugin@^2.6.1: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-discard-unused@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^7.0.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" + integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== + dependencies: + cosmiconfig "^8.2.0" + jiti "^1.18.2" + semver "^7.3.8" + +postcss-merge-idents@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-idents@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" + integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.2.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz#04a5a78db3921eb78f28a1a781a2e68e65258128" + integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== + dependencies: + sort-css-media-queries "2.1.0" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== + +postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" + integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== + +prismjs@^1.28.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-helmet-async@*, react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.3: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.4, react-router@^5.3.3: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-textarea-autosize@^8.3.2: + version "8.5.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" + integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +registry-auth-token@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-emoji@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.3" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-detect@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" + integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== + +rtlcss@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.4: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@^5.4.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3: + version "6.1.5" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.1.2" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3, shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" + integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^3.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" + integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +std-env@^3.0.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.4.3.tgz#326f11db518db751c83fd58574f449b7c3060910" + integrity sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^2.7.0, svgo@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" + +terser@^5.10.0, terser@^5.16.8: + version "5.21.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" + integrity sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-invariant@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^4.7.4: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +ua-parser-js@^1.0.35: + version "1.0.36" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.36.tgz#a9ab6b9bd3a8efb90bb0816674b412717b7c428c" + integrity sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw== + +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +wait-on@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== + dependencies: + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.5.4" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-bundle-analyzer@^4.5.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz#d00bbf3f17500c10985084f22f1a2bf45cb2f09d" + integrity sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + is-plain-object "^5.0.0" + lodash.debounce "^4.0.8" + lodash.escape "^4.0.1" + lodash.flatten "^4.4.0" + lodash.invokemap "^4.6.0" + lodash.pullall "^4.2.0" + lodash.uniqby "^4.7.0" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.9.3: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-merge@^5.8.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.2, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.73.0: + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/misc/loop/Makefile b/misc/loop/Makefile new file mode 100644 index 00000000000..ab79b058ffb --- /dev/null +++ b/misc/loop/Makefile @@ -0,0 +1,44 @@ +# The startup delay (waits until the node is "ready") +DELAY ?= 10 # seconds +# The temporary backup file for transactions +BACKUP_FILE ?= $(abspath ./txs_backup.log) +# The entire txs history across all iterations +HISTORY_OUTPUT := $(abspath ./txs_history.log) + +# The gnoland binary +gnoland_bin := go run github.com/gnolang/gno/gno.land/cmd/gnoland +# The tx archive binary +tx_bin := go run github.com/gnolang/tx-archive/cmd + +# The relative gno.land directory +gnoland_dir := $(abspath ../../gno.land) + +all: loop + +gnoland.start: + cd $(gnoland_dir) && $(gnoland_bin) start -skip-failing-genesis-txs -genesis-txs-file $(HISTORY_OUTPUT) +gnoland.clean: + make -C $(gnoland_dir) fclean +.PHONY: gnoland.start gnoland.clean + +# Starts the backup service +# and backs up transactions into a file +# that is wiped on every loop +tx.backup: + sleep $(DELAY) + $(tx_bin) backup -legacy -watch -overwrite -output-path "$(BACKUP_FILE)" +.PHONY: tx.backup + +# Saves the history from previous iterations into +# a temporary transactions log +save.history: + @test -e $(BACKUP_FILE) || (echo "No existing backup file not found: '$(BACKUP_FILE)'"; exit 1) + cat $(BACKUP_FILE) >> $(HISTORY_OUTPUT) +.PHONY: save.history + +loop: gnoland.clean + # backup history, if needed + $(MAKE) save.history || true + # run our dev loop + ./run_loop.sh +.PHONY: loop diff --git a/misc/loop/go.mod b/misc/loop/go.mod new file mode 100644 index 00000000000..10d2acd62bd --- /dev/null +++ b/misc/loop/go.mod @@ -0,0 +1,52 @@ +module loop + +go 1.20 + +require ( + github.com/gnolang/gno v0.0.0-20231112174927-b1a53c018ea4 + github.com/gnolang/tx-archive v0.1.1 +) + +require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/btcsuite/btcd/btcutil v1.1.3 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/cockroachdb/apd v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/dgraph-io/badger/v3 v3.2103.4 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/gnolang/goleveldb v0.0.9 // indirect + github.com/gnolang/overflow v0.0.0-20170615021017-4d914c927216 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/flatbuffers v1.12.1 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.12.3 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/linxGnu/grocksdb v1.8.5 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/peterbourgon/ff/v3 v3.4.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rs/cors v1.10.1 // indirect + github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect + go.etcd.io/bbolt v1.3.8 // indirect + go.opencensus.io v0.22.5 // indirect + go.uber.org/multierr v1.10.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect +) + +replace github.com/gnolang/gno => ../../ diff --git a/misc/loop/go.sum b/misc/loop/go.sum new file mode 100644 index 00000000000..846ee1340ed --- /dev/null +++ b/misc/loop/go.sum @@ -0,0 +1,285 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.0 h1:V2/ZgjfDFIygAX3ZapeigkVBoVUtOJKSwrhZdlpSvaA= +github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/dgraph-io/badger/v3 v3.2103.4 h1:WE1B07YNTTJTtG9xjBcSW2wn0RJLyiV99h959RKZqM4= +github.com/dgraph-io/badger/v3 v3.2103.4/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gnolang/goleveldb v0.0.9 h1:Q7rGko9oXMKtQA+Apeeed5a3sjba/mcDhzJGoTVLCKE= +github.com/gnolang/goleveldb v0.0.9/go.mod h1:Dz6p9bmpy/FBESTgduiThZt5mToVDipcHGzj/zUOo8E= +github.com/gnolang/overflow v0.0.0-20170615021017-4d914c927216 h1:GKvsK3oLWG9B1GL7WP/VqwM6C92j5tIvB844oggL9Lk= +github.com/gnolang/overflow v0.0.0-20170615021017-4d914c927216/go.mod h1:xJhtEL7ahjM1WJipt89gel8tHzfIl/LyMY+lCYh38d8= +github.com/gnolang/tx-archive v0.1.1 h1:maVdRFsc1ptVhwVw1p5scvu2Rus8Yk3o9qlss5+SRCw= +github.com/gnolang/tx-archive v0.1.1/go.mod h1:MrUmRaU6GB9tOPy+5pCe/x1z1fGYtAypVJzKOExeUHY= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jaekwon/testify v1.6.1 h1:4AtAJcR9GzXN5W4DdY7ie74iCPiJV1JJUJL90t2ZUyw= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/linxGnu/grocksdb v1.8.5 h1:Okfk5B1h0ikCYdDM7Tc5yJUS8LTwAmMBq5IPWTmOLPs= +github.com/linxGnu/grocksdb v1.8.5/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +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.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +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 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/peterbourgon/ff/v3 v3.4.0 h1:QBvM/rizZM1cB0p0lGMdmR7HxZeI/ZrBWB4DqLkMUBc= +github.com/peterbourgon/ff/v3 v3.4.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/misc/loop/run_loop.sh b/misc/loop/run_loop.sh new file mode 100755 index 00000000000..99d1e5fbc04 --- /dev/null +++ b/misc/loop/run_loop.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# This script is meant to orchestrate +# a parallel execution of a gno.land node +# and a backup tool that preserves +# transactions that happen on-chain while +# the node is running. Additionally, the +# script also closes down any hanging process +# if either the node / backup tool fail + +set -e # exit on error + +# Set up the kill signal callback +teardown() { + echo "Stopping background processes..." + kill 0 +} + +echo "Running local development setup" + +# Start the gnoland node (fresh chain), and in parallel +# - start the backup service for transactions +( + echo "Starting Gno node..." + make gnoland.start + teardown +) & +( + echo "Starting backup..." + make tx.backup + teardown +) & + +# Trap all kill signals +trap 'teardown' INT + +# Wait for all background processes to finish +wait diff --git a/misc/loop/tools.go b/misc/loop/tools.go new file mode 100644 index 00000000000..2c4cd3315fd --- /dev/null +++ b/misc/loop/tools.go @@ -0,0 +1,6 @@ +package tools + +import ( + _ "github.com/gnolang/gno/gno.land/cmd/gnoland" + _ "github.com/gnolang/tx-archive/cmd" +) diff --git a/tm2/pkg/amino/genproto/bindings.go b/tm2/pkg/amino/genproto/bindings.go index 5d587870a7d..5d3b46c59fc 100644 --- a/tm2/pkg/amino/genproto/bindings.go +++ b/tm2/pkg/amino/genproto/bindings.go @@ -14,6 +14,7 @@ import ( "strings" "github.com/gnolang/gno/tm2/pkg/amino" + "github.com/gnolang/gno/tm2/pkg/amino/genproto/stringutil" "github.com/gnolang/gno/tm2/pkg/amino/pkg" ) @@ -524,7 +525,8 @@ func go2pbStmts(rootPkg *amino.Package, isRoot bool, imports *ast.GenDecl, scope goorfIsPtr := field.IsPtr() goorfType := field.TypeInfo goorf := _sel(goor, field.Name) // next goo - pbof := _sel(pbo, field.Name) // next pbo + // The protobuf field is lower_snake_case and protoc converts it to CamelCase. + pbof := _sel(pbo, CamelCase(stringutil.ToLowerSnakeCase(field.Name))) // next pbo // Translate in place. scope2 := ast.NewScope(scope) @@ -821,7 +823,8 @@ func pb2goStmts(rootPkg *amino.Package, isRoot bool, imports *ast.GenDecl, scope case reflect.Struct: for _, field := range goorType.Fields { - pbof := _sel(pbo, field.Name) // next pbo. + // The protobuf field is lower_snake_case and protoc converts it to CamelCase. + pbof := _sel(pbo, CamelCase(stringutil.ToLowerSnakeCase(field.Name))) // next pbo. goorfIsPtr := field.IsPtr() goorfType := field.TypeInfo goorf := _sel(goor, field.Name) // next goor. diff --git a/tm2/pkg/amino/genproto/genproto.go b/tm2/pkg/amino/genproto/genproto.go index 4f7154e058c..01452639245 100644 --- a/tm2/pkg/amino/genproto/genproto.go +++ b/tm2/pkg/amino/genproto/genproto.go @@ -15,6 +15,7 @@ import ( "time" "github.com/gnolang/gno/tm2/pkg/amino" + "github.com/gnolang/gno/tm2/pkg/amino/genproto/stringutil" "github.com/gnolang/gno/tm2/pkg/amino/pkg" ) @@ -204,7 +205,8 @@ func (p3c *P3Context) GenerateProto3MessagePartial(p3doc *P3Doc, rt reflect.Type p3Field := P3Field{ Repeated: fp3IsRepeated, Type: fp3, - Name: field.Name, + Name: stringutil.ToLowerSnakeCase(field.Name), + JSONName: field.JSONName, Number: field.FieldOptions.BinFieldNum, } p3msg.Fields = append(p3msg.Fields, p3Field) diff --git a/tm2/pkg/amino/genproto/genproto_test.go b/tm2/pkg/amino/genproto/genproto_test.go index 2a52741c901..22e7ea654d2 100644 --- a/tm2/pkg/amino/genproto/genproto_test.go +++ b/tm2/pkg/amino/genproto/genproto_test.go @@ -17,9 +17,9 @@ func TestBasic(t *testing.T) { obj := sm1.StructSM{} p3message := p3c.GenerateProto3MessagePartial(&p3doc, reflect.TypeOf(obj)) assert.Equal(t, p3message.Print(), `message StructSM { - sint64 FieldA = 1; - string FieldB = 2; - submodule2.StructSM2 FieldC = 3; + sint64 field_a = 1 [json_name = "FieldA"]; + string field_b = 2 [json_name = "FieldB"]; + submodule2.StructSM2 field_c = 3 [json_name = "FieldC"]; } `) @@ -40,8 +40,8 @@ import "github.com/gnolang/gno/tm2/pkg/amino/genproto/example/submodule2/submodu // messages message StructSM { - sint64 FieldA = 1; - string FieldB = 2; - submodule2.StructSM2 FieldC = 3; + sint64 field_a = 1 [json_name = "FieldA"]; + string field_b = 2 [json_name = "FieldB"]; + submodule2.StructSM2 field_c = 3 [json_name = "FieldC"]; }`) } diff --git a/tm2/pkg/amino/genproto/stringutil/snakecase.go b/tm2/pkg/amino/genproto/stringutil/snakecase.go new file mode 100644 index 00000000000..b7eb8c987da --- /dev/null +++ b/tm2/pkg/amino/genproto/stringutil/snakecase.go @@ -0,0 +1,335 @@ +// Copyright 2020-2023 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file has ToLowerSnakeCase which the Protobuf linter uses to make +// the expected spelling of a message field name. It is a copy of: +// https://github.com/bufbuild/buf/blob/main/private/pkg/stringutil/stringutil.go + +package stringutil + +import ( + "sort" + "strings" + "unicode" +) + +// TrimLines splits the output into individual lines and trims the spaces from each line. +// +// This also trims the start and end spaces from the original output. +func TrimLines(output string) string { + return strings.TrimSpace(strings.Join(SplitTrimLines(output), "\n")) +} + +// SplitTrimLines splits the output into individual lines and trims the spaces from each line. +func SplitTrimLines(output string) []string { + // this should work for windows as well as \r will be trimmed + split := strings.Split(output, "\n") + lines := make([]string, len(split)) + for i, line := range split { + lines[i] = strings.TrimSpace(line) + } + return lines +} + +// SplitTrimLinesNoEmpty splits the output into individual lines and trims the spaces from each line. +// +// This removes any empty lines. +func SplitTrimLinesNoEmpty(output string) []string { + // this should work for windows as well as \r will be trimmed + split := strings.Split(output, "\n") + lines := make([]string, 0, len(split)) + for _, line := range split { + line = strings.TrimSpace(line) + if line != "" { + lines = append(lines, line) + } + } + return lines +} + +// MapToSortedSlice transforms m to a sorted slice. +func MapToSortedSlice(m map[string]struct{}) []string { + s := MapToSlice(m) + sort.Strings(s) + return s +} + +// MapToSlice transforms m to a slice. +func MapToSlice(m map[string]struct{}) []string { + s := make([]string, 0, len(m)) + for e := range m { + s = append(s, e) + } + return s +} + +// SliceToMap transforms s to a map. +func SliceToMap(s []string) map[string]struct{} { + m := make(map[string]struct{}, len(s)) + for _, e := range s { + m[e] = struct{}{} + } + return m +} + +// SliceToUniqueSortedSlice returns a sorted copy of s with no duplicates. +func SliceToUniqueSortedSlice(s []string) []string { + return MapToSortedSlice(SliceToMap(s)) +} + +// SliceToUniqueSortedSliceFilterEmptyStrings returns a sorted copy of s with no duplicates and no empty strings. +// +// Strings with only spaces are considered empty. +func SliceToUniqueSortedSliceFilterEmptyStrings(s []string) []string { + m := SliceToMap(s) + for key := range m { + if strings.TrimSpace(key) == "" { + delete(m, key) + } + } + return MapToSortedSlice(m) +} + +// SliceToChunks splits s into chunks of the given chunk size. +// +// If s is nil or empty, returns empty. +// If chunkSize is <=0, returns [][]string{s}. +func SliceToChunks(s []string, chunkSize int) [][]string { + var chunks [][]string + if len(s) == 0 { + return chunks + } + if chunkSize <= 0 { + return [][]string{s} + } + c := make([]string, len(s)) + copy(c, s) + // https://github.com/golang/go/wiki/SliceTricks#batching-with-minimal-allocation + for chunkSize < len(c) { + c, chunks = c[chunkSize:], append(chunks, c[0:chunkSize:chunkSize]) + } + return append(chunks, c) +} + +// SliceElementsEqual returns true if the two slices have equal elements. +// +// Nil and empty slices are treated as equals. +func SliceElementsEqual(one []string, two []string) bool { + if len(one) != len(two) { + return false + } + for i, elem := range one { + if two[i] != elem { + return false + } + } + return true +} + +// SliceElementsContained returns true if superset contains subset. +// +// Nil and empty slices are treated as equals. +func SliceElementsContained(superset []string, subset []string) bool { + m := SliceToMap(superset) + for _, elem := range subset { + if _, ok := m[elem]; !ok { + return false + } + } + return true +} + +// JoinSliceQuoted joins the slice with quotes. +func JoinSliceQuoted(s []string, sep string) string { + if len(s) == 0 { + return "" + } + return `"` + strings.Join(s, `"`+sep+`"`) + `"` +} + +// SliceToString prints the slice as [e1,e2]. +func SliceToString(s []string) string { + if len(s) == 0 { + return "" + } + return "[" + strings.Join(s, ",") + "]" +} + +// SliceToHumanString prints the slice as "e1, e2, and e3". +func SliceToHumanString(s []string) string { + switch len(s) { + case 0: + return "" + case 1: + return s[0] + case 2: + return s[0] + " and " + s[1] + default: + return strings.Join(s[:len(s)-1], ", ") + ", and " + s[len(s)-1] + } +} + +// SliceToHumanStringQuoted prints the slice as `"e1", "e2", and "e3"`. +func SliceToHumanStringQuoted(s []string) string { + switch len(s) { + case 0: + return "" + case 1: + return `"` + s[0] + `"` + case 2: + return `"` + s[0] + `" and "` + s[1] + `"` + default: + return `"` + strings.Join(s[:len(s)-1], `", "`) + `", and "` + s[len(s)-1] + `"` + } +} + +// SliceToHumanStringOr prints the slice as "e1, e2, or e3". +func SliceToHumanStringOr(s []string) string { + switch len(s) { + case 0: + return "" + case 1: + return s[0] + case 2: + return s[0] + " or " + s[1] + default: + return strings.Join(s[:len(s)-1], ", ") + ", or " + s[len(s)-1] + } +} + +// SliceToHumanStringOrQuoted prints the slice as `"e1", "e2", or "e3"`. +func SliceToHumanStringOrQuoted(s []string) string { + switch len(s) { + case 0: + return "" + case 1: + return `"` + s[0] + `"` + case 2: + return `"` + s[0] + `" or "` + s[1] + `"` + default: + return `"` + strings.Join(s[:len(s)-1], `", "`) + `", or "` + s[len(s)-1] + `"` + } +} + +// SnakeCaseOption is an option for snake_case conversions. +type SnakeCaseOption func(*snakeCaseOptions) + +// SnakeCaseWithNewWordOnDigits is a SnakeCaseOption that signifies +// to split on digits, ie foo_bar_1 instead of foo_bar1. +func SnakeCaseWithNewWordOnDigits() SnakeCaseOption { + return func(snakeCaseOptions *snakeCaseOptions) { + snakeCaseOptions.newWordOnDigits = true + } +} + +// ToLowerSnakeCase transforms s to lower_snake_case. +func ToLowerSnakeCase(s string, options ...SnakeCaseOption) string { + return strings.ToLower(toSnakeCase(s, options...)) +} + +// ToUpperSnakeCase transforms s to UPPER_SNAKE_CASE. +func ToUpperSnakeCase(s string, options ...SnakeCaseOption) string { + return strings.ToUpper(toSnakeCase(s, options...)) +} + +// ToPascalCase converts s to PascalCase. +// +// Splits on '-', '_', ' ', '\t', '\n', '\r'. +// Uppercase letters will stay uppercase, +func ToPascalCase(s string) string { + output := "" + var previous rune + for i, c := range strings.TrimSpace(s) { + if !isDelimiter(c) { + if i == 0 || isDelimiter(previous) || unicode.IsUpper(c) { + output += string(unicode.ToUpper(c)) + } else { + output += string(unicode.ToLower(c)) + } + } + previous = c + } + return output +} + +// IsAlphanumeric returns true for [0-9a-zA-Z]. +func IsAlphanumeric(r rune) bool { + return IsNumeric(r) || IsAlpha(r) +} + +// IsAlpha returns true for [a-zA-Z]. +func IsAlpha(r rune) bool { + return IsLowerAlpha(r) || IsUpperAlpha(r) +} + +// IsLowerAlpha returns true for [a-z]. +func IsLowerAlpha(r rune) bool { + return 'a' <= r && r <= 'z' +} + +// IsUpperAlpha returns true for [A-Z]. +func IsUpperAlpha(r rune) bool { + return 'A' <= r && r <= 'Z' +} + +// IsNumeric returns true for [0-9]. +func IsNumeric(r rune) bool { + return '0' <= r && r <= '9' +} + +// IsLowerAlphanumeric returns true for [0-9a-z]. +func IsLowerAlphanumeric(r rune) bool { + return IsNumeric(r) || IsLowerAlpha(r) +} + +func toSnakeCase(s string, options ...SnakeCaseOption) string { + snakeCaseOptions := &snakeCaseOptions{} + for _, option := range options { + option(snakeCaseOptions) + } + output := "" + s = strings.TrimFunc(s, isDelimiter) + for i, c := range s { + if isDelimiter(c) { + c = '_' + } + if i == 0 { + output += string(c) + } else if isSnakeCaseNewWord(c, snakeCaseOptions.newWordOnDigits) && + output[len(output)-1] != '_' && + ((i < len(s)-1 && !isSnakeCaseNewWord(rune(s[i+1]), true) && !isDelimiter(rune(s[i+1]))) || + (snakeCaseOptions.newWordOnDigits && unicode.IsDigit(c)) || + (unicode.IsLower(rune(s[i-1])))) { + output += "_" + string(c) + } else if !(isDelimiter(c) && output[len(output)-1] == '_') { + output += string(c) + } + } + return output +} + +func isSnakeCaseNewWord(r rune, newWordOnDigits bool) bool { + if newWordOnDigits { + return unicode.IsUpper(r) || unicode.IsDigit(r) + } + return unicode.IsUpper(r) +} + +func isDelimiter(r rune) bool { + return r == '.' || r == '-' || r == '_' || r == ' ' || r == '\t' || r == '\n' || r == '\r' +} + +type snakeCaseOptions struct { + newWordOnDigits bool +} diff --git a/tm2/pkg/amino/genproto/types.go b/tm2/pkg/amino/genproto/types.go index a01794de01a..4d59092144e 100644 --- a/tm2/pkg/amino/genproto/types.go +++ b/tm2/pkg/amino/genproto/types.go @@ -152,6 +152,7 @@ type P3Field struct { Repeated bool Type P3Type Name string + JSONName string Number uint32 } @@ -225,11 +226,15 @@ func (msg P3Message) PrintCode(p *press.Press) *press.Press { } func (fld P3Field) PrintCode(p *press.Press) *press.Press { + fieldOptions := "" + if fld.JSONName != "" && fld.JSONName != fld.Name { + fieldOptions = " [json_name = \"" + fld.JSONName + "\"]" + } printComments(p, fld.Comment) if fld.Repeated { - p.Pl("repeated %v %v = %v;", fld.Type, fld.Name, fld.Number) + p.Pl("repeated %v %v = %v%v;", fld.Type, fld.Name, fld.Number, fieldOptions) } else { - p.Pl("%v %v = %v;", fld.Type, fld.Name, fld.Number) + p.Pl("%v %v = %v%v;", fld.Type, fld.Name, fld.Number, fieldOptions) } return p } diff --git a/tm2/pkg/amino/tests/pb/tests.pb.go b/tm2/pkg/amino/tests/pb/tests.pb.go index e323d01bada..bff4f37f862 100644 --- a/tm2/pkg/amino/tests/pb/tests.pb.go +++ b/tm2/pkg/amino/tests/pb/tests.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 -// protoc v3.21.12 +// protoc-gen-go v1.31.0 +// protoc v4.24.3 // source: tests.proto package pb @@ -67,26 +67,26 @@ type PrimitivesStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Int8 int32 `protobuf:"zigzag32,1,opt,name=Int8,proto3" json:"Int8,omitempty"` - Int16 int32 `protobuf:"zigzag32,2,opt,name=Int16,proto3" json:"Int16,omitempty"` - Int32 int32 `protobuf:"zigzag32,3,opt,name=Int32,proto3" json:"Int32,omitempty"` - Int32Fixed int32 `protobuf:"fixed32,4,opt,name=Int32Fixed,proto3" json:"Int32Fixed,omitempty"` - Int64 int64 `protobuf:"zigzag64,5,opt,name=Int64,proto3" json:"Int64,omitempty"` - Int64Fixed int64 `protobuf:"fixed64,6,opt,name=Int64Fixed,proto3" json:"Int64Fixed,omitempty"` - Int int64 `protobuf:"zigzag64,7,opt,name=Int,proto3" json:"Int,omitempty"` - Byte uint32 `protobuf:"varint,8,opt,name=Byte,proto3" json:"Byte,omitempty"` - Uint8 uint32 `protobuf:"varint,9,opt,name=Uint8,proto3" json:"Uint8,omitempty"` - Uint16 uint32 `protobuf:"varint,10,opt,name=Uint16,proto3" json:"Uint16,omitempty"` - Uint32 uint32 `protobuf:"varint,11,opt,name=Uint32,proto3" json:"Uint32,omitempty"` - Uint32Fixed uint32 `protobuf:"fixed32,12,opt,name=Uint32Fixed,proto3" json:"Uint32Fixed,omitempty"` - Uint64 uint64 `protobuf:"varint,13,opt,name=Uint64,proto3" json:"Uint64,omitempty"` - Uint64Fixed uint64 `protobuf:"fixed64,14,opt,name=Uint64Fixed,proto3" json:"Uint64Fixed,omitempty"` - Uint uint64 `protobuf:"varint,15,opt,name=Uint,proto3" json:"Uint,omitempty"` - Str string `protobuf:"bytes,16,opt,name=Str,proto3" json:"Str,omitempty"` - Bytes []byte `protobuf:"bytes,17,opt,name=Bytes,proto3" json:"Bytes,omitempty"` - Time *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=Time,proto3" json:"Time,omitempty"` - Duration *durationpb.Duration `protobuf:"bytes,19,opt,name=Duration,proto3" json:"Duration,omitempty"` - Empty *EmptyStruct `protobuf:"bytes,20,opt,name=Empty,proto3" json:"Empty,omitempty"` + Int8 int32 `protobuf:"zigzag32,1,opt,name=int8,json=Int8,proto3" json:"int8,omitempty"` + Int16 int32 `protobuf:"zigzag32,2,opt,name=int16,json=Int16,proto3" json:"int16,omitempty"` + Int32 int32 `protobuf:"zigzag32,3,opt,name=int32,json=Int32,proto3" json:"int32,omitempty"` + Int32Fixed int32 `protobuf:"fixed32,4,opt,name=int32_fixed,json=Int32Fixed,proto3" json:"int32_fixed,omitempty"` + Int64 int64 `protobuf:"zigzag64,5,opt,name=int64,json=Int64,proto3" json:"int64,omitempty"` + Int64Fixed int64 `protobuf:"fixed64,6,opt,name=int64_fixed,json=Int64Fixed,proto3" json:"int64_fixed,omitempty"` + Int int64 `protobuf:"zigzag64,7,opt,name=int,json=Int,proto3" json:"int,omitempty"` + Byte uint32 `protobuf:"varint,8,opt,name=byte,json=Byte,proto3" json:"byte,omitempty"` + Uint8 uint32 `protobuf:"varint,9,opt,name=uint8,json=Uint8,proto3" json:"uint8,omitempty"` + Uint16 uint32 `protobuf:"varint,10,opt,name=uint16,json=Uint16,proto3" json:"uint16,omitempty"` + Uint32 uint32 `protobuf:"varint,11,opt,name=uint32,json=Uint32,proto3" json:"uint32,omitempty"` + Uint32Fixed uint32 `protobuf:"fixed32,12,opt,name=uint32_fixed,json=Uint32Fixed,proto3" json:"uint32_fixed,omitempty"` + Uint64 uint64 `protobuf:"varint,13,opt,name=uint64,json=Uint64,proto3" json:"uint64,omitempty"` + Uint64Fixed uint64 `protobuf:"fixed64,14,opt,name=uint64_fixed,json=Uint64Fixed,proto3" json:"uint64_fixed,omitempty"` + Uint uint64 `protobuf:"varint,15,opt,name=uint,json=Uint,proto3" json:"uint,omitempty"` + Str string `protobuf:"bytes,16,opt,name=str,json=Str,proto3" json:"str,omitempty"` + Bytes []byte `protobuf:"bytes,17,opt,name=bytes,json=Bytes,proto3" json:"bytes,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=time,json=Time,proto3" json:"time,omitempty"` + Duration *durationpb.Duration `protobuf:"bytes,19,opt,name=duration,json=Duration,proto3" json:"duration,omitempty"` + Empty *EmptyStruct `protobuf:"bytes,20,opt,name=empty,json=Empty,proto3" json:"empty,omitempty"` } func (x *PrimitivesStruct) Reset() { @@ -266,8 +266,8 @@ type ShortArraysStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TimeAr []*timestamppb.Timestamp `protobuf:"bytes,1,rep,name=TimeAr,proto3" json:"TimeAr,omitempty"` - DurationAr []*durationpb.Duration `protobuf:"bytes,2,rep,name=DurationAr,proto3" json:"DurationAr,omitempty"` + TimeAr []*timestamppb.Timestamp `protobuf:"bytes,1,rep,name=time_ar,json=TimeAr,proto3" json:"time_ar,omitempty"` + DurationAr []*durationpb.Duration `protobuf:"bytes,2,rep,name=duration_ar,json=DurationAr,proto3" json:"duration_ar,omitempty"` } func (x *ShortArraysStruct) Reset() { @@ -321,26 +321,26 @@ type ArraysStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Int8Ar []int32 `protobuf:"zigzag32,1,rep,packed,name=Int8Ar,proto3" json:"Int8Ar,omitempty"` - Int16Ar []int32 `protobuf:"zigzag32,2,rep,packed,name=Int16Ar,proto3" json:"Int16Ar,omitempty"` - Int32Ar []int32 `protobuf:"zigzag32,3,rep,packed,name=Int32Ar,proto3" json:"Int32Ar,omitempty"` - Int32FixedAr []int32 `protobuf:"fixed32,4,rep,packed,name=Int32FixedAr,proto3" json:"Int32FixedAr,omitempty"` - Int64Ar []int64 `protobuf:"zigzag64,5,rep,packed,name=Int64Ar,proto3" json:"Int64Ar,omitempty"` - Int64FixedAr []int64 `protobuf:"fixed64,6,rep,packed,name=Int64FixedAr,proto3" json:"Int64FixedAr,omitempty"` - IntAr []int64 `protobuf:"zigzag64,7,rep,packed,name=IntAr,proto3" json:"IntAr,omitempty"` - ByteAr []byte `protobuf:"bytes,8,opt,name=ByteAr,proto3" json:"ByteAr,omitempty"` - Uint8Ar []byte `protobuf:"bytes,9,opt,name=Uint8Ar,proto3" json:"Uint8Ar,omitempty"` - Uint16Ar []uint32 `protobuf:"varint,10,rep,packed,name=Uint16Ar,proto3" json:"Uint16Ar,omitempty"` - Uint32Ar []uint32 `protobuf:"varint,11,rep,packed,name=Uint32Ar,proto3" json:"Uint32Ar,omitempty"` - Uint32FixedAr []uint32 `protobuf:"fixed32,12,rep,packed,name=Uint32FixedAr,proto3" json:"Uint32FixedAr,omitempty"` - Uint64Ar []uint64 `protobuf:"varint,13,rep,packed,name=Uint64Ar,proto3" json:"Uint64Ar,omitempty"` - Uint64FixedAr []uint64 `protobuf:"fixed64,14,rep,packed,name=Uint64FixedAr,proto3" json:"Uint64FixedAr,omitempty"` - UintAr []uint64 `protobuf:"varint,15,rep,packed,name=UintAr,proto3" json:"UintAr,omitempty"` - StrAr []string `protobuf:"bytes,16,rep,name=StrAr,proto3" json:"StrAr,omitempty"` - BytesAr [][]byte `protobuf:"bytes,17,rep,name=BytesAr,proto3" json:"BytesAr,omitempty"` - TimeAr []*timestamppb.Timestamp `protobuf:"bytes,18,rep,name=TimeAr,proto3" json:"TimeAr,omitempty"` - DurationAr []*durationpb.Duration `protobuf:"bytes,19,rep,name=DurationAr,proto3" json:"DurationAr,omitempty"` - EmptyAr []*EmptyStruct `protobuf:"bytes,20,rep,name=EmptyAr,proto3" json:"EmptyAr,omitempty"` + Int8Ar []int32 `protobuf:"zigzag32,1,rep,packed,name=int8_ar,json=Int8Ar,proto3" json:"int8_ar,omitempty"` + Int16Ar []int32 `protobuf:"zigzag32,2,rep,packed,name=int16_ar,json=Int16Ar,proto3" json:"int16_ar,omitempty"` + Int32Ar []int32 `protobuf:"zigzag32,3,rep,packed,name=int32_ar,json=Int32Ar,proto3" json:"int32_ar,omitempty"` + Int32FixedAr []int32 `protobuf:"fixed32,4,rep,packed,name=int32_fixed_ar,json=Int32FixedAr,proto3" json:"int32_fixed_ar,omitempty"` + Int64Ar []int64 `protobuf:"zigzag64,5,rep,packed,name=int64_ar,json=Int64Ar,proto3" json:"int64_ar,omitempty"` + Int64FixedAr []int64 `protobuf:"fixed64,6,rep,packed,name=int64_fixed_ar,json=Int64FixedAr,proto3" json:"int64_fixed_ar,omitempty"` + IntAr []int64 `protobuf:"zigzag64,7,rep,packed,name=int_ar,json=IntAr,proto3" json:"int_ar,omitempty"` + ByteAr []byte `protobuf:"bytes,8,opt,name=byte_ar,json=ByteAr,proto3" json:"byte_ar,omitempty"` + Uint8Ar []byte `protobuf:"bytes,9,opt,name=uint8_ar,json=Uint8Ar,proto3" json:"uint8_ar,omitempty"` + Uint16Ar []uint32 `protobuf:"varint,10,rep,packed,name=uint16_ar,json=Uint16Ar,proto3" json:"uint16_ar,omitempty"` + Uint32Ar []uint32 `protobuf:"varint,11,rep,packed,name=uint32_ar,json=Uint32Ar,proto3" json:"uint32_ar,omitempty"` + Uint32FixedAr []uint32 `protobuf:"fixed32,12,rep,packed,name=uint32_fixed_ar,json=Uint32FixedAr,proto3" json:"uint32_fixed_ar,omitempty"` + Uint64Ar []uint64 `protobuf:"varint,13,rep,packed,name=uint64_ar,json=Uint64Ar,proto3" json:"uint64_ar,omitempty"` + Uint64FixedAr []uint64 `protobuf:"fixed64,14,rep,packed,name=uint64_fixed_ar,json=Uint64FixedAr,proto3" json:"uint64_fixed_ar,omitempty"` + UintAr []uint64 `protobuf:"varint,15,rep,packed,name=uint_ar,json=UintAr,proto3" json:"uint_ar,omitempty"` + StrAr []string `protobuf:"bytes,16,rep,name=str_ar,json=StrAr,proto3" json:"str_ar,omitempty"` + BytesAr [][]byte `protobuf:"bytes,17,rep,name=bytes_ar,json=BytesAr,proto3" json:"bytes_ar,omitempty"` + TimeAr []*timestamppb.Timestamp `protobuf:"bytes,18,rep,name=time_ar,json=TimeAr,proto3" json:"time_ar,omitempty"` + DurationAr []*durationpb.Duration `protobuf:"bytes,19,rep,name=duration_ar,json=DurationAr,proto3" json:"duration_ar,omitempty"` + EmptyAr []*EmptyStruct `protobuf:"bytes,20,rep,name=empty_ar,json=EmptyAr,proto3" json:"empty_ar,omitempty"` } func (x *ArraysStruct) Reset() { @@ -520,26 +520,26 @@ type ArraysArraysStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Int8ArAr []*TESTS_Int8List `protobuf:"bytes,1,rep,name=Int8ArAr,proto3" json:"Int8ArAr,omitempty"` - Int16ArAr []*TESTS_Int16List `protobuf:"bytes,2,rep,name=Int16ArAr,proto3" json:"Int16ArAr,omitempty"` - Int32ArAr []*TESTS_Int32ValueList `protobuf:"bytes,3,rep,name=Int32ArAr,proto3" json:"Int32ArAr,omitempty"` - Int32FixedArAr []*TESTS_Fixed32Int32ValueList `protobuf:"bytes,4,rep,name=Int32FixedArAr,proto3" json:"Int32FixedArAr,omitempty"` - Int64ArAr []*TESTS_Int64ValueList `protobuf:"bytes,5,rep,name=Int64ArAr,proto3" json:"Int64ArAr,omitempty"` - Int64FixedArAr []*TESTS_Fixed64Int64ValueList `protobuf:"bytes,6,rep,name=Int64FixedArAr,proto3" json:"Int64FixedArAr,omitempty"` - IntArAr []*TESTS_Int64ValueList `protobuf:"bytes,7,rep,name=IntArAr,proto3" json:"IntArAr,omitempty"` - ByteArAr [][]byte `protobuf:"bytes,8,rep,name=ByteArAr,proto3" json:"ByteArAr,omitempty"` - Uint8ArAr [][]byte `protobuf:"bytes,9,rep,name=Uint8ArAr,proto3" json:"Uint8ArAr,omitempty"` - Uint16ArAr []*TESTS_UInt16List `protobuf:"bytes,10,rep,name=Uint16ArAr,proto3" json:"Uint16ArAr,omitempty"` - Uint32ArAr []*TESTS_UInt32ValueList `protobuf:"bytes,11,rep,name=Uint32ArAr,proto3" json:"Uint32ArAr,omitempty"` - Uint32FixedArAr []*TESTS_Fixed32UInt32ValueList `protobuf:"bytes,12,rep,name=Uint32FixedArAr,proto3" json:"Uint32FixedArAr,omitempty"` - Uint64ArAr []*TESTS_UInt64ValueList `protobuf:"bytes,13,rep,name=Uint64ArAr,proto3" json:"Uint64ArAr,omitempty"` - Uint64FixedArAr []*TESTS_Fixed64UInt64ValueList `protobuf:"bytes,14,rep,name=Uint64FixedArAr,proto3" json:"Uint64FixedArAr,omitempty"` - UintArAr []*TESTS_UInt64ValueList `protobuf:"bytes,15,rep,name=UintArAr,proto3" json:"UintArAr,omitempty"` - StrArAr []*TESTS_StringValueList `protobuf:"bytes,16,rep,name=StrArAr,proto3" json:"StrArAr,omitempty"` - BytesArAr []*TESTS_BytesList `protobuf:"bytes,17,rep,name=BytesArAr,proto3" json:"BytesArAr,omitempty"` - TimeArAr []*TESTS_TimestampList `protobuf:"bytes,18,rep,name=TimeArAr,proto3" json:"TimeArAr,omitempty"` - DurationArAr []*TESTS_DurationList `protobuf:"bytes,19,rep,name=DurationArAr,proto3" json:"DurationArAr,omitempty"` - EmptyArAr []*TESTS_EmptyStructList `protobuf:"bytes,20,rep,name=EmptyArAr,proto3" json:"EmptyArAr,omitempty"` + Int8ArAr []*TESTS_Int8List `protobuf:"bytes,1,rep,name=int8_ar_ar,json=Int8ArAr,proto3" json:"int8_ar_ar,omitempty"` + Int16ArAr []*TESTS_Int16List `protobuf:"bytes,2,rep,name=int16_ar_ar,json=Int16ArAr,proto3" json:"int16_ar_ar,omitempty"` + Int32ArAr []*TESTS_Int32ValueList `protobuf:"bytes,3,rep,name=int32_ar_ar,json=Int32ArAr,proto3" json:"int32_ar_ar,omitempty"` + Int32FixedArAr []*TESTS_Fixed32Int32ValueList `protobuf:"bytes,4,rep,name=int32_fixed_ar_ar,json=Int32FixedArAr,proto3" json:"int32_fixed_ar_ar,omitempty"` + Int64ArAr []*TESTS_Int64ValueList `protobuf:"bytes,5,rep,name=int64_ar_ar,json=Int64ArAr,proto3" json:"int64_ar_ar,omitempty"` + Int64FixedArAr []*TESTS_Fixed64Int64ValueList `protobuf:"bytes,6,rep,name=int64_fixed_ar_ar,json=Int64FixedArAr,proto3" json:"int64_fixed_ar_ar,omitempty"` + IntArAr []*TESTS_Int64ValueList `protobuf:"bytes,7,rep,name=int_ar_ar,json=IntArAr,proto3" json:"int_ar_ar,omitempty"` + ByteArAr [][]byte `protobuf:"bytes,8,rep,name=byte_ar_ar,json=ByteArAr,proto3" json:"byte_ar_ar,omitempty"` + Uint8ArAr [][]byte `protobuf:"bytes,9,rep,name=uint8_ar_ar,json=Uint8ArAr,proto3" json:"uint8_ar_ar,omitempty"` + Uint16ArAr []*TESTS_UInt16List `protobuf:"bytes,10,rep,name=uint16_ar_ar,json=Uint16ArAr,proto3" json:"uint16_ar_ar,omitempty"` + Uint32ArAr []*TESTS_UInt32ValueList `protobuf:"bytes,11,rep,name=uint32_ar_ar,json=Uint32ArAr,proto3" json:"uint32_ar_ar,omitempty"` + Uint32FixedArAr []*TESTS_Fixed32UInt32ValueList `protobuf:"bytes,12,rep,name=uint32_fixed_ar_ar,json=Uint32FixedArAr,proto3" json:"uint32_fixed_ar_ar,omitempty"` + Uint64ArAr []*TESTS_UInt64ValueList `protobuf:"bytes,13,rep,name=uint64_ar_ar,json=Uint64ArAr,proto3" json:"uint64_ar_ar,omitempty"` + Uint64FixedArAr []*TESTS_Fixed64UInt64ValueList `protobuf:"bytes,14,rep,name=uint64_fixed_ar_ar,json=Uint64FixedArAr,proto3" json:"uint64_fixed_ar_ar,omitempty"` + UintArAr []*TESTS_UInt64ValueList `protobuf:"bytes,15,rep,name=uint_ar_ar,json=UintArAr,proto3" json:"uint_ar_ar,omitempty"` + StrArAr []*TESTS_StringValueList `protobuf:"bytes,16,rep,name=str_ar_ar,json=StrArAr,proto3" json:"str_ar_ar,omitempty"` + BytesArAr []*TESTS_BytesList `protobuf:"bytes,17,rep,name=bytes_ar_ar,json=BytesArAr,proto3" json:"bytes_ar_ar,omitempty"` + TimeArAr []*TESTS_TimestampList `protobuf:"bytes,18,rep,name=time_ar_ar,json=TimeArAr,proto3" json:"time_ar_ar,omitempty"` + DurationArAr []*TESTS_DurationList `protobuf:"bytes,19,rep,name=duration_ar_ar,json=DurationArAr,proto3" json:"duration_ar_ar,omitempty"` + EmptyArAr []*TESTS_EmptyStructList `protobuf:"bytes,20,rep,name=empty_ar_ar,json=EmptyArAr,proto3" json:"empty_ar_ar,omitempty"` } func (x *ArraysArraysStruct) Reset() { @@ -719,26 +719,26 @@ type SlicesStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Int8Sl []int32 `protobuf:"zigzag32,1,rep,packed,name=Int8Sl,proto3" json:"Int8Sl,omitempty"` - Int16Sl []int32 `protobuf:"zigzag32,2,rep,packed,name=Int16Sl,proto3" json:"Int16Sl,omitempty"` - Int32Sl []int32 `protobuf:"zigzag32,3,rep,packed,name=Int32Sl,proto3" json:"Int32Sl,omitempty"` - Int32FixedSl []int32 `protobuf:"fixed32,4,rep,packed,name=Int32FixedSl,proto3" json:"Int32FixedSl,omitempty"` - Int64Sl []int64 `protobuf:"zigzag64,5,rep,packed,name=Int64Sl,proto3" json:"Int64Sl,omitempty"` - Int64FixedSl []int64 `protobuf:"fixed64,6,rep,packed,name=Int64FixedSl,proto3" json:"Int64FixedSl,omitempty"` - IntSl []int64 `protobuf:"zigzag64,7,rep,packed,name=IntSl,proto3" json:"IntSl,omitempty"` - ByteSl []byte `protobuf:"bytes,8,opt,name=ByteSl,proto3" json:"ByteSl,omitempty"` - Uint8Sl []byte `protobuf:"bytes,9,opt,name=Uint8Sl,proto3" json:"Uint8Sl,omitempty"` - Uint16Sl []uint32 `protobuf:"varint,10,rep,packed,name=Uint16Sl,proto3" json:"Uint16Sl,omitempty"` - Uint32Sl []uint32 `protobuf:"varint,11,rep,packed,name=Uint32Sl,proto3" json:"Uint32Sl,omitempty"` - Uint32FixedSl []uint32 `protobuf:"fixed32,12,rep,packed,name=Uint32FixedSl,proto3" json:"Uint32FixedSl,omitempty"` - Uint64Sl []uint64 `protobuf:"varint,13,rep,packed,name=Uint64Sl,proto3" json:"Uint64Sl,omitempty"` - Uint64FixedSl []uint64 `protobuf:"fixed64,14,rep,packed,name=Uint64FixedSl,proto3" json:"Uint64FixedSl,omitempty"` - UintSl []uint64 `protobuf:"varint,15,rep,packed,name=UintSl,proto3" json:"UintSl,omitempty"` - StrSl []string `protobuf:"bytes,16,rep,name=StrSl,proto3" json:"StrSl,omitempty"` - BytesSl [][]byte `protobuf:"bytes,17,rep,name=BytesSl,proto3" json:"BytesSl,omitempty"` - TimeSl []*timestamppb.Timestamp `protobuf:"bytes,18,rep,name=TimeSl,proto3" json:"TimeSl,omitempty"` - DurationSl []*durationpb.Duration `protobuf:"bytes,19,rep,name=DurationSl,proto3" json:"DurationSl,omitempty"` - EmptySl []*EmptyStruct `protobuf:"bytes,20,rep,name=EmptySl,proto3" json:"EmptySl,omitempty"` + Int8Sl []int32 `protobuf:"zigzag32,1,rep,packed,name=int8_sl,json=Int8Sl,proto3" json:"int8_sl,omitempty"` + Int16Sl []int32 `protobuf:"zigzag32,2,rep,packed,name=int16_sl,json=Int16Sl,proto3" json:"int16_sl,omitempty"` + Int32Sl []int32 `protobuf:"zigzag32,3,rep,packed,name=int32_sl,json=Int32Sl,proto3" json:"int32_sl,omitempty"` + Int32FixedSl []int32 `protobuf:"fixed32,4,rep,packed,name=int32_fixed_sl,json=Int32FixedSl,proto3" json:"int32_fixed_sl,omitempty"` + Int64Sl []int64 `protobuf:"zigzag64,5,rep,packed,name=int64_sl,json=Int64Sl,proto3" json:"int64_sl,omitempty"` + Int64FixedSl []int64 `protobuf:"fixed64,6,rep,packed,name=int64_fixed_sl,json=Int64FixedSl,proto3" json:"int64_fixed_sl,omitempty"` + IntSl []int64 `protobuf:"zigzag64,7,rep,packed,name=int_sl,json=IntSl,proto3" json:"int_sl,omitempty"` + ByteSl []byte `protobuf:"bytes,8,opt,name=byte_sl,json=ByteSl,proto3" json:"byte_sl,omitempty"` + Uint8Sl []byte `protobuf:"bytes,9,opt,name=uint8_sl,json=Uint8Sl,proto3" json:"uint8_sl,omitempty"` + Uint16Sl []uint32 `protobuf:"varint,10,rep,packed,name=uint16_sl,json=Uint16Sl,proto3" json:"uint16_sl,omitempty"` + Uint32Sl []uint32 `protobuf:"varint,11,rep,packed,name=uint32_sl,json=Uint32Sl,proto3" json:"uint32_sl,omitempty"` + Uint32FixedSl []uint32 `protobuf:"fixed32,12,rep,packed,name=uint32_fixed_sl,json=Uint32FixedSl,proto3" json:"uint32_fixed_sl,omitempty"` + Uint64Sl []uint64 `protobuf:"varint,13,rep,packed,name=uint64_sl,json=Uint64Sl,proto3" json:"uint64_sl,omitempty"` + Uint64FixedSl []uint64 `protobuf:"fixed64,14,rep,packed,name=uint64_fixed_sl,json=Uint64FixedSl,proto3" json:"uint64_fixed_sl,omitempty"` + UintSl []uint64 `protobuf:"varint,15,rep,packed,name=uint_sl,json=UintSl,proto3" json:"uint_sl,omitempty"` + StrSl []string `protobuf:"bytes,16,rep,name=str_sl,json=StrSl,proto3" json:"str_sl,omitempty"` + BytesSl [][]byte `protobuf:"bytes,17,rep,name=bytes_sl,json=BytesSl,proto3" json:"bytes_sl,omitempty"` + TimeSl []*timestamppb.Timestamp `protobuf:"bytes,18,rep,name=time_sl,json=TimeSl,proto3" json:"time_sl,omitempty"` + DurationSl []*durationpb.Duration `protobuf:"bytes,19,rep,name=duration_sl,json=DurationSl,proto3" json:"duration_sl,omitempty"` + EmptySl []*EmptyStruct `protobuf:"bytes,20,rep,name=empty_sl,json=EmptySl,proto3" json:"empty_sl,omitempty"` } func (x *SlicesStruct) Reset() { @@ -918,26 +918,26 @@ type SlicesSlicesStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Int8SlSl []*TESTS_Int8List `protobuf:"bytes,1,rep,name=Int8SlSl,proto3" json:"Int8SlSl,omitempty"` - Int16SlSl []*TESTS_Int16List `protobuf:"bytes,2,rep,name=Int16SlSl,proto3" json:"Int16SlSl,omitempty"` - Int32SlSl []*TESTS_Int32ValueList `protobuf:"bytes,3,rep,name=Int32SlSl,proto3" json:"Int32SlSl,omitempty"` - Int32FixedSlSl []*TESTS_Fixed32Int32ValueList `protobuf:"bytes,4,rep,name=Int32FixedSlSl,proto3" json:"Int32FixedSlSl,omitempty"` - Int64SlSl []*TESTS_Int64ValueList `protobuf:"bytes,5,rep,name=Int64SlSl,proto3" json:"Int64SlSl,omitempty"` - Int64FixedSlSl []*TESTS_Fixed64Int64ValueList `protobuf:"bytes,6,rep,name=Int64FixedSlSl,proto3" json:"Int64FixedSlSl,omitempty"` - IntSlSl []*TESTS_Int64ValueList `protobuf:"bytes,7,rep,name=IntSlSl,proto3" json:"IntSlSl,omitempty"` - ByteSlSl [][]byte `protobuf:"bytes,8,rep,name=ByteSlSl,proto3" json:"ByteSlSl,omitempty"` - Uint8SlSl [][]byte `protobuf:"bytes,9,rep,name=Uint8SlSl,proto3" json:"Uint8SlSl,omitempty"` - Uint16SlSl []*TESTS_UInt16List `protobuf:"bytes,10,rep,name=Uint16SlSl,proto3" json:"Uint16SlSl,omitempty"` - Uint32SlSl []*TESTS_UInt32ValueList `protobuf:"bytes,11,rep,name=Uint32SlSl,proto3" json:"Uint32SlSl,omitempty"` - Uint32FixedSlSl []*TESTS_Fixed32UInt32ValueList `protobuf:"bytes,12,rep,name=Uint32FixedSlSl,proto3" json:"Uint32FixedSlSl,omitempty"` - Uint64SlSl []*TESTS_UInt64ValueList `protobuf:"bytes,13,rep,name=Uint64SlSl,proto3" json:"Uint64SlSl,omitempty"` - Uint64FixedSlSl []*TESTS_Fixed64UInt64ValueList `protobuf:"bytes,14,rep,name=Uint64FixedSlSl,proto3" json:"Uint64FixedSlSl,omitempty"` - UintSlSl []*TESTS_UInt64ValueList `protobuf:"bytes,15,rep,name=UintSlSl,proto3" json:"UintSlSl,omitempty"` - StrSlSl []*TESTS_StringValueList `protobuf:"bytes,16,rep,name=StrSlSl,proto3" json:"StrSlSl,omitempty"` - BytesSlSl []*TESTS_BytesList `protobuf:"bytes,17,rep,name=BytesSlSl,proto3" json:"BytesSlSl,omitempty"` - TimeSlSl []*TESTS_TimestampList `protobuf:"bytes,18,rep,name=TimeSlSl,proto3" json:"TimeSlSl,omitempty"` - DurationSlSl []*TESTS_DurationList `protobuf:"bytes,19,rep,name=DurationSlSl,proto3" json:"DurationSlSl,omitempty"` - EmptySlSl []*TESTS_EmptyStructList `protobuf:"bytes,20,rep,name=EmptySlSl,proto3" json:"EmptySlSl,omitempty"` + Int8SlSl []*TESTS_Int8List `protobuf:"bytes,1,rep,name=int8_sl_sl,json=Int8SlSl,proto3" json:"int8_sl_sl,omitempty"` + Int16SlSl []*TESTS_Int16List `protobuf:"bytes,2,rep,name=int16_sl_sl,json=Int16SlSl,proto3" json:"int16_sl_sl,omitempty"` + Int32SlSl []*TESTS_Int32ValueList `protobuf:"bytes,3,rep,name=int32_sl_sl,json=Int32SlSl,proto3" json:"int32_sl_sl,omitempty"` + Int32FixedSlSl []*TESTS_Fixed32Int32ValueList `protobuf:"bytes,4,rep,name=int32_fixed_sl_sl,json=Int32FixedSlSl,proto3" json:"int32_fixed_sl_sl,omitempty"` + Int64SlSl []*TESTS_Int64ValueList `protobuf:"bytes,5,rep,name=int64_sl_sl,json=Int64SlSl,proto3" json:"int64_sl_sl,omitempty"` + Int64FixedSlSl []*TESTS_Fixed64Int64ValueList `protobuf:"bytes,6,rep,name=int64_fixed_sl_sl,json=Int64FixedSlSl,proto3" json:"int64_fixed_sl_sl,omitempty"` + IntSlSl []*TESTS_Int64ValueList `protobuf:"bytes,7,rep,name=int_sl_sl,json=IntSlSl,proto3" json:"int_sl_sl,omitempty"` + ByteSlSl [][]byte `protobuf:"bytes,8,rep,name=byte_sl_sl,json=ByteSlSl,proto3" json:"byte_sl_sl,omitempty"` + Uint8SlSl [][]byte `protobuf:"bytes,9,rep,name=uint8_sl_sl,json=Uint8SlSl,proto3" json:"uint8_sl_sl,omitempty"` + Uint16SlSl []*TESTS_UInt16List `protobuf:"bytes,10,rep,name=uint16_sl_sl,json=Uint16SlSl,proto3" json:"uint16_sl_sl,omitempty"` + Uint32SlSl []*TESTS_UInt32ValueList `protobuf:"bytes,11,rep,name=uint32_sl_sl,json=Uint32SlSl,proto3" json:"uint32_sl_sl,omitempty"` + Uint32FixedSlSl []*TESTS_Fixed32UInt32ValueList `protobuf:"bytes,12,rep,name=uint32_fixed_sl_sl,json=Uint32FixedSlSl,proto3" json:"uint32_fixed_sl_sl,omitempty"` + Uint64SlSl []*TESTS_UInt64ValueList `protobuf:"bytes,13,rep,name=uint64_sl_sl,json=Uint64SlSl,proto3" json:"uint64_sl_sl,omitempty"` + Uint64FixedSlSl []*TESTS_Fixed64UInt64ValueList `protobuf:"bytes,14,rep,name=uint64_fixed_sl_sl,json=Uint64FixedSlSl,proto3" json:"uint64_fixed_sl_sl,omitempty"` + UintSlSl []*TESTS_UInt64ValueList `protobuf:"bytes,15,rep,name=uint_sl_sl,json=UintSlSl,proto3" json:"uint_sl_sl,omitempty"` + StrSlSl []*TESTS_StringValueList `protobuf:"bytes,16,rep,name=str_sl_sl,json=StrSlSl,proto3" json:"str_sl_sl,omitempty"` + BytesSlSl []*TESTS_BytesList `protobuf:"bytes,17,rep,name=bytes_sl_sl,json=BytesSlSl,proto3" json:"bytes_sl_sl,omitempty"` + TimeSlSl []*TESTS_TimestampList `protobuf:"bytes,18,rep,name=time_sl_sl,json=TimeSlSl,proto3" json:"time_sl_sl,omitempty"` + DurationSlSl []*TESTS_DurationList `protobuf:"bytes,19,rep,name=duration_sl_sl,json=DurationSlSl,proto3" json:"duration_sl_sl,omitempty"` + EmptySlSl []*TESTS_EmptyStructList `protobuf:"bytes,20,rep,name=empty_sl_sl,json=EmptySlSl,proto3" json:"empty_sl_sl,omitempty"` } func (x *SlicesSlicesStruct) Reset() { @@ -1117,26 +1117,26 @@ type PointersStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Int8Pt int32 `protobuf:"zigzag32,1,opt,name=Int8Pt,proto3" json:"Int8Pt,omitempty"` - Int16Pt int32 `protobuf:"zigzag32,2,opt,name=Int16Pt,proto3" json:"Int16Pt,omitempty"` - Int32Pt int32 `protobuf:"zigzag32,3,opt,name=Int32Pt,proto3" json:"Int32Pt,omitempty"` - Int32FixedPt int32 `protobuf:"fixed32,4,opt,name=Int32FixedPt,proto3" json:"Int32FixedPt,omitempty"` - Int64Pt int64 `protobuf:"zigzag64,5,opt,name=Int64Pt,proto3" json:"Int64Pt,omitempty"` - Int64FixedPt int64 `protobuf:"fixed64,6,opt,name=Int64FixedPt,proto3" json:"Int64FixedPt,omitempty"` - IntPt int64 `protobuf:"zigzag64,7,opt,name=IntPt,proto3" json:"IntPt,omitempty"` - BytePt uint32 `protobuf:"varint,8,opt,name=BytePt,proto3" json:"BytePt,omitempty"` - Uint8Pt uint32 `protobuf:"varint,9,opt,name=Uint8Pt,proto3" json:"Uint8Pt,omitempty"` - Uint16Pt uint32 `protobuf:"varint,10,opt,name=Uint16Pt,proto3" json:"Uint16Pt,omitempty"` - Uint32Pt uint32 `protobuf:"varint,11,opt,name=Uint32Pt,proto3" json:"Uint32Pt,omitempty"` - Uint32FixedPt uint32 `protobuf:"fixed32,12,opt,name=Uint32FixedPt,proto3" json:"Uint32FixedPt,omitempty"` - Uint64Pt uint64 `protobuf:"varint,13,opt,name=Uint64Pt,proto3" json:"Uint64Pt,omitempty"` - Uint64FixedPt uint64 `protobuf:"fixed64,14,opt,name=Uint64FixedPt,proto3" json:"Uint64FixedPt,omitempty"` - UintPt uint64 `protobuf:"varint,15,opt,name=UintPt,proto3" json:"UintPt,omitempty"` - StrPt string `protobuf:"bytes,16,opt,name=StrPt,proto3" json:"StrPt,omitempty"` - BytesPt []byte `protobuf:"bytes,17,opt,name=BytesPt,proto3" json:"BytesPt,omitempty"` - TimePt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=TimePt,proto3" json:"TimePt,omitempty"` - DurationPt *durationpb.Duration `protobuf:"bytes,19,opt,name=DurationPt,proto3" json:"DurationPt,omitempty"` - EmptyPt *EmptyStruct `protobuf:"bytes,20,opt,name=EmptyPt,proto3" json:"EmptyPt,omitempty"` + Int8Pt int32 `protobuf:"zigzag32,1,opt,name=int8_pt,json=Int8Pt,proto3" json:"int8_pt,omitempty"` + Int16Pt int32 `protobuf:"zigzag32,2,opt,name=int16_pt,json=Int16Pt,proto3" json:"int16_pt,omitempty"` + Int32Pt int32 `protobuf:"zigzag32,3,opt,name=int32_pt,json=Int32Pt,proto3" json:"int32_pt,omitempty"` + Int32FixedPt int32 `protobuf:"fixed32,4,opt,name=int32_fixed_pt,json=Int32FixedPt,proto3" json:"int32_fixed_pt,omitempty"` + Int64Pt int64 `protobuf:"zigzag64,5,opt,name=int64_pt,json=Int64Pt,proto3" json:"int64_pt,omitempty"` + Int64FixedPt int64 `protobuf:"fixed64,6,opt,name=int64_fixed_pt,json=Int64FixedPt,proto3" json:"int64_fixed_pt,omitempty"` + IntPt int64 `protobuf:"zigzag64,7,opt,name=int_pt,json=IntPt,proto3" json:"int_pt,omitempty"` + BytePt uint32 `protobuf:"varint,8,opt,name=byte_pt,json=BytePt,proto3" json:"byte_pt,omitempty"` + Uint8Pt uint32 `protobuf:"varint,9,opt,name=uint8_pt,json=Uint8Pt,proto3" json:"uint8_pt,omitempty"` + Uint16Pt uint32 `protobuf:"varint,10,opt,name=uint16_pt,json=Uint16Pt,proto3" json:"uint16_pt,omitempty"` + Uint32Pt uint32 `protobuf:"varint,11,opt,name=uint32_pt,json=Uint32Pt,proto3" json:"uint32_pt,omitempty"` + Uint32FixedPt uint32 `protobuf:"fixed32,12,opt,name=uint32_fixed_pt,json=Uint32FixedPt,proto3" json:"uint32_fixed_pt,omitempty"` + Uint64Pt uint64 `protobuf:"varint,13,opt,name=uint64_pt,json=Uint64Pt,proto3" json:"uint64_pt,omitempty"` + Uint64FixedPt uint64 `protobuf:"fixed64,14,opt,name=uint64_fixed_pt,json=Uint64FixedPt,proto3" json:"uint64_fixed_pt,omitempty"` + UintPt uint64 `protobuf:"varint,15,opt,name=uint_pt,json=UintPt,proto3" json:"uint_pt,omitempty"` + StrPt string `protobuf:"bytes,16,opt,name=str_pt,json=StrPt,proto3" json:"str_pt,omitempty"` + BytesPt []byte `protobuf:"bytes,17,opt,name=bytes_pt,json=BytesPt,proto3" json:"bytes_pt,omitempty"` + TimePt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=time_pt,json=TimePt,proto3" json:"time_pt,omitempty"` + DurationPt *durationpb.Duration `protobuf:"bytes,19,opt,name=duration_pt,json=DurationPt,proto3" json:"duration_pt,omitempty"` + EmptyPt *EmptyStruct `protobuf:"bytes,20,opt,name=empty_pt,json=EmptyPt,proto3" json:"empty_pt,omitempty"` } func (x *PointersStruct) Reset() { @@ -1316,26 +1316,26 @@ type PointerSlicesStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Int8PtSl []int32 `protobuf:"zigzag32,1,rep,packed,name=Int8PtSl,proto3" json:"Int8PtSl,omitempty"` - Int16PtSl []int32 `protobuf:"zigzag32,2,rep,packed,name=Int16PtSl,proto3" json:"Int16PtSl,omitempty"` - Int32PtSl []int32 `protobuf:"zigzag32,3,rep,packed,name=Int32PtSl,proto3" json:"Int32PtSl,omitempty"` - Int32FixedPtSl []int32 `protobuf:"fixed32,4,rep,packed,name=Int32FixedPtSl,proto3" json:"Int32FixedPtSl,omitempty"` - Int64PtSl []int64 `protobuf:"zigzag64,5,rep,packed,name=Int64PtSl,proto3" json:"Int64PtSl,omitempty"` - Int64FixedPtSl []int64 `protobuf:"fixed64,6,rep,packed,name=Int64FixedPtSl,proto3" json:"Int64FixedPtSl,omitempty"` - IntPtSl []int64 `protobuf:"zigzag64,7,rep,packed,name=IntPtSl,proto3" json:"IntPtSl,omitempty"` - BytePtSl []byte `protobuf:"bytes,8,opt,name=BytePtSl,proto3" json:"BytePtSl,omitempty"` - Uint8PtSl []byte `protobuf:"bytes,9,opt,name=Uint8PtSl,proto3" json:"Uint8PtSl,omitempty"` - Uint16PtSl []uint32 `protobuf:"varint,10,rep,packed,name=Uint16PtSl,proto3" json:"Uint16PtSl,omitempty"` - Uint32PtSl []uint32 `protobuf:"varint,11,rep,packed,name=Uint32PtSl,proto3" json:"Uint32PtSl,omitempty"` - Uint32FixedPtSl []uint32 `protobuf:"fixed32,12,rep,packed,name=Uint32FixedPtSl,proto3" json:"Uint32FixedPtSl,omitempty"` - Uint64PtSl []uint64 `protobuf:"varint,13,rep,packed,name=Uint64PtSl,proto3" json:"Uint64PtSl,omitempty"` - Uint64FixedPtSl []uint64 `protobuf:"fixed64,14,rep,packed,name=Uint64FixedPtSl,proto3" json:"Uint64FixedPtSl,omitempty"` - UintPtSl []uint64 `protobuf:"varint,15,rep,packed,name=UintPtSl,proto3" json:"UintPtSl,omitempty"` - StrPtSl []string `protobuf:"bytes,16,rep,name=StrPtSl,proto3" json:"StrPtSl,omitempty"` - BytesPtSl [][]byte `protobuf:"bytes,17,rep,name=BytesPtSl,proto3" json:"BytesPtSl,omitempty"` - TimePtSl []*timestamppb.Timestamp `protobuf:"bytes,18,rep,name=TimePtSl,proto3" json:"TimePtSl,omitempty"` - DurationPtSl []*durationpb.Duration `protobuf:"bytes,19,rep,name=DurationPtSl,proto3" json:"DurationPtSl,omitempty"` - EmptyPtSl []*EmptyStruct `protobuf:"bytes,20,rep,name=EmptyPtSl,proto3" json:"EmptyPtSl,omitempty"` + Int8PtSl []int32 `protobuf:"zigzag32,1,rep,packed,name=int8_pt_sl,json=Int8PtSl,proto3" json:"int8_pt_sl,omitempty"` + Int16PtSl []int32 `protobuf:"zigzag32,2,rep,packed,name=int16_pt_sl,json=Int16PtSl,proto3" json:"int16_pt_sl,omitempty"` + Int32PtSl []int32 `protobuf:"zigzag32,3,rep,packed,name=int32_pt_sl,json=Int32PtSl,proto3" json:"int32_pt_sl,omitempty"` + Int32FixedPtSl []int32 `protobuf:"fixed32,4,rep,packed,name=int32_fixed_pt_sl,json=Int32FixedPtSl,proto3" json:"int32_fixed_pt_sl,omitempty"` + Int64PtSl []int64 `protobuf:"zigzag64,5,rep,packed,name=int64_pt_sl,json=Int64PtSl,proto3" json:"int64_pt_sl,omitempty"` + Int64FixedPtSl []int64 `protobuf:"fixed64,6,rep,packed,name=int64_fixed_pt_sl,json=Int64FixedPtSl,proto3" json:"int64_fixed_pt_sl,omitempty"` + IntPtSl []int64 `protobuf:"zigzag64,7,rep,packed,name=int_pt_sl,json=IntPtSl,proto3" json:"int_pt_sl,omitempty"` + BytePtSl []byte `protobuf:"bytes,8,opt,name=byte_pt_sl,json=BytePtSl,proto3" json:"byte_pt_sl,omitempty"` + Uint8PtSl []byte `protobuf:"bytes,9,opt,name=uint8_pt_sl,json=Uint8PtSl,proto3" json:"uint8_pt_sl,omitempty"` + Uint16PtSl []uint32 `protobuf:"varint,10,rep,packed,name=uint16_pt_sl,json=Uint16PtSl,proto3" json:"uint16_pt_sl,omitempty"` + Uint32PtSl []uint32 `protobuf:"varint,11,rep,packed,name=uint32_pt_sl,json=Uint32PtSl,proto3" json:"uint32_pt_sl,omitempty"` + Uint32FixedPtSl []uint32 `protobuf:"fixed32,12,rep,packed,name=uint32_fixed_pt_sl,json=Uint32FixedPtSl,proto3" json:"uint32_fixed_pt_sl,omitempty"` + Uint64PtSl []uint64 `protobuf:"varint,13,rep,packed,name=uint64_pt_sl,json=Uint64PtSl,proto3" json:"uint64_pt_sl,omitempty"` + Uint64FixedPtSl []uint64 `protobuf:"fixed64,14,rep,packed,name=uint64_fixed_pt_sl,json=Uint64FixedPtSl,proto3" json:"uint64_fixed_pt_sl,omitempty"` + UintPtSl []uint64 `protobuf:"varint,15,rep,packed,name=uint_pt_sl,json=UintPtSl,proto3" json:"uint_pt_sl,omitempty"` + StrPtSl []string `protobuf:"bytes,16,rep,name=str_pt_sl,json=StrPtSl,proto3" json:"str_pt_sl,omitempty"` + BytesPtSl [][]byte `protobuf:"bytes,17,rep,name=bytes_pt_sl,json=BytesPtSl,proto3" json:"bytes_pt_sl,omitempty"` + TimePtSl []*timestamppb.Timestamp `protobuf:"bytes,18,rep,name=time_pt_sl,json=TimePtSl,proto3" json:"time_pt_sl,omitempty"` + DurationPtSl []*durationpb.Duration `protobuf:"bytes,19,rep,name=duration_pt_sl,json=DurationPtSl,proto3" json:"duration_pt_sl,omitempty"` + EmptyPtSl []*EmptyStruct `protobuf:"bytes,20,rep,name=empty_pt_sl,json=EmptyPtSl,proto3" json:"empty_pt_sl,omitempty"` } func (x *PointerSlicesStruct) Reset() { @@ -1515,10 +1515,10 @@ type ComplexSt struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PrField *PrimitivesStruct `protobuf:"bytes,1,opt,name=PrField,proto3" json:"PrField,omitempty"` - ArField *ArraysStruct `protobuf:"bytes,2,opt,name=ArField,proto3" json:"ArField,omitempty"` - SlField *SlicesStruct `protobuf:"bytes,3,opt,name=SlField,proto3" json:"SlField,omitempty"` - PtField *PointersStruct `protobuf:"bytes,4,opt,name=PtField,proto3" json:"PtField,omitempty"` + PrField *PrimitivesStruct `protobuf:"bytes,1,opt,name=pr_field,json=PrField,proto3" json:"pr_field,omitempty"` + ArField *ArraysStruct `protobuf:"bytes,2,opt,name=ar_field,json=ArField,proto3" json:"ar_field,omitempty"` + SlField *SlicesStruct `protobuf:"bytes,3,opt,name=sl_field,json=SlField,proto3" json:"sl_field,omitempty"` + PtField *PointersStruct `protobuf:"bytes,4,opt,name=pt_field,json=PtField,proto3" json:"pt_field,omitempty"` } func (x *ComplexSt) Reset() { @@ -1586,7 +1586,7 @@ type EmbeddedSt1 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,1,opt,name=PrimitivesStruct,proto3" json:"PrimitivesStruct,omitempty"` + PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,1,opt,name=primitives_struct,json=PrimitivesStruct,proto3" json:"primitives_struct,omitempty"` } func (x *EmbeddedSt1) Reset() { @@ -1633,10 +1633,10 @@ type EmbeddedSt2 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,1,opt,name=PrimitivesStruct,proto3" json:"PrimitivesStruct,omitempty"` - ArraysStruct *ArraysStruct `protobuf:"bytes,2,opt,name=ArraysStruct,proto3" json:"ArraysStruct,omitempty"` - SlicesStruct *SlicesStruct `protobuf:"bytes,3,opt,name=SlicesStruct,proto3" json:"SlicesStruct,omitempty"` - PointersStruct *PointersStruct `protobuf:"bytes,4,opt,name=PointersStruct,proto3" json:"PointersStruct,omitempty"` + PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,1,opt,name=primitives_struct,json=PrimitivesStruct,proto3" json:"primitives_struct,omitempty"` + ArraysStruct *ArraysStruct `protobuf:"bytes,2,opt,name=arrays_struct,json=ArraysStruct,proto3" json:"arrays_struct,omitempty"` + SlicesStruct *SlicesStruct `protobuf:"bytes,3,opt,name=slices_struct,json=SlicesStruct,proto3" json:"slices_struct,omitempty"` + PointersStruct *PointersStruct `protobuf:"bytes,4,opt,name=pointers_struct,json=PointersStruct,proto3" json:"pointers_struct,omitempty"` } func (x *EmbeddedSt2) Reset() { @@ -1704,11 +1704,11 @@ type EmbeddedSt3 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,1,opt,name=PrimitivesStruct,proto3" json:"PrimitivesStruct,omitempty"` - ArraysStruct *ArraysStruct `protobuf:"bytes,2,opt,name=ArraysStruct,proto3" json:"ArraysStruct,omitempty"` - SlicesStruct *SlicesStruct `protobuf:"bytes,3,opt,name=SlicesStruct,proto3" json:"SlicesStruct,omitempty"` - PointersStruct *PointersStruct `protobuf:"bytes,4,opt,name=PointersStruct,proto3" json:"PointersStruct,omitempty"` - EmptyStruct *EmptyStruct `protobuf:"bytes,5,opt,name=EmptyStruct,proto3" json:"EmptyStruct,omitempty"` + PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,1,opt,name=primitives_struct,json=PrimitivesStruct,proto3" json:"primitives_struct,omitempty"` + ArraysStruct *ArraysStruct `protobuf:"bytes,2,opt,name=arrays_struct,json=ArraysStruct,proto3" json:"arrays_struct,omitempty"` + SlicesStruct *SlicesStruct `protobuf:"bytes,3,opt,name=slices_struct,json=SlicesStruct,proto3" json:"slices_struct,omitempty"` + PointersStruct *PointersStruct `protobuf:"bytes,4,opt,name=pointers_struct,json=PointersStruct,proto3" json:"pointers_struct,omitempty"` + EmptyStruct *EmptyStruct `protobuf:"bytes,5,opt,name=empty_struct,json=EmptyStruct,proto3" json:"empty_struct,omitempty"` } func (x *EmbeddedSt3) Reset() { @@ -1783,15 +1783,15 @@ type EmbeddedSt4 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Foo1 int64 `protobuf:"zigzag64,1,opt,name=Foo1,proto3" json:"Foo1,omitempty"` - PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,2,opt,name=PrimitivesStruct,proto3" json:"PrimitivesStruct,omitempty"` - Foo2 string `protobuf:"bytes,3,opt,name=Foo2,proto3" json:"Foo2,omitempty"` - ArraysStructField *ArraysStruct `protobuf:"bytes,4,opt,name=ArraysStructField,proto3" json:"ArraysStructField,omitempty"` - Foo3 []byte `protobuf:"bytes,5,opt,name=Foo3,proto3" json:"Foo3,omitempty"` - SlicesStruct *SlicesStruct `protobuf:"bytes,6,opt,name=SlicesStruct,proto3" json:"SlicesStruct,omitempty"` - Foo4 bool `protobuf:"varint,7,opt,name=Foo4,proto3" json:"Foo4,omitempty"` - PointersStructField *PointersStruct `protobuf:"bytes,8,opt,name=PointersStructField,proto3" json:"PointersStructField,omitempty"` - Foo5 uint64 `protobuf:"varint,9,opt,name=Foo5,proto3" json:"Foo5,omitempty"` + Foo1 int64 `protobuf:"zigzag64,1,opt,name=foo1,json=Foo1,proto3" json:"foo1,omitempty"` + PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,2,opt,name=primitives_struct,json=PrimitivesStruct,proto3" json:"primitives_struct,omitempty"` + Foo2 string `protobuf:"bytes,3,opt,name=foo2,json=Foo2,proto3" json:"foo2,omitempty"` + ArraysStructField *ArraysStruct `protobuf:"bytes,4,opt,name=arrays_struct_field,json=ArraysStructField,proto3" json:"arrays_struct_field,omitempty"` + Foo3 []byte `protobuf:"bytes,5,opt,name=foo3,json=Foo3,proto3" json:"foo3,omitempty"` + SlicesStruct *SlicesStruct `protobuf:"bytes,6,opt,name=slices_struct,json=SlicesStruct,proto3" json:"slices_struct,omitempty"` + Foo4 bool `protobuf:"varint,7,opt,name=foo4,json=Foo4,proto3" json:"foo4,omitempty"` + PointersStructField *PointersStruct `protobuf:"bytes,8,opt,name=pointers_struct_field,json=PointersStructField,proto3" json:"pointers_struct_field,omitempty"` + Foo5 uint64 `protobuf:"varint,9,opt,name=foo5,json=Foo5,proto3" json:"foo5,omitempty"` } func (x *EmbeddedSt4) Reset() { @@ -1894,15 +1894,15 @@ type EmbeddedSt5NameOverride struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Foo1 int64 `protobuf:"zigzag64,1,opt,name=Foo1,proto3" json:"Foo1,omitempty"` - PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,2,opt,name=PrimitivesStruct,proto3" json:"PrimitivesStruct,omitempty"` - Foo2 string `protobuf:"bytes,3,opt,name=Foo2,proto3" json:"Foo2,omitempty"` - ArraysStructField *ArraysStruct `protobuf:"bytes,4,opt,name=ArraysStructField,proto3" json:"ArraysStructField,omitempty"` - Foo3 []byte `protobuf:"bytes,5,opt,name=Foo3,proto3" json:"Foo3,omitempty"` - SlicesStruct *SlicesStruct `protobuf:"bytes,6,opt,name=SlicesStruct,proto3" json:"SlicesStruct,omitempty"` - Foo4 bool `protobuf:"varint,7,opt,name=Foo4,proto3" json:"Foo4,omitempty"` - PointersStructField *PointersStruct `protobuf:"bytes,8,opt,name=PointersStructField,proto3" json:"PointersStructField,omitempty"` - Foo5 uint64 `protobuf:"varint,9,opt,name=Foo5,proto3" json:"Foo5,omitempty"` + Foo1 int64 `protobuf:"zigzag64,1,opt,name=foo1,json=Foo1,proto3" json:"foo1,omitempty"` + PrimitivesStruct *PrimitivesStruct `protobuf:"bytes,2,opt,name=primitives_struct,json=PrimitivesStruct,proto3" json:"primitives_struct,omitempty"` + Foo2 string `protobuf:"bytes,3,opt,name=foo2,json=Foo2,proto3" json:"foo2,omitempty"` + ArraysStructField *ArraysStruct `protobuf:"bytes,4,opt,name=arrays_struct_field,json=ArraysStructField,proto3" json:"arrays_struct_field,omitempty"` + Foo3 []byte `protobuf:"bytes,5,opt,name=foo3,json=Foo3,proto3" json:"foo3,omitempty"` + SlicesStruct *SlicesStruct `protobuf:"bytes,6,opt,name=slices_struct,json=SlicesStruct,proto3" json:"slices_struct,omitempty"` + Foo4 bool `protobuf:"varint,7,opt,name=foo4,json=Foo4,proto3" json:"foo4,omitempty"` + PointersStructField *PointersStruct `protobuf:"bytes,8,opt,name=pointers_struct_field,json=PointersStructField,proto3" json:"pointers_struct_field,omitempty"` + Foo5 uint64 `protobuf:"varint,9,opt,name=foo5,json=Foo5,proto3" json:"foo5,omitempty"` } func (x *EmbeddedSt5NameOverride) Reset() { @@ -2005,8 +2005,8 @@ type AminoMarshalerStruct1 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - C int64 `protobuf:"zigzag64,1,opt,name=C,proto3" json:"C,omitempty"` - D int64 `protobuf:"zigzag64,2,opt,name=D,proto3" json:"D,omitempty"` + C int64 `protobuf:"zigzag64,1,opt,name=c,json=C,proto3" json:"c,omitempty"` + D int64 `protobuf:"zigzag64,2,opt,name=d,json=D,proto3" json:"d,omitempty"` } func (x *AminoMarshalerStruct1) Reset() { @@ -2060,8 +2060,8 @@ type ReprStruct1 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - C int64 `protobuf:"zigzag64,1,opt,name=C,proto3" json:"C,omitempty"` - D int64 `protobuf:"zigzag64,2,opt,name=D,proto3" json:"D,omitempty"` + C int64 `protobuf:"zigzag64,1,opt,name=c,json=C,proto3" json:"c,omitempty"` + D int64 `protobuf:"zigzag64,2,opt,name=d,json=D,proto3" json:"d,omitempty"` } func (x *ReprStruct1) Reset() { @@ -2115,7 +2115,7 @@ type AminoMarshalerStruct2 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []*ReprElem2 `protobuf:"bytes,1,rep,name=Value,proto3" json:"Value,omitempty"` + Value []*ReprElem2 `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` } func (x *AminoMarshalerStruct2) Reset() { @@ -2162,8 +2162,8 @@ type ReprElem2 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=Key,proto3" json:"Key,omitempty"` - Value *anypb.Any `protobuf:"bytes,2,opt,name=Value,proto3" json:"Value,omitempty"` + Key string `protobuf:"bytes,1,opt,name=key,json=Key,proto3" json:"key,omitempty"` + Value *anypb.Any `protobuf:"bytes,2,opt,name=value,json=Value,proto3" json:"value,omitempty"` } func (x *ReprElem2) Reset() { @@ -2217,7 +2217,7 @@ type AminoMarshalerStruct3 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value int32 `protobuf:"zigzag32,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value int32 `protobuf:"zigzag32,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *AminoMarshalerStruct3) Reset() { @@ -2264,7 +2264,7 @@ type AminoMarshalerInt4 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - A int32 `protobuf:"zigzag32,1,opt,name=A,proto3" json:"A,omitempty"` + A int32 `protobuf:"zigzag32,1,opt,name=a,json=A,proto3" json:"a,omitempty"` } func (x *AminoMarshalerInt4) Reset() { @@ -2311,7 +2311,7 @@ type AminoMarshalerInt5 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value string `protobuf:"bytes,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *AminoMarshalerInt5) Reset() { @@ -2358,7 +2358,7 @@ type AminoMarshalerStruct6 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []*AminoMarshalerStruct1 `protobuf:"bytes,1,rep,name=Value,proto3" json:"Value,omitempty"` + Value []*AminoMarshalerStruct1 `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` } func (x *AminoMarshalerStruct6) Reset() { @@ -2405,7 +2405,7 @@ type AminoMarshalerStruct7 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []byte `protobuf:"bytes,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *AminoMarshalerStruct7) Reset() { @@ -2452,7 +2452,7 @@ type ReprElem7 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value uint32 `protobuf:"varint,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *ReprElem7) Reset() { @@ -2499,7 +2499,7 @@ type IntDef struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value int64 `protobuf:"zigzag64,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value int64 `protobuf:"zigzag64,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *IntDef) Reset() { @@ -2546,7 +2546,7 @@ type IntAr struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []int64 `protobuf:"zigzag64,1,rep,packed,name=Value,proto3" json:"Value,omitempty"` + Value []int64 `protobuf:"zigzag64,1,rep,packed,name=value,proto3" json:"value,omitempty"` } func (x *IntAr) Reset() { @@ -2593,7 +2593,7 @@ type IntSl struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []int64 `protobuf:"zigzag64,1,rep,packed,name=Value,proto3" json:"Value,omitempty"` + Value []int64 `protobuf:"zigzag64,1,rep,packed,name=value,proto3" json:"value,omitempty"` } func (x *IntSl) Reset() { @@ -2640,7 +2640,7 @@ type ByteAr struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []byte `protobuf:"bytes,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *ByteAr) Reset() { @@ -2687,7 +2687,7 @@ type ByteSl struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []byte `protobuf:"bytes,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *ByteSl) Reset() { @@ -2734,26 +2734,26 @@ type PrimitivesStructDef struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Int8 int32 `protobuf:"zigzag32,1,opt,name=Int8,proto3" json:"Int8,omitempty"` - Int16 int32 `protobuf:"zigzag32,2,opt,name=Int16,proto3" json:"Int16,omitempty"` - Int32 int32 `protobuf:"zigzag32,3,opt,name=Int32,proto3" json:"Int32,omitempty"` - Int32Fixed int32 `protobuf:"fixed32,4,opt,name=Int32Fixed,proto3" json:"Int32Fixed,omitempty"` - Int64 int64 `protobuf:"zigzag64,5,opt,name=Int64,proto3" json:"Int64,omitempty"` - Int64Fixed int64 `protobuf:"fixed64,6,opt,name=Int64Fixed,proto3" json:"Int64Fixed,omitempty"` - Int int64 `protobuf:"zigzag64,7,opt,name=Int,proto3" json:"Int,omitempty"` - Byte uint32 `protobuf:"varint,8,opt,name=Byte,proto3" json:"Byte,omitempty"` - Uint8 uint32 `protobuf:"varint,9,opt,name=Uint8,proto3" json:"Uint8,omitempty"` - Uint16 uint32 `protobuf:"varint,10,opt,name=Uint16,proto3" json:"Uint16,omitempty"` - Uint32 uint32 `protobuf:"varint,11,opt,name=Uint32,proto3" json:"Uint32,omitempty"` - Uint32Fixed uint32 `protobuf:"fixed32,12,opt,name=Uint32Fixed,proto3" json:"Uint32Fixed,omitempty"` - Uint64 uint64 `protobuf:"varint,13,opt,name=Uint64,proto3" json:"Uint64,omitempty"` - Uint64Fixed uint64 `protobuf:"fixed64,14,opt,name=Uint64Fixed,proto3" json:"Uint64Fixed,omitempty"` - Uint uint64 `protobuf:"varint,15,opt,name=Uint,proto3" json:"Uint,omitempty"` - Str string `protobuf:"bytes,16,opt,name=Str,proto3" json:"Str,omitempty"` - Bytes []byte `protobuf:"bytes,17,opt,name=Bytes,proto3" json:"Bytes,omitempty"` - Time *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=Time,proto3" json:"Time,omitempty"` - Duration *durationpb.Duration `protobuf:"bytes,19,opt,name=Duration,proto3" json:"Duration,omitempty"` - Empty *EmptyStruct `protobuf:"bytes,20,opt,name=Empty,proto3" json:"Empty,omitempty"` + Int8 int32 `protobuf:"zigzag32,1,opt,name=int8,json=Int8,proto3" json:"int8,omitempty"` + Int16 int32 `protobuf:"zigzag32,2,opt,name=int16,json=Int16,proto3" json:"int16,omitempty"` + Int32 int32 `protobuf:"zigzag32,3,opt,name=int32,json=Int32,proto3" json:"int32,omitempty"` + Int32Fixed int32 `protobuf:"fixed32,4,opt,name=int32_fixed,json=Int32Fixed,proto3" json:"int32_fixed,omitempty"` + Int64 int64 `protobuf:"zigzag64,5,opt,name=int64,json=Int64,proto3" json:"int64,omitempty"` + Int64Fixed int64 `protobuf:"fixed64,6,opt,name=int64_fixed,json=Int64Fixed,proto3" json:"int64_fixed,omitempty"` + Int int64 `protobuf:"zigzag64,7,opt,name=int,json=Int,proto3" json:"int,omitempty"` + Byte uint32 `protobuf:"varint,8,opt,name=byte,json=Byte,proto3" json:"byte,omitempty"` + Uint8 uint32 `protobuf:"varint,9,opt,name=uint8,json=Uint8,proto3" json:"uint8,omitempty"` + Uint16 uint32 `protobuf:"varint,10,opt,name=uint16,json=Uint16,proto3" json:"uint16,omitempty"` + Uint32 uint32 `protobuf:"varint,11,opt,name=uint32,json=Uint32,proto3" json:"uint32,omitempty"` + Uint32Fixed uint32 `protobuf:"fixed32,12,opt,name=uint32_fixed,json=Uint32Fixed,proto3" json:"uint32_fixed,omitempty"` + Uint64 uint64 `protobuf:"varint,13,opt,name=uint64,json=Uint64,proto3" json:"uint64,omitempty"` + Uint64Fixed uint64 `protobuf:"fixed64,14,opt,name=uint64_fixed,json=Uint64Fixed,proto3" json:"uint64_fixed,omitempty"` + Uint uint64 `protobuf:"varint,15,opt,name=uint,json=Uint,proto3" json:"uint,omitempty"` + Str string `protobuf:"bytes,16,opt,name=str,json=Str,proto3" json:"str,omitempty"` + Bytes []byte `protobuf:"bytes,17,opt,name=bytes,json=Bytes,proto3" json:"bytes,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=time,json=Time,proto3" json:"time,omitempty"` + Duration *durationpb.Duration `protobuf:"bytes,19,opt,name=duration,json=Duration,proto3" json:"duration,omitempty"` + Empty *EmptyStruct `protobuf:"bytes,20,opt,name=empty,json=Empty,proto3" json:"empty,omitempty"` } func (x *PrimitivesStructDef) Reset() { @@ -2933,7 +2933,7 @@ type PrimitivesStructSl struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []*PrimitivesStruct `protobuf:"bytes,1,rep,name=Value,proto3" json:"Value,omitempty"` + Value []*PrimitivesStruct `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` } func (x *PrimitivesStructSl) Reset() { @@ -2980,7 +2980,7 @@ type PrimitivesStructAr struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []*PrimitivesStruct `protobuf:"bytes,1,rep,name=Value,proto3" json:"Value,omitempty"` + Value []*PrimitivesStruct `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` } func (x *PrimitivesStructAr) Reset() { @@ -3103,7 +3103,7 @@ type ConcreteTypeDef struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []byte `protobuf:"bytes,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *ConcreteTypeDef) Reset() { @@ -3150,7 +3150,7 @@ type ConcreteWrappedBytes struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value []byte `protobuf:"bytes,1,opt,name=Value,proto3" json:"Value,omitempty"` + Value []byte `protobuf:"bytes,1,opt,name=value,json=Value,proto3" json:"value,omitempty"` } func (x *ConcreteWrappedBytes) Reset() { @@ -3197,10 +3197,10 @@ type InterfaceFieldsStruct struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - F1 *anypb.Any `protobuf:"bytes,1,opt,name=F1,proto3" json:"F1,omitempty"` - F2 *anypb.Any `protobuf:"bytes,2,opt,name=F2,proto3" json:"F2,omitempty"` - F3 *anypb.Any `protobuf:"bytes,3,opt,name=F3,proto3" json:"F3,omitempty"` - F4 *anypb.Any `protobuf:"bytes,4,opt,name=F4,proto3" json:"F4,omitempty"` + F1 *anypb.Any `protobuf:"bytes,1,opt,name=f1,json=F1,proto3" json:"f1,omitempty"` + F2 *anypb.Any `protobuf:"bytes,2,opt,name=f2,json=F2,proto3" json:"f2,omitempty"` + F3 *anypb.Any `protobuf:"bytes,3,opt,name=f3,json=F3,proto3" json:"f3,omitempty"` + F4 *anypb.Any `protobuf:"bytes,4,opt,name=f4,json=F4,proto3" json:"f4,omitempty"` } func (x *InterfaceFieldsStruct) Reset() { @@ -4073,575 +4073,590 @@ var file_tests_proto_rawDesc = []byte{ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0d, 0x0a, 0x0b, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, - 0xbd, 0x04, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x6e, 0x74, 0x38, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x11, 0x52, 0x04, 0x49, 0x6e, 0x74, 0x38, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x31, + 0xc1, 0x04, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x74, 0x38, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x11, 0x52, 0x04, 0x49, 0x6e, 0x74, 0x38, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x12, 0x14, - 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x49, - 0x6e, 0x74, 0x33, 0x32, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0a, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, - 0x69, 0x78, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x12, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, - 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0a, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x49, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x12, 0x52, 0x03, 0x49, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x42, 0x79, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x42, 0x79, 0x74, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x12, 0x16, - 0x0a, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x20, 0x0a, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0b, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x69, 0x6e, 0x74, - 0x36, 0x34, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x12, 0x20, 0x0a, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, - 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x69, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x55, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x53, 0x74, 0x72, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x53, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, - 0x0a, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x82, 0x01, 0x0a, 0x11, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x06, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x72, 0x22, 0x89, 0x05, 0x0a, 0x0c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x11, 0x52, 0x06, 0x49, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x11, 0x52, 0x07, - 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x41, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x11, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, - 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, - 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x0c, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x41, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x12, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x12, - 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x10, 0x52, 0x0c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, - 0x64, 0x41, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x41, 0x72, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x12, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x41, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x79, 0x74, - 0x65, 0x41, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x42, 0x79, 0x74, 0x65, 0x41, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x55, - 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x55, - 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x41, 0x72, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x41, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, - 0x65, 0x64, 0x41, 0x72, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x07, 0x52, 0x0d, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x69, 0x6e, - 0x74, 0x36, 0x34, 0x41, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x55, 0x69, 0x6e, - 0x74, 0x36, 0x34, 0x41, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, - 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x06, 0x52, 0x0d, 0x55, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x55, - 0x69, 0x6e, 0x74, 0x41, 0x72, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x04, 0x52, 0x06, 0x55, 0x69, 0x6e, - 0x74, 0x41, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x72, 0x41, 0x72, 0x18, 0x10, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x72, 0x41, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x41, 0x72, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x07, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x41, 0x72, 0x12, 0x32, 0x0a, 0x06, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x18, 0x12, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x06, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x72, 0x12, 0x2c, 0x0a, 0x07, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x18, 0x14, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, - 0x22, 0xaa, 0x09, 0x0a, 0x12, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, - 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x38, 0x41, - 0x72, 0x41, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, + 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0a, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x12, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x1f, 0x0a, 0x0b, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x10, + 0x52, 0x0a, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x12, 0x52, 0x03, 0x49, 0x6e, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x42, 0x79, + 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, + 0x31, 0x36, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, + 0x12, 0x16, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0b, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x55, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x55, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, + 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x53, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x05, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x61, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x12, 0x3a, + 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x72, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x22, 0xa1, 0x05, 0x0a, 0x0c, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x69, + 0x6e, 0x74, 0x38, 0x5f, 0x61, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x11, 0x52, 0x06, 0x49, 0x6e, + 0x74, 0x38, 0x41, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x61, 0x72, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x11, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x12, + 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x61, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x11, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0f, 0x52, 0x0c, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, + 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x61, 0x72, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x12, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x10, 0x52, 0x0c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, + 0x72, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x12, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x41, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x79, 0x74, 0x65, + 0x5f, 0x61, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x42, 0x79, 0x74, 0x65, 0x41, + 0x72, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x61, 0x72, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x12, 0x1b, 0x0a, 0x09, + 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x61, 0x72, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0d, 0x52, + 0x08, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x07, 0x52, + 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x12, 0x1b, + 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x61, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x04, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x75, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x18, 0x0e, + 0x20, 0x03, 0x28, 0x06, 0x52, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, + 0x64, 0x41, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x72, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x04, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x41, 0x72, 0x12, 0x15, 0x0a, 0x06, + 0x73, 0x74, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, + 0x72, 0x41, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x61, 0x72, 0x18, + 0x11, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x07, 0x42, 0x79, 0x74, 0x65, 0x73, 0x41, 0x72, 0x12, 0x33, + 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x61, 0x72, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x54, 0x69, 0x6d, + 0x65, 0x41, 0x72, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x61, 0x72, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x12, + 0x2d, 0x0a, 0x08, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x61, 0x72, 0x18, 0x14, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x22, 0xd6, + 0x09, 0x0a, 0x12, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x61, 0x72, + 0x5f, 0x61, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x38, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x08, 0x49, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x41, 0x72, 0x12, 0x34, 0x0a, 0x09, 0x49, 0x6e, - 0x74, 0x31, 0x36, 0x41, 0x72, 0x41, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x31, - 0x36, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x41, 0x72, - 0x12, 0x39, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x41, 0x72, 0x18, 0x03, 0x20, + 0x52, 0x08, 0x49, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x41, 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x69, 0x6e, + 0x74, 0x31, 0x36, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, + 0x74, 0x31, 0x36, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, + 0x41, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x61, 0x72, 0x5f, 0x61, + 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, + 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x41, 0x72, 0x12, + 0x4d, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x61, + 0x72, 0x5f, 0x61, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, + 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0e, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, 0x12, 0x3b, + 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, - 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x09, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x41, 0x72, 0x12, 0x4a, 0x0a, 0x0e, 0x49, - 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, - 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, 0x12, 0x39, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x36, 0x34, - 0x41, 0x72, 0x41, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, - 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, - 0x41, 0x72, 0x12, 0x4a, 0x0a, 0x0e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, - 0x41, 0x72, 0x41, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, - 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0e, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, 0x12, 0x35, - 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x41, 0x72, 0x41, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, - 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x49, 0x6e, - 0x74, 0x41, 0x72, 0x41, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x79, 0x74, 0x65, 0x41, 0x72, 0x41, + 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x09, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x41, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, + 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x49, 0x6e, 0x74, 0x36, + 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x36, + 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, 0x12, 0x37, 0x0a, 0x09, 0x69, 0x6e, + 0x74, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x36, + 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x41, + 0x72, 0x41, 0x72, 0x12, 0x1c, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x79, 0x74, 0x65, 0x41, 0x72, 0x41, - 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x41, 0x72, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x41, 0x72, 0x12, - 0x37, 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x41, 0x72, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, - 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0a, 0x55, 0x69, - 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x41, 0x72, 0x12, 0x3c, 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x41, 0x72, 0x41, 0x72, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x41, 0x72, 0x41, 0x72, 0x12, 0x4d, 0x0a, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x33, 0x32, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, - 0x64, 0x41, 0x72, 0x41, 0x72, 0x12, 0x3c, 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, - 0x72, 0x41, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, - 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, - 0x72, 0x41, 0x72, 0x12, 0x4d, 0x0a, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, - 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, - 0x36, 0x34, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, - 0x41, 0x72, 0x12, 0x38, 0x0a, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x41, 0x72, 0x41, 0x72, 0x18, 0x0f, + 0x72, 0x12, 0x1e, 0x0a, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x41, + 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x61, 0x72, 0x5f, 0x61, + 0x72, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, + 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x41, 0x72, 0x12, 0x3e, 0x0a, 0x0c, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, + 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x41, 0x72, 0x12, 0x50, 0x0a, 0x12, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x5f, + 0x61, 0x72, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, + 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0f, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, 0x12, 0x3e, + 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x41, 0x72, 0x41, 0x72, 0x12, 0x36, 0x0a, 0x07, - 0x53, 0x74, 0x72, 0x41, 0x72, 0x41, 0x72, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x53, 0x74, 0x72, - 0x41, 0x72, 0x41, 0x72, 0x12, 0x34, 0x0a, 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x41, 0x72, 0x41, - 0x72, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, - 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x41, 0x72, 0x41, 0x72, 0x12, 0x36, 0x0a, 0x08, 0x54, 0x69, - 0x6d, 0x65, 0x41, 0x72, 0x41, 0x72, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x72, - 0x41, 0x72, 0x12, 0x3d, 0x0a, 0x0c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, - 0x41, 0x72, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, - 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x0c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x41, - 0x72, 0x12, 0x3a, 0x0a, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x41, 0x72, 0x18, 0x14, + 0x73, 0x74, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x41, 0x72, 0x12, 0x50, + 0x0a, 0x12, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x61, + 0x72, 0x5f, 0x61, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, + 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, + 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x72, 0x41, 0x72, + 0x12, 0x3a, 0x0a, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, - 0x54, 0x53, 0x5f, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x41, 0x72, 0x22, 0x89, 0x05, - 0x0a, 0x0c, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x49, 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x11, 0x52, 0x06, - 0x49, 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x53, - 0x6c, 0x18, 0x02, 0x20, 0x03, 0x28, 0x11, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, - 0x12, 0x18, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x11, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0f, - 0x52, 0x0c, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x12, 0x18, - 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x18, 0x05, 0x20, 0x03, 0x28, 0x12, 0x52, - 0x07, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x74, 0x36, - 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x18, 0x06, 0x20, 0x03, 0x28, 0x10, 0x52, 0x0c, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x49, 0x6e, 0x74, 0x53, 0x6c, 0x18, 0x07, 0x20, 0x03, 0x28, 0x12, 0x52, 0x05, 0x49, 0x6e, 0x74, - 0x53, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6c, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x06, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x55, 0x69, - 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x55, 0x69, 0x6e, - 0x74, 0x38, 0x53, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, - 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x18, 0x0b, 0x20, 0x03, - 0x28, 0x0d, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x12, 0x24, 0x0a, 0x0d, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x18, 0x0c, 0x20, - 0x03, 0x28, 0x07, 0x52, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, - 0x53, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x12, 0x24, - 0x0a, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x06, 0x52, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, - 0x65, 0x64, 0x53, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x53, 0x6c, 0x18, 0x0f, - 0x20, 0x03, 0x28, 0x04, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x53, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x53, 0x74, 0x72, 0x53, 0x6c, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x72, - 0x53, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x6c, 0x18, 0x11, 0x20, - 0x03, 0x28, 0x0c, 0x52, 0x07, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x6c, 0x12, 0x32, 0x0a, 0x06, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x6c, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x41, 0x72, 0x41, 0x72, 0x12, 0x38, 0x0a, 0x09, + 0x73, 0x74, 0x72, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x53, + 0x74, 0x72, 0x41, 0x72, 0x41, 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, + 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x41, 0x72, 0x41, 0x72, 0x12, 0x38, + 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x12, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, + 0x5f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, + 0x54, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x41, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0c, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x41, 0x72, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x5f, 0x61, 0x72, 0x5f, 0x61, 0x72, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x41, 0x72, 0x41, 0x72, 0x22, 0xa1, 0x05, 0x0a, 0x0c, 0x53, 0x6c, 0x69, 0x63, + 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x6e, 0x74, 0x38, + 0x5f, 0x73, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x11, 0x52, 0x06, 0x49, 0x6e, 0x74, 0x38, 0x53, + 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x73, 0x6c, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x11, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, 0x12, 0x19, 0x0a, 0x08, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x73, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x11, 0x52, 0x07, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0f, 0x52, + 0x0c, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x73, 0x6c, 0x18, 0x05, 0x20, 0x03, 0x28, 0x12, 0x52, + 0x07, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x18, 0x06, 0x20, 0x03, 0x28, 0x10, + 0x52, 0x0c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x12, 0x15, + 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x07, 0x20, 0x03, 0x28, 0x12, 0x52, 0x05, + 0x49, 0x6e, 0x74, 0x53, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x6c, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6c, 0x12, 0x19, + 0x0a, 0x08, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x73, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x69, 0x6e, + 0x74, 0x31, 0x36, 0x5f, 0x73, 0x6c, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x55, 0x69, + 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x73, 0x6c, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x53, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x07, 0x52, 0x0d, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x75, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x73, 0x6c, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, + 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x18, 0x0e, 0x20, 0x03, 0x28, + 0x06, 0x52, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, + 0x12, 0x17, 0x0a, 0x07, 0x75, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x0f, 0x20, 0x03, 0x28, + 0x04, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x53, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x5f, 0x73, 0x6c, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x72, 0x53, 0x6c, + 0x12, 0x19, 0x0a, 0x08, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x6c, 0x18, 0x11, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x07, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x6c, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x6c, - 0x12, 0x39, 0x0a, 0x0a, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x18, 0x13, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x12, 0x2c, 0x0a, 0x07, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x53, 0x6c, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x07, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x6c, 0x22, 0xaa, 0x09, 0x0a, 0x12, 0x53, 0x6c, - 0x69, 0x63, 0x65, 0x73, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x12, 0x31, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, - 0x5f, 0x49, 0x6e, 0x74, 0x38, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x38, 0x53, - 0x6c, 0x53, 0x6c, 0x12, 0x34, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, 0x53, 0x6c, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, - 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, - 0x49, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x39, 0x0a, 0x09, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x4a, 0x0a, 0x0e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, - 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, - 0x33, 0x32, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, - 0x12, 0x39, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, - 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x09, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x4a, 0x0a, 0x0e, 0x49, - 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x06, 0x20, + 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6c, 0x18, + 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x12, 0x2d, 0x0a, 0x08, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x07, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x6c, 0x22, 0xd6, 0x09, 0x0a, 0x12, + 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, + 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x38, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x49, + 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x36, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x31, 0x36, + 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x31, 0x36, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, 0x53, 0x6c, 0x12, + 0x3b, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, + 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x4d, 0x0a, 0x11, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x5f, 0x73, + 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, + 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0e, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3b, 0x0a, 0x0b, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, + 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x49, + 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x4d, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x35, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x53, 0x6c, - 0x53, 0x6c, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, - 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x1a, - 0x0a, 0x08, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0c, - 0x52, 0x08, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x55, 0x69, - 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x55, - 0x69, 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x37, 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, - 0x31, 0x36, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x31, - 0x36, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, 0x53, - 0x6c, 0x12, 0x3c, 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x53, 0x6c, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, - 0x53, 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x53, 0x6c, 0x12, - 0x4d, 0x0a, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, - 0x53, 0x6c, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, - 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x55, 0x49, - 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0f, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3c, - 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x0d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, - 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x4d, 0x0a, 0x0f, - 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, - 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x55, 0x49, 0x6e, 0x74, 0x36, - 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0f, 0x55, 0x69, 0x6e, 0x74, - 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x38, 0x0a, 0x08, 0x55, - 0x69, 0x6e, 0x74, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, - 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x55, 0x69, 0x6e, - 0x74, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x36, 0x0a, 0x07, 0x53, 0x74, 0x72, 0x53, 0x6c, 0x53, 0x6c, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, - 0x45, 0x53, 0x54, 0x53, 0x5f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x53, 0x74, 0x72, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x34, 0x0a, - 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, - 0x6c, 0x53, 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x6c, 0x53, 0x6c, 0x18, - 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, - 0x53, 0x54, 0x53, 0x5f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x08, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3d, 0x0a, 0x0c, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x13, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0c, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3a, 0x0a, 0x09, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x53, 0x6c, 0x53, 0x6c, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x53, 0x6c, 0x53, 0x6c, 0x22, 0x8b, 0x05, 0x0a, 0x0e, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x6e, 0x74, - 0x38, 0x50, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x49, 0x6e, 0x74, 0x38, 0x50, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x50, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x11, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x50, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x49, - 0x6e, 0x74, 0x33, 0x32, 0x50, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x07, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x50, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x50, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0c, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x6e, 0x74, - 0x36, 0x34, 0x50, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x12, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x36, - 0x34, 0x50, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, - 0x64, 0x50, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0c, 0x49, 0x6e, 0x74, 0x36, 0x34, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x50, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x12, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x50, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x42, 0x79, 0x74, 0x65, 0x50, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x42, - 0x79, 0x74, 0x65, 0x50, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x50, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x50, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x50, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x50, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x50, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x50, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0d, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x69, 0x6e, - 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x06, + 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x37, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x73, + 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, + 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x53, 0x6c, 0x53, 0x6c, + 0x12, 0x1c, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x1e, + 0x0a, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x09, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x39, + 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, + 0x54, 0x53, 0x5f, 0x55, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0a, 0x55, + 0x69, 0x6e, 0x74, 0x31, 0x36, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3e, 0x0a, 0x0c, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0a, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x50, 0x0a, 0x12, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, + 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, + 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x55, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0f, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3e, 0x0a, 0x0c, 0x75, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, + 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x50, 0x0a, 0x12, 0x75, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x5f, 0x73, + 0x6c, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, + 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x55, 0x49, 0x6e, + 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0f, 0x55, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3a, 0x0a, + 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x0f, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, + 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x08, 0x55, 0x69, 0x6e, 0x74, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x38, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x53, 0x74, 0x72, 0x53, + 0x6c, 0x53, 0x6c, 0x12, 0x36, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x6c, 0x5f, + 0x73, 0x6c, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, + 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x38, 0x0a, 0x0a, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3f, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x6c, 0x53, 0x6c, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, + 0x73, 0x6c, 0x5f, 0x73, 0x6c, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x73, 0x2e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x53, 0x6c, 0x53, 0x6c, 0x22, 0xa3, 0x05, 0x0a, 0x0e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x6e, 0x74, 0x38, 0x5f, + 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x49, 0x6e, 0x74, 0x38, 0x50, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x11, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x50, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x07, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x50, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0c, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x70, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x12, 0x52, 0x07, + 0x49, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x10, 0x52, + 0x0c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x12, 0x15, 0x0a, + 0x06, 0x69, 0x6e, 0x74, 0x5f, 0x70, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x12, 0x52, 0x05, 0x49, + 0x6e, 0x74, 0x50, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x70, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x42, 0x79, 0x74, 0x65, 0x50, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x70, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x50, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, + 0x31, 0x36, 0x5f, 0x70, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x55, 0x69, 0x6e, + 0x74, 0x31, 0x36, 0x50, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x70, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x50, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x5f, 0x70, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0d, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x70, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x55, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x70, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0d, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x50, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x55, 0x69, 0x6e, 0x74, 0x50, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x72, 0x50, 0x74, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x72, 0x50, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x54, 0x69, 0x6d, 0x65, 0x50, - 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x06, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x50, - 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x50, 0x74, 0x22, 0xe0, 0x05, 0x0a, 0x13, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x49, 0x6e, 0x74, 0x38, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x11, 0x52, 0x08, - 0x49, 0x6e, 0x74, 0x38, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x31, - 0x36, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x02, 0x20, 0x03, 0x28, 0x11, 0x52, 0x09, 0x49, 0x6e, 0x74, - 0x31, 0x36, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x50, - 0x74, 0x53, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x11, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x50, 0x74, 0x53, 0x6c, 0x12, 0x26, 0x0a, 0x0e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, - 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x0e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1c, 0x0a, 0x09, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x05, 0x20, 0x03, 0x28, 0x12, 0x52, - 0x09, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x26, 0x0a, 0x0e, 0x49, 0x6e, - 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x10, 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, - 0x53, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x12, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1a, 0x0a, 0x08, - 0x42, 0x79, 0x74, 0x65, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, - 0x42, 0x79, 0x74, 0x65, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x55, 0x69, 0x6e, 0x74, - 0x38, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x55, 0x69, 0x6e, - 0x74, 0x38, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, - 0x50, 0x74, 0x53, 0x6c, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, - 0x31, 0x36, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x50, 0x74, 0x53, 0x6c, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x07, 0x52, - 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, - 0x12, 0x1e, 0x0a, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x04, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x53, 0x6c, - 0x12, 0x28, 0x0a, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, - 0x74, 0x53, 0x6c, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x06, 0x52, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x69, - 0x6e, 0x74, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x55, 0x69, - 0x6e, 0x74, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x74, 0x72, 0x50, 0x74, 0x53, - 0x6c, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x53, 0x74, 0x72, 0x50, 0x74, 0x53, 0x6c, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x11, 0x20, - 0x03, 0x28, 0x0c, 0x52, 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x36, - 0x0a, 0x08, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x54, 0x69, - 0x6d, 0x65, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x3d, 0x0a, 0x0c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x74, 0x53, 0x6c, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x17, 0x0a, 0x07, 0x75, 0x69, 0x6e, 0x74, 0x5f, 0x70, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x50, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x5f, + 0x70, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x72, 0x50, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x70, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x74, 0x12, + 0x3a, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x74, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0a, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x74, 0x12, 0x2d, 0x0a, 0x08, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x70, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x07, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x50, 0x74, 0x22, 0x8c, 0x06, 0x0a, 0x13, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x11, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x38, 0x50, 0x74, 0x53, 0x6c, + 0x12, 0x1e, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x11, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x50, 0x74, 0x53, 0x6c, + 0x12, 0x1e, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x11, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x50, 0x74, 0x53, 0x6c, + 0x12, 0x29, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, + 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x0e, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1e, 0x0a, 0x0b, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x05, 0x20, 0x03, 0x28, 0x12, + 0x52, 0x09, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x29, 0x0a, 0x11, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x10, 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, + 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1a, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x70, 0x74, + 0x5f, 0x73, 0x6c, 0x18, 0x07, 0x20, 0x03, 0x28, 0x12, 0x52, 0x07, 0x49, 0x6e, 0x74, 0x50, 0x74, + 0x53, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x79, 0x74, 0x65, 0x50, 0x74, 0x53, 0x6c, + 0x12, 0x1e, 0x0a, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x50, 0x74, 0x53, 0x6c, + 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x50, 0x74, + 0x53, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x70, 0x74, 0x5f, + 0x73, 0x6c, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x50, 0x74, 0x53, 0x6c, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x07, + 0x52, 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x53, + 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x70, 0x74, 0x5f, 0x73, + 0x6c, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0a, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x50, + 0x74, 0x53, 0x6c, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x06, 0x52, + 0x0f, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x74, 0x53, 0x6c, + 0x12, 0x1c, 0x0a, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x55, 0x69, 0x6e, 0x74, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1a, + 0x0a, 0x09, 0x73, 0x74, 0x72, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x10, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x53, 0x74, 0x72, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x1e, 0x0a, 0x0b, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x09, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x38, 0x0a, 0x0a, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x54, 0x69, 0x6d, 0x65, + 0x50, 0x74, 0x53, 0x6c, 0x12, 0x3f, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x30, 0x0a, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x50, 0x74, - 0x53, 0x6c, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x50, 0x74, 0x53, 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x78, 0x53, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x50, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, - 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, - 0x07, 0x50, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x41, 0x72, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, - 0x73, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, - 0x41, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x53, 0x6c, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, - 0x2e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x53, - 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x50, 0x74, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, - 0x50, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x52, 0x0a, 0x0b, 0x45, 0x6d, 0x62, 0x65, 0x64, - 0x64, 0x65, 0x64, 0x53, 0x74, 0x31, 0x12, 0x43, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x83, 0x02, 0x0a, 0x0b, - 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x32, 0x12, 0x43, 0x0a, 0x10, 0x50, - 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, - 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, + 0x6e, 0x50, 0x74, 0x53, 0x6c, 0x12, 0x32, 0x0a, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x70, + 0x74, 0x5f, 0x73, 0x6c, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, + 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x50, 0x74, 0x53, 0x6c, 0x22, 0xd1, 0x01, 0x0a, 0x09, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x53, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, + 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x07, 0x50, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2e, 0x0a, 0x08, 0x61, + 0x72, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x07, 0x41, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2e, 0x0a, 0x08, 0x73, + 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x07, 0x53, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x30, 0x0a, 0x08, 0x70, + 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x50, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x53, 0x0a, + 0x0b, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x31, 0x12, 0x44, 0x0a, 0x11, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, + 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x22, 0x87, 0x02, 0x0a, 0x0b, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, + 0x74, 0x32, 0x12, 0x44, 0x0a, 0x11, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x12, 0x38, 0x0a, 0x0d, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, + 0x73, 0x2e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, + 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x0f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0e, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0xbe, 0x02, 0x0a, + 0x0b, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x33, 0x12, 0x44, 0x0a, 0x11, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x12, 0x37, 0x0a, 0x0c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x41, - 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, 0x41, 0x72, 0x72, - 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x53, 0x6c, 0x69, - 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x12, 0x3d, 0x0a, 0x0e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, - 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x0e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x22, 0xb9, 0x02, 0x0a, 0x0b, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, - 0x33, 0x12, 0x43, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, - 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x0c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, - 0x37, 0x0a, 0x0c, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x53, 0x6c, - 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, 0x53, 0x6c, 0x69, 0x63, - 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x3d, 0x0a, 0x0e, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x34, 0x0a, 0x0b, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, + 0x52, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x72, 0x72, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, + 0x73, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x0d, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x53, 0x6c, 0x69, 0x63, + 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x0f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x0c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x0b, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0xfb, 0x02, + 0x52, 0x0b, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x81, 0x03, 0x0a, 0x0b, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x34, 0x12, 0x12, 0x0a, - 0x04, 0x46, 0x6f, 0x6f, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x12, 0x52, 0x04, 0x46, 0x6f, 0x6f, - 0x31, 0x12, 0x43, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, - 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6f, 0x6f, 0x32, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, 0x6f, 0x6f, 0x32, 0x12, 0x41, 0x0a, 0x11, 0x41, 0x72, - 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x41, 0x72, - 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x11, 0x41, 0x72, 0x72, 0x61, - 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x46, 0x6f, 0x6f, 0x33, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x46, 0x6f, 0x6f, - 0x33, 0x12, 0x37, 0x0a, 0x0c, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, - 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, 0x53, 0x6c, - 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6f, - 0x6f, 0x34, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x46, 0x6f, 0x6f, 0x34, 0x12, 0x47, - 0x0a, 0x13, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, - 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x52, 0x13, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6f, 0x6f, 0x35, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x46, 0x6f, 0x6f, 0x35, 0x22, 0x87, 0x03, 0x0a, 0x17, - 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x35, 0x4e, 0x61, 0x6d, 0x65, 0x4f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6f, 0x6f, 0x31, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x12, 0x52, 0x04, 0x46, 0x6f, 0x6f, 0x31, 0x12, 0x43, 0x0a, 0x10, 0x50, - 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, - 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, - 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6f, 0x6f, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x46, 0x6f, 0x6f, 0x32, 0x12, 0x41, 0x0a, 0x11, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x11, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6f, 0x6f, 0x33, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x46, 0x6f, 0x6f, 0x33, 0x12, 0x37, 0x0a, 0x0c, 0x53, - 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0c, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6f, 0x6f, 0x34, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x46, 0x6f, 0x6f, 0x34, 0x12, 0x47, 0x0a, 0x13, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x13, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6f, 0x6f, 0x35, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x04, 0x46, 0x6f, 0x6f, 0x35, 0x22, 0x33, 0x0a, 0x15, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, - 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x31, 0x12, 0x0c, - 0x0a, 0x01, 0x43, 0x18, 0x01, 0x20, 0x01, 0x28, 0x12, 0x52, 0x01, 0x43, 0x12, 0x0c, 0x0a, 0x01, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x12, 0x52, 0x01, 0x44, 0x22, 0x29, 0x0a, 0x0b, 0x52, 0x65, - 0x70, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x31, 0x12, 0x0c, 0x0a, 0x01, 0x43, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x12, 0x52, 0x01, 0x43, 0x12, 0x0c, 0x0a, 0x01, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x12, 0x52, 0x01, 0x44, 0x22, 0x3f, 0x0a, 0x15, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, - 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x32, 0x12, 0x26, - 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x32, 0x52, - 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x49, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x72, 0x45, 0x6c, - 0x65, 0x6d, 0x32, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x2d, 0x0a, 0x15, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x33, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x22, 0x0a, 0x12, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, - 0x65, 0x72, 0x49, 0x6e, 0x74, 0x34, 0x12, 0x0c, 0x0a, 0x01, 0x41, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x11, 0x52, 0x01, 0x41, 0x22, 0x2a, 0x0a, 0x12, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, - 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x35, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x4b, 0x0a, 0x15, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, - 0x65, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x36, 0x12, 0x32, 0x0a, 0x05, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, - 0x2e, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x31, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2d, 0x0a, + 0x04, 0x66, 0x6f, 0x6f, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x12, 0x52, 0x04, 0x46, 0x6f, 0x6f, + 0x31, 0x12, 0x44, 0x0a, 0x11, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x5f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6f, 0x6f, 0x32, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, 0x6f, 0x6f, 0x32, 0x12, 0x43, 0x0a, 0x13, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, + 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x11, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6f, 0x6f, 0x33, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x46, 0x6f, 0x6f, 0x33, 0x12, 0x38, 0x0a, 0x0d, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x73, 0x2e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x0c, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x66, 0x6f, 0x6f, 0x34, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x46, 0x6f, + 0x6f, 0x34, 0x12, 0x49, 0x0a, 0x15, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x13, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x66, 0x6f, 0x6f, 0x35, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x46, 0x6f, 0x6f, + 0x35, 0x22, 0x8d, 0x03, 0x0a, 0x17, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, + 0x35, 0x4e, 0x61, 0x6d, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x66, 0x6f, 0x6f, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x12, 0x52, 0x04, 0x46, 0x6f, 0x6f, + 0x31, 0x12, 0x44, 0x0a, 0x11, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x5f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6f, 0x6f, 0x32, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, 0x6f, 0x6f, 0x32, 0x12, 0x43, 0x0a, 0x13, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, + 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x11, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6f, 0x6f, 0x33, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x46, 0x6f, 0x6f, 0x33, 0x12, 0x38, 0x0a, 0x0d, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x73, 0x2e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x0c, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x66, 0x6f, 0x6f, 0x34, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x46, 0x6f, + 0x6f, 0x34, 0x12, 0x49, 0x0a, 0x15, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x13, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x66, 0x6f, 0x6f, 0x35, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x46, 0x6f, 0x6f, + 0x35, 0x22, 0x33, 0x0a, 0x15, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, + 0x6c, 0x65, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x31, 0x12, 0x0c, 0x0a, 0x01, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x12, 0x52, 0x01, 0x43, 0x12, 0x0c, 0x0a, 0x01, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x12, 0x52, 0x01, 0x44, 0x22, 0x29, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x72, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x31, 0x12, 0x0c, 0x0a, 0x01, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x12, + 0x52, 0x01, 0x43, 0x12, 0x0c, 0x0a, 0x01, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x12, 0x52, 0x01, + 0x44, 0x22, 0x3f, 0x0a, 0x15, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, + 0x6c, 0x65, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x65, 0x73, 0x74, + 0x73, 0x2e, 0x52, 0x65, 0x70, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x32, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x49, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x32, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4b, 0x65, + 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2d, 0x0a, 0x15, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x37, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x21, 0x0a, 0x09, - 0x52, 0x65, 0x70, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x37, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x1e, 0x0a, 0x06, 0x49, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x12, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x1d, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x41, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x12, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1d, - 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x53, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x12, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1e, 0x0a, - 0x06, 0x42, 0x79, 0x74, 0x65, 0x41, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1e, 0x0a, - 0x06, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xc0, 0x04, - 0x0a, 0x13, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x44, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x6e, 0x74, 0x38, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x11, 0x52, 0x04, 0x49, 0x6e, 0x74, 0x38, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x74, - 0x31, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x12, - 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, - 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0a, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x12, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x1e, 0x0a, 0x0a, 0x49, - 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x10, 0x52, - 0x0a, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x49, - 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x12, 0x52, 0x03, 0x49, 0x6e, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x42, 0x79, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x42, 0x79, 0x74, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x31, - 0x36, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x12, - 0x16, 0x0a, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x06, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x20, 0x0a, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0b, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x69, 0x6e, - 0x74, 0x36, 0x34, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x12, 0x20, 0x0a, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x33, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x22, 0x0a, 0x12, + 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x49, 0x6e, + 0x74, 0x34, 0x12, 0x0c, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, 0x01, 0x41, + 0x22, 0x2a, 0x0a, 0x12, 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, + 0x65, 0x72, 0x49, 0x6e, 0x74, 0x35, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4b, 0x0a, 0x15, + 0x41, 0x6d, 0x69, 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x36, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x41, 0x6d, 0x69, + 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x31, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2d, 0x0a, 0x15, 0x41, 0x6d, 0x69, + 0x6e, 0x6f, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x37, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x72, + 0x45, 0x6c, 0x65, 0x6d, 0x37, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1e, 0x0a, 0x06, 0x49, + 0x6e, 0x74, 0x44, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x12, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x49, + 0x6e, 0x74, 0x41, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x12, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x49, 0x6e, + 0x74, 0x53, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x12, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1e, 0x0a, 0x06, 0x42, 0x79, 0x74, + 0x65, 0x41, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1e, 0x0a, 0x06, 0x42, 0x79, 0x74, + 0x65, 0x53, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xc4, 0x04, 0x0a, 0x13, 0x50, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x44, 0x65, + 0x66, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x74, 0x38, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, + 0x04, 0x49, 0x6e, 0x74, 0x38, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0a, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, + 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x12, 0x52, 0x05, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0a, 0x49, + 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x6e, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x12, 0x52, 0x03, 0x49, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, + 0x79, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x42, 0x79, 0x74, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x55, 0x69, 0x6e, 0x74, 0x38, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x12, 0x16, 0x0a, + 0x06, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0b, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x78, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x69, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x04, 0x55, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x53, 0x74, 0x72, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x53, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x79, 0x74, + 0x78, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x55, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x53, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, - 0x2e, 0x0a, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x35, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x18, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x43, 0x0a, 0x12, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x53, 0x6c, 0x12, 0x2d, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x72, 0x75, 0x63, 0x74, 0x53, 0x6c, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x43, 0x0a, 0x12, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x41, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x56, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x43, 0x0a, 0x12, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x41, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x43, 0x6f, + 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x63, 0x72, 0x65, 0x74, 0x65, 0x31, 0x22, 0x0b, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x63, 0x72, 0x65, 0x74, 0x65, 0x32, 0x22, 0x27, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x63, 0x72, 0x65, 0x74, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x44, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, + 0x54, 0x79, 0x70, 0x65, 0x44, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x02, 0x46, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x02, 0x66, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x02, 0x46, 0x31, 0x12, 0x24, 0x0a, 0x02, 0x46, + 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x02, 0x46, 0x31, 0x12, 0x24, 0x0a, 0x02, 0x66, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x02, 0x46, - 0x32, 0x12, 0x24, 0x0a, 0x02, 0x46, 0x33, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x32, 0x12, 0x24, 0x0a, 0x02, 0x66, 0x33, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x41, 0x6e, 0x79, 0x52, 0x02, 0x46, 0x33, 0x12, 0x24, 0x0a, 0x02, 0x46, 0x34, 0x18, 0x04, 0x20, + 0x41, 0x6e, 0x79, 0x52, 0x02, 0x46, 0x33, 0x12, 0x24, 0x0a, 0x02, 0x66, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x02, 0x46, 0x34, 0x22, 0x27, 0x0a, 0x0f, 0x54, 0x45, 0x53, 0x54, 0x53, 0x5f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, @@ -4780,93 +4795,93 @@ var file_tests_proto_goTypes = []interface{}{ (*anypb.Any)(nil), // 57: google.protobuf.Any } var file_tests_proto_depIdxs = []int32{ - 55, // 0: tests.PrimitivesStruct.Time:type_name -> google.protobuf.Timestamp - 56, // 1: tests.PrimitivesStruct.Duration:type_name -> google.protobuf.Duration - 0, // 2: tests.PrimitivesStruct.Empty:type_name -> tests.EmptyStruct - 55, // 3: tests.ShortArraysStruct.TimeAr:type_name -> google.protobuf.Timestamp - 56, // 4: tests.ShortArraysStruct.DurationAr:type_name -> google.protobuf.Duration - 55, // 5: tests.ArraysStruct.TimeAr:type_name -> google.protobuf.Timestamp - 56, // 6: tests.ArraysStruct.DurationAr:type_name -> google.protobuf.Duration - 0, // 7: tests.ArraysStruct.EmptyAr:type_name -> tests.EmptyStruct - 49, // 8: tests.ArraysArraysStruct.Int8ArAr:type_name -> tests.TESTS_Int8List - 46, // 9: tests.ArraysArraysStruct.Int16ArAr:type_name -> tests.TESTS_Int16List - 47, // 10: tests.ArraysArraysStruct.Int32ArAr:type_name -> tests.TESTS_Int32ValueList - 42, // 11: tests.ArraysArraysStruct.Int32FixedArAr:type_name -> tests.TESTS_Fixed32Int32ValueList - 48, // 12: tests.ArraysArraysStruct.Int64ArAr:type_name -> tests.TESTS_Int64ValueList - 44, // 13: tests.ArraysArraysStruct.Int64FixedArAr:type_name -> tests.TESTS_Fixed64Int64ValueList - 48, // 14: tests.ArraysArraysStruct.IntArAr:type_name -> tests.TESTS_Int64ValueList - 52, // 15: tests.ArraysArraysStruct.Uint16ArAr:type_name -> tests.TESTS_UInt16List - 53, // 16: tests.ArraysArraysStruct.Uint32ArAr:type_name -> tests.TESTS_UInt32ValueList - 43, // 17: tests.ArraysArraysStruct.Uint32FixedArAr:type_name -> tests.TESTS_Fixed32UInt32ValueList - 54, // 18: tests.ArraysArraysStruct.Uint64ArAr:type_name -> tests.TESTS_UInt64ValueList - 45, // 19: tests.ArraysArraysStruct.Uint64FixedArAr:type_name -> tests.TESTS_Fixed64UInt64ValueList - 54, // 20: tests.ArraysArraysStruct.UintArAr:type_name -> tests.TESTS_UInt64ValueList - 50, // 21: tests.ArraysArraysStruct.StrArAr:type_name -> tests.TESTS_StringValueList - 38, // 22: tests.ArraysArraysStruct.BytesArAr:type_name -> tests.TESTS_BytesList - 51, // 23: tests.ArraysArraysStruct.TimeArAr:type_name -> tests.TESTS_TimestampList - 40, // 24: tests.ArraysArraysStruct.DurationArAr:type_name -> tests.TESTS_DurationList - 41, // 25: tests.ArraysArraysStruct.EmptyArAr:type_name -> tests.TESTS_EmptyStructList - 55, // 26: tests.SlicesStruct.TimeSl:type_name -> google.protobuf.Timestamp - 56, // 27: tests.SlicesStruct.DurationSl:type_name -> google.protobuf.Duration - 0, // 28: tests.SlicesStruct.EmptySl:type_name -> tests.EmptyStruct - 49, // 29: tests.SlicesSlicesStruct.Int8SlSl:type_name -> tests.TESTS_Int8List - 46, // 30: tests.SlicesSlicesStruct.Int16SlSl:type_name -> tests.TESTS_Int16List - 47, // 31: tests.SlicesSlicesStruct.Int32SlSl:type_name -> tests.TESTS_Int32ValueList - 42, // 32: tests.SlicesSlicesStruct.Int32FixedSlSl:type_name -> tests.TESTS_Fixed32Int32ValueList - 48, // 33: tests.SlicesSlicesStruct.Int64SlSl:type_name -> tests.TESTS_Int64ValueList - 44, // 34: tests.SlicesSlicesStruct.Int64FixedSlSl:type_name -> tests.TESTS_Fixed64Int64ValueList - 48, // 35: tests.SlicesSlicesStruct.IntSlSl:type_name -> tests.TESTS_Int64ValueList - 52, // 36: tests.SlicesSlicesStruct.Uint16SlSl:type_name -> tests.TESTS_UInt16List - 53, // 37: tests.SlicesSlicesStruct.Uint32SlSl:type_name -> tests.TESTS_UInt32ValueList - 43, // 38: tests.SlicesSlicesStruct.Uint32FixedSlSl:type_name -> tests.TESTS_Fixed32UInt32ValueList - 54, // 39: tests.SlicesSlicesStruct.Uint64SlSl:type_name -> tests.TESTS_UInt64ValueList - 45, // 40: tests.SlicesSlicesStruct.Uint64FixedSlSl:type_name -> tests.TESTS_Fixed64UInt64ValueList - 54, // 41: tests.SlicesSlicesStruct.UintSlSl:type_name -> tests.TESTS_UInt64ValueList - 50, // 42: tests.SlicesSlicesStruct.StrSlSl:type_name -> tests.TESTS_StringValueList - 38, // 43: tests.SlicesSlicesStruct.BytesSlSl:type_name -> tests.TESTS_BytesList - 51, // 44: tests.SlicesSlicesStruct.TimeSlSl:type_name -> tests.TESTS_TimestampList - 40, // 45: tests.SlicesSlicesStruct.DurationSlSl:type_name -> tests.TESTS_DurationList - 41, // 46: tests.SlicesSlicesStruct.EmptySlSl:type_name -> tests.TESTS_EmptyStructList - 55, // 47: tests.PointersStruct.TimePt:type_name -> google.protobuf.Timestamp - 56, // 48: tests.PointersStruct.DurationPt:type_name -> google.protobuf.Duration - 0, // 49: tests.PointersStruct.EmptyPt:type_name -> tests.EmptyStruct - 55, // 50: tests.PointerSlicesStruct.TimePtSl:type_name -> google.protobuf.Timestamp - 56, // 51: tests.PointerSlicesStruct.DurationPtSl:type_name -> google.protobuf.Duration - 0, // 52: tests.PointerSlicesStruct.EmptyPtSl:type_name -> tests.EmptyStruct - 1, // 53: tests.ComplexSt.PrField:type_name -> tests.PrimitivesStruct - 3, // 54: tests.ComplexSt.ArField:type_name -> tests.ArraysStruct - 5, // 55: tests.ComplexSt.SlField:type_name -> tests.SlicesStruct - 7, // 56: tests.ComplexSt.PtField:type_name -> tests.PointersStruct - 1, // 57: tests.EmbeddedSt1.PrimitivesStruct:type_name -> tests.PrimitivesStruct - 1, // 58: tests.EmbeddedSt2.PrimitivesStruct:type_name -> tests.PrimitivesStruct - 3, // 59: tests.EmbeddedSt2.ArraysStruct:type_name -> tests.ArraysStruct - 5, // 60: tests.EmbeddedSt2.SlicesStruct:type_name -> tests.SlicesStruct - 7, // 61: tests.EmbeddedSt2.PointersStruct:type_name -> tests.PointersStruct - 1, // 62: tests.EmbeddedSt3.PrimitivesStruct:type_name -> tests.PrimitivesStruct - 3, // 63: tests.EmbeddedSt3.ArraysStruct:type_name -> tests.ArraysStruct - 5, // 64: tests.EmbeddedSt3.SlicesStruct:type_name -> tests.SlicesStruct - 7, // 65: tests.EmbeddedSt3.PointersStruct:type_name -> tests.PointersStruct - 0, // 66: tests.EmbeddedSt3.EmptyStruct:type_name -> tests.EmptyStruct - 1, // 67: tests.EmbeddedSt4.PrimitivesStruct:type_name -> tests.PrimitivesStruct - 3, // 68: tests.EmbeddedSt4.ArraysStructField:type_name -> tests.ArraysStruct - 5, // 69: tests.EmbeddedSt4.SlicesStruct:type_name -> tests.SlicesStruct - 7, // 70: tests.EmbeddedSt4.PointersStructField:type_name -> tests.PointersStruct - 1, // 71: tests.EmbeddedSt5NameOverride.PrimitivesStruct:type_name -> tests.PrimitivesStruct - 3, // 72: tests.EmbeddedSt5NameOverride.ArraysStructField:type_name -> tests.ArraysStruct - 5, // 73: tests.EmbeddedSt5NameOverride.SlicesStruct:type_name -> tests.SlicesStruct - 7, // 74: tests.EmbeddedSt5NameOverride.PointersStructField:type_name -> tests.PointersStruct - 18, // 75: tests.AminoMarshalerStruct2.Value:type_name -> tests.ReprElem2 - 57, // 76: tests.ReprElem2.Value:type_name -> google.protobuf.Any - 15, // 77: tests.AminoMarshalerStruct6.Value:type_name -> tests.AminoMarshalerStruct1 - 55, // 78: tests.PrimitivesStructDef.Time:type_name -> google.protobuf.Timestamp - 56, // 79: tests.PrimitivesStructDef.Duration:type_name -> google.protobuf.Duration - 0, // 80: tests.PrimitivesStructDef.Empty:type_name -> tests.EmptyStruct - 1, // 81: tests.PrimitivesStructSl.Value:type_name -> tests.PrimitivesStruct - 1, // 82: tests.PrimitivesStructAr.Value:type_name -> tests.PrimitivesStruct - 57, // 83: tests.InterfaceFieldsStruct.F1:type_name -> google.protobuf.Any - 57, // 84: tests.InterfaceFieldsStruct.F2:type_name -> google.protobuf.Any - 57, // 85: tests.InterfaceFieldsStruct.F3:type_name -> google.protobuf.Any - 57, // 86: tests.InterfaceFieldsStruct.F4:type_name -> google.protobuf.Any + 55, // 0: tests.PrimitivesStruct.time:type_name -> google.protobuf.Timestamp + 56, // 1: tests.PrimitivesStruct.duration:type_name -> google.protobuf.Duration + 0, // 2: tests.PrimitivesStruct.empty:type_name -> tests.EmptyStruct + 55, // 3: tests.ShortArraysStruct.time_ar:type_name -> google.protobuf.Timestamp + 56, // 4: tests.ShortArraysStruct.duration_ar:type_name -> google.protobuf.Duration + 55, // 5: tests.ArraysStruct.time_ar:type_name -> google.protobuf.Timestamp + 56, // 6: tests.ArraysStruct.duration_ar:type_name -> google.protobuf.Duration + 0, // 7: tests.ArraysStruct.empty_ar:type_name -> tests.EmptyStruct + 49, // 8: tests.ArraysArraysStruct.int8_ar_ar:type_name -> tests.TESTS_Int8List + 46, // 9: tests.ArraysArraysStruct.int16_ar_ar:type_name -> tests.TESTS_Int16List + 47, // 10: tests.ArraysArraysStruct.int32_ar_ar:type_name -> tests.TESTS_Int32ValueList + 42, // 11: tests.ArraysArraysStruct.int32_fixed_ar_ar:type_name -> tests.TESTS_Fixed32Int32ValueList + 48, // 12: tests.ArraysArraysStruct.int64_ar_ar:type_name -> tests.TESTS_Int64ValueList + 44, // 13: tests.ArraysArraysStruct.int64_fixed_ar_ar:type_name -> tests.TESTS_Fixed64Int64ValueList + 48, // 14: tests.ArraysArraysStruct.int_ar_ar:type_name -> tests.TESTS_Int64ValueList + 52, // 15: tests.ArraysArraysStruct.uint16_ar_ar:type_name -> tests.TESTS_UInt16List + 53, // 16: tests.ArraysArraysStruct.uint32_ar_ar:type_name -> tests.TESTS_UInt32ValueList + 43, // 17: tests.ArraysArraysStruct.uint32_fixed_ar_ar:type_name -> tests.TESTS_Fixed32UInt32ValueList + 54, // 18: tests.ArraysArraysStruct.uint64_ar_ar:type_name -> tests.TESTS_UInt64ValueList + 45, // 19: tests.ArraysArraysStruct.uint64_fixed_ar_ar:type_name -> tests.TESTS_Fixed64UInt64ValueList + 54, // 20: tests.ArraysArraysStruct.uint_ar_ar:type_name -> tests.TESTS_UInt64ValueList + 50, // 21: tests.ArraysArraysStruct.str_ar_ar:type_name -> tests.TESTS_StringValueList + 38, // 22: tests.ArraysArraysStruct.bytes_ar_ar:type_name -> tests.TESTS_BytesList + 51, // 23: tests.ArraysArraysStruct.time_ar_ar:type_name -> tests.TESTS_TimestampList + 40, // 24: tests.ArraysArraysStruct.duration_ar_ar:type_name -> tests.TESTS_DurationList + 41, // 25: tests.ArraysArraysStruct.empty_ar_ar:type_name -> tests.TESTS_EmptyStructList + 55, // 26: tests.SlicesStruct.time_sl:type_name -> google.protobuf.Timestamp + 56, // 27: tests.SlicesStruct.duration_sl:type_name -> google.protobuf.Duration + 0, // 28: tests.SlicesStruct.empty_sl:type_name -> tests.EmptyStruct + 49, // 29: tests.SlicesSlicesStruct.int8_sl_sl:type_name -> tests.TESTS_Int8List + 46, // 30: tests.SlicesSlicesStruct.int16_sl_sl:type_name -> tests.TESTS_Int16List + 47, // 31: tests.SlicesSlicesStruct.int32_sl_sl:type_name -> tests.TESTS_Int32ValueList + 42, // 32: tests.SlicesSlicesStruct.int32_fixed_sl_sl:type_name -> tests.TESTS_Fixed32Int32ValueList + 48, // 33: tests.SlicesSlicesStruct.int64_sl_sl:type_name -> tests.TESTS_Int64ValueList + 44, // 34: tests.SlicesSlicesStruct.int64_fixed_sl_sl:type_name -> tests.TESTS_Fixed64Int64ValueList + 48, // 35: tests.SlicesSlicesStruct.int_sl_sl:type_name -> tests.TESTS_Int64ValueList + 52, // 36: tests.SlicesSlicesStruct.uint16_sl_sl:type_name -> tests.TESTS_UInt16List + 53, // 37: tests.SlicesSlicesStruct.uint32_sl_sl:type_name -> tests.TESTS_UInt32ValueList + 43, // 38: tests.SlicesSlicesStruct.uint32_fixed_sl_sl:type_name -> tests.TESTS_Fixed32UInt32ValueList + 54, // 39: tests.SlicesSlicesStruct.uint64_sl_sl:type_name -> tests.TESTS_UInt64ValueList + 45, // 40: tests.SlicesSlicesStruct.uint64_fixed_sl_sl:type_name -> tests.TESTS_Fixed64UInt64ValueList + 54, // 41: tests.SlicesSlicesStruct.uint_sl_sl:type_name -> tests.TESTS_UInt64ValueList + 50, // 42: tests.SlicesSlicesStruct.str_sl_sl:type_name -> tests.TESTS_StringValueList + 38, // 43: tests.SlicesSlicesStruct.bytes_sl_sl:type_name -> tests.TESTS_BytesList + 51, // 44: tests.SlicesSlicesStruct.time_sl_sl:type_name -> tests.TESTS_TimestampList + 40, // 45: tests.SlicesSlicesStruct.duration_sl_sl:type_name -> tests.TESTS_DurationList + 41, // 46: tests.SlicesSlicesStruct.empty_sl_sl:type_name -> tests.TESTS_EmptyStructList + 55, // 47: tests.PointersStruct.time_pt:type_name -> google.protobuf.Timestamp + 56, // 48: tests.PointersStruct.duration_pt:type_name -> google.protobuf.Duration + 0, // 49: tests.PointersStruct.empty_pt:type_name -> tests.EmptyStruct + 55, // 50: tests.PointerSlicesStruct.time_pt_sl:type_name -> google.protobuf.Timestamp + 56, // 51: tests.PointerSlicesStruct.duration_pt_sl:type_name -> google.protobuf.Duration + 0, // 52: tests.PointerSlicesStruct.empty_pt_sl:type_name -> tests.EmptyStruct + 1, // 53: tests.ComplexSt.pr_field:type_name -> tests.PrimitivesStruct + 3, // 54: tests.ComplexSt.ar_field:type_name -> tests.ArraysStruct + 5, // 55: tests.ComplexSt.sl_field:type_name -> tests.SlicesStruct + 7, // 56: tests.ComplexSt.pt_field:type_name -> tests.PointersStruct + 1, // 57: tests.EmbeddedSt1.primitives_struct:type_name -> tests.PrimitivesStruct + 1, // 58: tests.EmbeddedSt2.primitives_struct:type_name -> tests.PrimitivesStruct + 3, // 59: tests.EmbeddedSt2.arrays_struct:type_name -> tests.ArraysStruct + 5, // 60: tests.EmbeddedSt2.slices_struct:type_name -> tests.SlicesStruct + 7, // 61: tests.EmbeddedSt2.pointers_struct:type_name -> tests.PointersStruct + 1, // 62: tests.EmbeddedSt3.primitives_struct:type_name -> tests.PrimitivesStruct + 3, // 63: tests.EmbeddedSt3.arrays_struct:type_name -> tests.ArraysStruct + 5, // 64: tests.EmbeddedSt3.slices_struct:type_name -> tests.SlicesStruct + 7, // 65: tests.EmbeddedSt3.pointers_struct:type_name -> tests.PointersStruct + 0, // 66: tests.EmbeddedSt3.empty_struct:type_name -> tests.EmptyStruct + 1, // 67: tests.EmbeddedSt4.primitives_struct:type_name -> tests.PrimitivesStruct + 3, // 68: tests.EmbeddedSt4.arrays_struct_field:type_name -> tests.ArraysStruct + 5, // 69: tests.EmbeddedSt4.slices_struct:type_name -> tests.SlicesStruct + 7, // 70: tests.EmbeddedSt4.pointers_struct_field:type_name -> tests.PointersStruct + 1, // 71: tests.EmbeddedSt5NameOverride.primitives_struct:type_name -> tests.PrimitivesStruct + 3, // 72: tests.EmbeddedSt5NameOverride.arrays_struct_field:type_name -> tests.ArraysStruct + 5, // 73: tests.EmbeddedSt5NameOverride.slices_struct:type_name -> tests.SlicesStruct + 7, // 74: tests.EmbeddedSt5NameOverride.pointers_struct_field:type_name -> tests.PointersStruct + 18, // 75: tests.AminoMarshalerStruct2.value:type_name -> tests.ReprElem2 + 57, // 76: tests.ReprElem2.value:type_name -> google.protobuf.Any + 15, // 77: tests.AminoMarshalerStruct6.value:type_name -> tests.AminoMarshalerStruct1 + 55, // 78: tests.PrimitivesStructDef.time:type_name -> google.protobuf.Timestamp + 56, // 79: tests.PrimitivesStructDef.duration:type_name -> google.protobuf.Duration + 0, // 80: tests.PrimitivesStructDef.empty:type_name -> tests.EmptyStruct + 1, // 81: tests.PrimitivesStructSl.value:type_name -> tests.PrimitivesStruct + 1, // 82: tests.PrimitivesStructAr.value:type_name -> tests.PrimitivesStruct + 57, // 83: tests.InterfaceFieldsStruct.f1:type_name -> google.protobuf.Any + 57, // 84: tests.InterfaceFieldsStruct.f2:type_name -> google.protobuf.Any + 57, // 85: tests.InterfaceFieldsStruct.f3:type_name -> google.protobuf.Any + 57, // 86: tests.InterfaceFieldsStruct.f4:type_name -> google.protobuf.Any 38, // 87: tests.TESTS_BytesListList.Value:type_name -> tests.TESTS_BytesList 56, // 88: tests.TESTS_DurationList.Value:type_name -> google.protobuf.Duration 0, // 89: tests.TESTS_EmptyStructList.Value:type_name -> tests.EmptyStruct diff --git a/tm2/pkg/amino/tests/proto3/proto/compat.pb.go b/tm2/pkg/amino/tests/proto3/proto/compat.pb.go index 753f17a9d83..9f38d4ef589 100644 --- a/tm2/pkg/amino/tests/proto3/proto/compat.pb.go +++ b/tm2/pkg/amino/tests/proto3/proto/compat.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 -// protoc v3.21.12 +// protoc-gen-go v1.31.0 +// protoc v4.24.3 // source: proto/compat.proto package proto3 diff --git a/tm2/pkg/amino/tests/tests.proto b/tm2/pkg/amino/tests/tests.proto index 8a9598dded9..c355789eb63 100644 --- a/tm2/pkg/amino/tests/tests.proto +++ b/tm2/pkg/amino/tests/tests.proto @@ -13,313 +13,313 @@ message EmptyStruct { } message PrimitivesStruct { - sint32 Int8 = 1; - sint32 Int16 = 2; - sint32 Int32 = 3; - sfixed32 Int32Fixed = 4; - sint64 Int64 = 5; - sfixed64 Int64Fixed = 6; - sint64 Int = 7; - uint32 Byte = 8; - uint32 Uint8 = 9; - uint32 Uint16 = 10; - uint32 Uint32 = 11; - fixed32 Uint32Fixed = 12; - uint64 Uint64 = 13; - fixed64 Uint64Fixed = 14; - uint64 Uint = 15; - string Str = 16; - bytes Bytes = 17; - google.protobuf.Timestamp Time = 18; - google.protobuf.Duration Duration = 19; - EmptyStruct Empty = 20; + sint32 int8 = 1 [json_name = "Int8"]; + sint32 int16 = 2 [json_name = "Int16"]; + sint32 int32 = 3 [json_name = "Int32"]; + sfixed32 int32_fixed = 4 [json_name = "Int32Fixed"]; + sint64 int64 = 5 [json_name = "Int64"]; + sfixed64 int64_fixed = 6 [json_name = "Int64Fixed"]; + sint64 int = 7 [json_name = "Int"]; + uint32 byte = 8 [json_name = "Byte"]; + uint32 uint8 = 9 [json_name = "Uint8"]; + uint32 uint16 = 10 [json_name = "Uint16"]; + uint32 uint32 = 11 [json_name = "Uint32"]; + fixed32 uint32_fixed = 12 [json_name = "Uint32Fixed"]; + uint64 uint64 = 13 [json_name = "Uint64"]; + fixed64 uint64_fixed = 14 [json_name = "Uint64Fixed"]; + uint64 uint = 15 [json_name = "Uint"]; + string str = 16 [json_name = "Str"]; + bytes bytes = 17 [json_name = "Bytes"]; + google.protobuf.Timestamp time = 18 [json_name = "Time"]; + google.protobuf.Duration duration = 19 [json_name = "Duration"]; + EmptyStruct empty = 20 [json_name = "Empty"]; } message ShortArraysStruct { - repeated google.protobuf.Timestamp TimeAr = 1; - repeated google.protobuf.Duration DurationAr = 2; + repeated google.protobuf.Timestamp time_ar = 1 [json_name = "TimeAr"]; + repeated google.protobuf.Duration duration_ar = 2 [json_name = "DurationAr"]; } message ArraysStruct { - repeated sint32 Int8Ar = 1; - repeated sint32 Int16Ar = 2; - repeated sint32 Int32Ar = 3; - repeated sfixed32 Int32FixedAr = 4; - repeated sint64 Int64Ar = 5; - repeated sfixed64 Int64FixedAr = 6; - repeated sint64 IntAr = 7; - bytes ByteAr = 8; - bytes Uint8Ar = 9; - repeated uint32 Uint16Ar = 10; - repeated uint32 Uint32Ar = 11; - repeated fixed32 Uint32FixedAr = 12; - repeated uint64 Uint64Ar = 13; - repeated fixed64 Uint64FixedAr = 14; - repeated uint64 UintAr = 15; - repeated string StrAr = 16; - repeated bytes BytesAr = 17; - repeated google.protobuf.Timestamp TimeAr = 18; - repeated google.protobuf.Duration DurationAr = 19; - repeated EmptyStruct EmptyAr = 20; + repeated sint32 int8_ar = 1 [json_name = "Int8Ar"]; + repeated sint32 int16_ar = 2 [json_name = "Int16Ar"]; + repeated sint32 int32_ar = 3 [json_name = "Int32Ar"]; + repeated sfixed32 int32_fixed_ar = 4 [json_name = "Int32FixedAr"]; + repeated sint64 int64_ar = 5 [json_name = "Int64Ar"]; + repeated sfixed64 int64_fixed_ar = 6 [json_name = "Int64FixedAr"]; + repeated sint64 int_ar = 7 [json_name = "IntAr"]; + bytes byte_ar = 8 [json_name = "ByteAr"]; + bytes uint8_ar = 9 [json_name = "Uint8Ar"]; + repeated uint32 uint16_ar = 10 [json_name = "Uint16Ar"]; + repeated uint32 uint32_ar = 11 [json_name = "Uint32Ar"]; + repeated fixed32 uint32_fixed_ar = 12 [json_name = "Uint32FixedAr"]; + repeated uint64 uint64_ar = 13 [json_name = "Uint64Ar"]; + repeated fixed64 uint64_fixed_ar = 14 [json_name = "Uint64FixedAr"]; + repeated uint64 uint_ar = 15 [json_name = "UintAr"]; + repeated string str_ar = 16 [json_name = "StrAr"]; + repeated bytes bytes_ar = 17 [json_name = "BytesAr"]; + repeated google.protobuf.Timestamp time_ar = 18 [json_name = "TimeAr"]; + repeated google.protobuf.Duration duration_ar = 19 [json_name = "DurationAr"]; + repeated EmptyStruct empty_ar = 20 [json_name = "EmptyAr"]; } message ArraysArraysStruct { - repeated TESTS_Int8List Int8ArAr = 1; - repeated TESTS_Int16List Int16ArAr = 2; - repeated TESTS_Int32ValueList Int32ArAr = 3; - repeated TESTS_Fixed32Int32ValueList Int32FixedArAr = 4; - repeated TESTS_Int64ValueList Int64ArAr = 5; - repeated TESTS_Fixed64Int64ValueList Int64FixedArAr = 6; - repeated TESTS_Int64ValueList IntArAr = 7; - repeated bytes ByteArAr = 8; - repeated bytes Uint8ArAr = 9; - repeated TESTS_UInt16List Uint16ArAr = 10; - repeated TESTS_UInt32ValueList Uint32ArAr = 11; - repeated TESTS_Fixed32UInt32ValueList Uint32FixedArAr = 12; - repeated TESTS_UInt64ValueList Uint64ArAr = 13; - repeated TESTS_Fixed64UInt64ValueList Uint64FixedArAr = 14; - repeated TESTS_UInt64ValueList UintArAr = 15; - repeated TESTS_StringValueList StrArAr = 16; - repeated TESTS_BytesList BytesArAr = 17; - repeated TESTS_TimestampList TimeArAr = 18; - repeated TESTS_DurationList DurationArAr = 19; - repeated TESTS_EmptyStructList EmptyArAr = 20; + repeated TESTS_Int8List int8_ar_ar = 1 [json_name = "Int8ArAr"]; + repeated TESTS_Int16List int16_ar_ar = 2 [json_name = "Int16ArAr"]; + repeated TESTS_Int32ValueList int32_ar_ar = 3 [json_name = "Int32ArAr"]; + repeated TESTS_Fixed32Int32ValueList int32_fixed_ar_ar = 4 [json_name = "Int32FixedArAr"]; + repeated TESTS_Int64ValueList int64_ar_ar = 5 [json_name = "Int64ArAr"]; + repeated TESTS_Fixed64Int64ValueList int64_fixed_ar_ar = 6 [json_name = "Int64FixedArAr"]; + repeated TESTS_Int64ValueList int_ar_ar = 7 [json_name = "IntArAr"]; + repeated bytes byte_ar_ar = 8 [json_name = "ByteArAr"]; + repeated bytes uint8_ar_ar = 9 [json_name = "Uint8ArAr"]; + repeated TESTS_UInt16List uint16_ar_ar = 10 [json_name = "Uint16ArAr"]; + repeated TESTS_UInt32ValueList uint32_ar_ar = 11 [json_name = "Uint32ArAr"]; + repeated TESTS_Fixed32UInt32ValueList uint32_fixed_ar_ar = 12 [json_name = "Uint32FixedArAr"]; + repeated TESTS_UInt64ValueList uint64_ar_ar = 13 [json_name = "Uint64ArAr"]; + repeated TESTS_Fixed64UInt64ValueList uint64_fixed_ar_ar = 14 [json_name = "Uint64FixedArAr"]; + repeated TESTS_UInt64ValueList uint_ar_ar = 15 [json_name = "UintArAr"]; + repeated TESTS_StringValueList str_ar_ar = 16 [json_name = "StrArAr"]; + repeated TESTS_BytesList bytes_ar_ar = 17 [json_name = "BytesArAr"]; + repeated TESTS_TimestampList time_ar_ar = 18 [json_name = "TimeArAr"]; + repeated TESTS_DurationList duration_ar_ar = 19 [json_name = "DurationArAr"]; + repeated TESTS_EmptyStructList empty_ar_ar = 20 [json_name = "EmptyArAr"]; } message SlicesStruct { - repeated sint32 Int8Sl = 1; - repeated sint32 Int16Sl = 2; - repeated sint32 Int32Sl = 3; - repeated sfixed32 Int32FixedSl = 4; - repeated sint64 Int64Sl = 5; - repeated sfixed64 Int64FixedSl = 6; - repeated sint64 IntSl = 7; - bytes ByteSl = 8; - bytes Uint8Sl = 9; - repeated uint32 Uint16Sl = 10; - repeated uint32 Uint32Sl = 11; - repeated fixed32 Uint32FixedSl = 12; - repeated uint64 Uint64Sl = 13; - repeated fixed64 Uint64FixedSl = 14; - repeated uint64 UintSl = 15; - repeated string StrSl = 16; - repeated bytes BytesSl = 17; - repeated google.protobuf.Timestamp TimeSl = 18; - repeated google.protobuf.Duration DurationSl = 19; - repeated EmptyStruct EmptySl = 20; + repeated sint32 int8_sl = 1 [json_name = "Int8Sl"]; + repeated sint32 int16_sl = 2 [json_name = "Int16Sl"]; + repeated sint32 int32_sl = 3 [json_name = "Int32Sl"]; + repeated sfixed32 int32_fixed_sl = 4 [json_name = "Int32FixedSl"]; + repeated sint64 int64_sl = 5 [json_name = "Int64Sl"]; + repeated sfixed64 int64_fixed_sl = 6 [json_name = "Int64FixedSl"]; + repeated sint64 int_sl = 7 [json_name = "IntSl"]; + bytes byte_sl = 8 [json_name = "ByteSl"]; + bytes uint8_sl = 9 [json_name = "Uint8Sl"]; + repeated uint32 uint16_sl = 10 [json_name = "Uint16Sl"]; + repeated uint32 uint32_sl = 11 [json_name = "Uint32Sl"]; + repeated fixed32 uint32_fixed_sl = 12 [json_name = "Uint32FixedSl"]; + repeated uint64 uint64_sl = 13 [json_name = "Uint64Sl"]; + repeated fixed64 uint64_fixed_sl = 14 [json_name = "Uint64FixedSl"]; + repeated uint64 uint_sl = 15 [json_name = "UintSl"]; + repeated string str_sl = 16 [json_name = "StrSl"]; + repeated bytes bytes_sl = 17 [json_name = "BytesSl"]; + repeated google.protobuf.Timestamp time_sl = 18 [json_name = "TimeSl"]; + repeated google.protobuf.Duration duration_sl = 19 [json_name = "DurationSl"]; + repeated EmptyStruct empty_sl = 20 [json_name = "EmptySl"]; } message SlicesSlicesStruct { - repeated TESTS_Int8List Int8SlSl = 1; - repeated TESTS_Int16List Int16SlSl = 2; - repeated TESTS_Int32ValueList Int32SlSl = 3; - repeated TESTS_Fixed32Int32ValueList Int32FixedSlSl = 4; - repeated TESTS_Int64ValueList Int64SlSl = 5; - repeated TESTS_Fixed64Int64ValueList Int64FixedSlSl = 6; - repeated TESTS_Int64ValueList IntSlSl = 7; - repeated bytes ByteSlSl = 8; - repeated bytes Uint8SlSl = 9; - repeated TESTS_UInt16List Uint16SlSl = 10; - repeated TESTS_UInt32ValueList Uint32SlSl = 11; - repeated TESTS_Fixed32UInt32ValueList Uint32FixedSlSl = 12; - repeated TESTS_UInt64ValueList Uint64SlSl = 13; - repeated TESTS_Fixed64UInt64ValueList Uint64FixedSlSl = 14; - repeated TESTS_UInt64ValueList UintSlSl = 15; - repeated TESTS_StringValueList StrSlSl = 16; - repeated TESTS_BytesList BytesSlSl = 17; - repeated TESTS_TimestampList TimeSlSl = 18; - repeated TESTS_DurationList DurationSlSl = 19; - repeated TESTS_EmptyStructList EmptySlSl = 20; + repeated TESTS_Int8List int8_sl_sl = 1 [json_name = "Int8SlSl"]; + repeated TESTS_Int16List int16_sl_sl = 2 [json_name = "Int16SlSl"]; + repeated TESTS_Int32ValueList int32_sl_sl = 3 [json_name = "Int32SlSl"]; + repeated TESTS_Fixed32Int32ValueList int32_fixed_sl_sl = 4 [json_name = "Int32FixedSlSl"]; + repeated TESTS_Int64ValueList int64_sl_sl = 5 [json_name = "Int64SlSl"]; + repeated TESTS_Fixed64Int64ValueList int64_fixed_sl_sl = 6 [json_name = "Int64FixedSlSl"]; + repeated TESTS_Int64ValueList int_sl_sl = 7 [json_name = "IntSlSl"]; + repeated bytes byte_sl_sl = 8 [json_name = "ByteSlSl"]; + repeated bytes uint8_sl_sl = 9 [json_name = "Uint8SlSl"]; + repeated TESTS_UInt16List uint16_sl_sl = 10 [json_name = "Uint16SlSl"]; + repeated TESTS_UInt32ValueList uint32_sl_sl = 11 [json_name = "Uint32SlSl"]; + repeated TESTS_Fixed32UInt32ValueList uint32_fixed_sl_sl = 12 [json_name = "Uint32FixedSlSl"]; + repeated TESTS_UInt64ValueList uint64_sl_sl = 13 [json_name = "Uint64SlSl"]; + repeated TESTS_Fixed64UInt64ValueList uint64_fixed_sl_sl = 14 [json_name = "Uint64FixedSlSl"]; + repeated TESTS_UInt64ValueList uint_sl_sl = 15 [json_name = "UintSlSl"]; + repeated TESTS_StringValueList str_sl_sl = 16 [json_name = "StrSlSl"]; + repeated TESTS_BytesList bytes_sl_sl = 17 [json_name = "BytesSlSl"]; + repeated TESTS_TimestampList time_sl_sl = 18 [json_name = "TimeSlSl"]; + repeated TESTS_DurationList duration_sl_sl = 19 [json_name = "DurationSlSl"]; + repeated TESTS_EmptyStructList empty_sl_sl = 20 [json_name = "EmptySlSl"]; } message PointersStruct { - sint32 Int8Pt = 1; - sint32 Int16Pt = 2; - sint32 Int32Pt = 3; - sfixed32 Int32FixedPt = 4; - sint64 Int64Pt = 5; - sfixed64 Int64FixedPt = 6; - sint64 IntPt = 7; - uint32 BytePt = 8; - uint32 Uint8Pt = 9; - uint32 Uint16Pt = 10; - uint32 Uint32Pt = 11; - fixed32 Uint32FixedPt = 12; - uint64 Uint64Pt = 13; - fixed64 Uint64FixedPt = 14; - uint64 UintPt = 15; - string StrPt = 16; - bytes BytesPt = 17; - google.protobuf.Timestamp TimePt = 18; - google.protobuf.Duration DurationPt = 19; - EmptyStruct EmptyPt = 20; + sint32 int8_pt = 1 [json_name = "Int8Pt"]; + sint32 int16_pt = 2 [json_name = "Int16Pt"]; + sint32 int32_pt = 3 [json_name = "Int32Pt"]; + sfixed32 int32_fixed_pt = 4 [json_name = "Int32FixedPt"]; + sint64 int64_pt = 5 [json_name = "Int64Pt"]; + sfixed64 int64_fixed_pt = 6 [json_name = "Int64FixedPt"]; + sint64 int_pt = 7 [json_name = "IntPt"]; + uint32 byte_pt = 8 [json_name = "BytePt"]; + uint32 uint8_pt = 9 [json_name = "Uint8Pt"]; + uint32 uint16_pt = 10 [json_name = "Uint16Pt"]; + uint32 uint32_pt = 11 [json_name = "Uint32Pt"]; + fixed32 uint32_fixed_pt = 12 [json_name = "Uint32FixedPt"]; + uint64 uint64_pt = 13 [json_name = "Uint64Pt"]; + fixed64 uint64_fixed_pt = 14 [json_name = "Uint64FixedPt"]; + uint64 uint_pt = 15 [json_name = "UintPt"]; + string str_pt = 16 [json_name = "StrPt"]; + bytes bytes_pt = 17 [json_name = "BytesPt"]; + google.protobuf.Timestamp time_pt = 18 [json_name = "TimePt"]; + google.protobuf.Duration duration_pt = 19 [json_name = "DurationPt"]; + EmptyStruct empty_pt = 20 [json_name = "EmptyPt"]; } message PointerSlicesStruct { - repeated sint32 Int8PtSl = 1; - repeated sint32 Int16PtSl = 2; - repeated sint32 Int32PtSl = 3; - repeated sfixed32 Int32FixedPtSl = 4; - repeated sint64 Int64PtSl = 5; - repeated sfixed64 Int64FixedPtSl = 6; - repeated sint64 IntPtSl = 7; - bytes BytePtSl = 8; - bytes Uint8PtSl = 9; - repeated uint32 Uint16PtSl = 10; - repeated uint32 Uint32PtSl = 11; - repeated fixed32 Uint32FixedPtSl = 12; - repeated uint64 Uint64PtSl = 13; - repeated fixed64 Uint64FixedPtSl = 14; - repeated uint64 UintPtSl = 15; - repeated string StrPtSl = 16; - repeated bytes BytesPtSl = 17; - repeated google.protobuf.Timestamp TimePtSl = 18; - repeated google.protobuf.Duration DurationPtSl = 19; - repeated EmptyStruct EmptyPtSl = 20; + repeated sint32 int8_pt_sl = 1 [json_name = "Int8PtSl"]; + repeated sint32 int16_pt_sl = 2 [json_name = "Int16PtSl"]; + repeated sint32 int32_pt_sl = 3 [json_name = "Int32PtSl"]; + repeated sfixed32 int32_fixed_pt_sl = 4 [json_name = "Int32FixedPtSl"]; + repeated sint64 int64_pt_sl = 5 [json_name = "Int64PtSl"]; + repeated sfixed64 int64_fixed_pt_sl = 6 [json_name = "Int64FixedPtSl"]; + repeated sint64 int_pt_sl = 7 [json_name = "IntPtSl"]; + bytes byte_pt_sl = 8 [json_name = "BytePtSl"]; + bytes uint8_pt_sl = 9 [json_name = "Uint8PtSl"]; + repeated uint32 uint16_pt_sl = 10 [json_name = "Uint16PtSl"]; + repeated uint32 uint32_pt_sl = 11 [json_name = "Uint32PtSl"]; + repeated fixed32 uint32_fixed_pt_sl = 12 [json_name = "Uint32FixedPtSl"]; + repeated uint64 uint64_pt_sl = 13 [json_name = "Uint64PtSl"]; + repeated fixed64 uint64_fixed_pt_sl = 14 [json_name = "Uint64FixedPtSl"]; + repeated uint64 uint_pt_sl = 15 [json_name = "UintPtSl"]; + repeated string str_pt_sl = 16 [json_name = "StrPtSl"]; + repeated bytes bytes_pt_sl = 17 [json_name = "BytesPtSl"]; + repeated google.protobuf.Timestamp time_pt_sl = 18 [json_name = "TimePtSl"]; + repeated google.protobuf.Duration duration_pt_sl = 19 [json_name = "DurationPtSl"]; + repeated EmptyStruct empty_pt_sl = 20 [json_name = "EmptyPtSl"]; } message ComplexSt { - PrimitivesStruct PrField = 1; - ArraysStruct ArField = 2; - SlicesStruct SlField = 3; - PointersStruct PtField = 4; + PrimitivesStruct pr_field = 1 [json_name = "PrField"]; + ArraysStruct ar_field = 2 [json_name = "ArField"]; + SlicesStruct sl_field = 3 [json_name = "SlField"]; + PointersStruct pt_field = 4 [json_name = "PtField"]; } message EmbeddedSt1 { - PrimitivesStruct PrimitivesStruct = 1; + PrimitivesStruct primitives_struct = 1 [json_name = "PrimitivesStruct"]; } message EmbeddedSt2 { - PrimitivesStruct PrimitivesStruct = 1; - ArraysStruct ArraysStruct = 2; - SlicesStruct SlicesStruct = 3; - PointersStruct PointersStruct = 4; + PrimitivesStruct primitives_struct = 1 [json_name = "PrimitivesStruct"]; + ArraysStruct arrays_struct = 2 [json_name = "ArraysStruct"]; + SlicesStruct slices_struct = 3 [json_name = "SlicesStruct"]; + PointersStruct pointers_struct = 4 [json_name = "PointersStruct"]; } message EmbeddedSt3 { - PrimitivesStruct PrimitivesStruct = 1; - ArraysStruct ArraysStruct = 2; - SlicesStruct SlicesStruct = 3; - PointersStruct PointersStruct = 4; - EmptyStruct EmptyStruct = 5; + PrimitivesStruct primitives_struct = 1 [json_name = "PrimitivesStruct"]; + ArraysStruct arrays_struct = 2 [json_name = "ArraysStruct"]; + SlicesStruct slices_struct = 3 [json_name = "SlicesStruct"]; + PointersStruct pointers_struct = 4 [json_name = "PointersStruct"]; + EmptyStruct empty_struct = 5 [json_name = "EmptyStruct"]; } message EmbeddedSt4 { - sint64 Foo1 = 1; - PrimitivesStruct PrimitivesStruct = 2; - string Foo2 = 3; - ArraysStruct ArraysStructField = 4; - bytes Foo3 = 5; - SlicesStruct SlicesStruct = 6; - bool Foo4 = 7; - PointersStruct PointersStructField = 8; - uint64 Foo5 = 9; + sint64 foo1 = 1 [json_name = "Foo1"]; + PrimitivesStruct primitives_struct = 2 [json_name = "PrimitivesStruct"]; + string foo2 = 3 [json_name = "Foo2"]; + ArraysStruct arrays_struct_field = 4 [json_name = "ArraysStructField"]; + bytes foo3 = 5 [json_name = "Foo3"]; + SlicesStruct slices_struct = 6 [json_name = "SlicesStruct"]; + bool foo4 = 7 [json_name = "Foo4"]; + PointersStruct pointers_struct_field = 8 [json_name = "PointersStructField"]; + uint64 foo5 = 9 [json_name = "Foo5"]; } message EmbeddedSt5NameOverride { - sint64 Foo1 = 1; - PrimitivesStruct PrimitivesStruct = 2; - string Foo2 = 3; - ArraysStruct ArraysStructField = 4; - bytes Foo3 = 5; - SlicesStruct SlicesStruct = 6; - bool Foo4 = 7; - PointersStruct PointersStructField = 8; - uint64 Foo5 = 9; + sint64 foo1 = 1 [json_name = "Foo1"]; + PrimitivesStruct primitives_struct = 2 [json_name = "PrimitivesStruct"]; + string foo2 = 3 [json_name = "Foo2"]; + ArraysStruct arrays_struct_field = 4 [json_name = "ArraysStructField"]; + bytes foo3 = 5 [json_name = "Foo3"]; + SlicesStruct slices_struct = 6 [json_name = "SlicesStruct"]; + bool foo4 = 7 [json_name = "Foo4"]; + PointersStruct pointers_struct_field = 8 [json_name = "PointersStructField"]; + uint64 foo5 = 9 [json_name = "Foo5"]; } message AminoMarshalerStruct1 { - sint64 C = 1; - sint64 D = 2; + sint64 c = 1 [json_name = "C"]; + sint64 d = 2 [json_name = "D"]; } message ReprStruct1 { - sint64 C = 1; - sint64 D = 2; + sint64 c = 1 [json_name = "C"]; + sint64 d = 2 [json_name = "D"]; } message AminoMarshalerStruct2 { - repeated ReprElem2 Value = 1; + repeated ReprElem2 value = 1; } message ReprElem2 { - string Key = 1; - google.protobuf.Any Value = 2; + string key = 1 [json_name = "Key"]; + google.protobuf.Any value = 2 [json_name = "Value"]; } message AminoMarshalerStruct3 { - sint32 Value = 1; + sint32 value = 1; } message AminoMarshalerInt4 { - sint32 A = 1; + sint32 a = 1 [json_name = "A"]; } message AminoMarshalerInt5 { - string Value = 1; + string value = 1; } message AminoMarshalerStruct6 { - repeated AminoMarshalerStruct1 Value = 1; + repeated AminoMarshalerStruct1 value = 1; } message AminoMarshalerStruct7 { - bytes Value = 1; + bytes value = 1; } message ReprElem7 { - uint32 Value = 1; + uint32 value = 1; } message IntDef { - sint64 Value = 1; + sint64 value = 1; } message IntAr { - repeated sint64 Value = 1; + repeated sint64 value = 1; } message IntSl { - repeated sint64 Value = 1; + repeated sint64 value = 1; } message ByteAr { - bytes Value = 1; + bytes value = 1; } message ByteSl { - bytes Value = 1; + bytes value = 1; } message PrimitivesStructDef { - sint32 Int8 = 1; - sint32 Int16 = 2; - sint32 Int32 = 3; - sfixed32 Int32Fixed = 4; - sint64 Int64 = 5; - sfixed64 Int64Fixed = 6; - sint64 Int = 7; - uint32 Byte = 8; - uint32 Uint8 = 9; - uint32 Uint16 = 10; - uint32 Uint32 = 11; - fixed32 Uint32Fixed = 12; - uint64 Uint64 = 13; - fixed64 Uint64Fixed = 14; - uint64 Uint = 15; - string Str = 16; - bytes Bytes = 17; - google.protobuf.Timestamp Time = 18; - google.protobuf.Duration Duration = 19; - EmptyStruct Empty = 20; + sint32 int8 = 1 [json_name = "Int8"]; + sint32 int16 = 2 [json_name = "Int16"]; + sint32 int32 = 3 [json_name = "Int32"]; + sfixed32 int32_fixed = 4 [json_name = "Int32Fixed"]; + sint64 int64 = 5 [json_name = "Int64"]; + sfixed64 int64_fixed = 6 [json_name = "Int64Fixed"]; + sint64 int = 7 [json_name = "Int"]; + uint32 byte = 8 [json_name = "Byte"]; + uint32 uint8 = 9 [json_name = "Uint8"]; + uint32 uint16 = 10 [json_name = "Uint16"]; + uint32 uint32 = 11 [json_name = "Uint32"]; + fixed32 uint32_fixed = 12 [json_name = "Uint32Fixed"]; + uint64 uint64 = 13 [json_name = "Uint64"]; + fixed64 uint64_fixed = 14 [json_name = "Uint64Fixed"]; + uint64 uint = 15 [json_name = "Uint"]; + string str = 16 [json_name = "Str"]; + bytes bytes = 17 [json_name = "Bytes"]; + google.protobuf.Timestamp time = 18 [json_name = "Time"]; + google.protobuf.Duration duration = 19 [json_name = "Duration"]; + EmptyStruct empty = 20 [json_name = "Empty"]; } message PrimitivesStructSl { - repeated PrimitivesStruct Value = 1; + repeated PrimitivesStruct value = 1; } message PrimitivesStructAr { - repeated PrimitivesStruct Value = 1; + repeated PrimitivesStruct value = 1; } message Concrete1 { @@ -329,18 +329,18 @@ message Concrete2 { } message ConcreteTypeDef { - bytes Value = 1; + bytes value = 1; } message ConcreteWrappedBytes { - bytes Value = 1; + bytes value = 1 [json_name = "Value"]; } message InterfaceFieldsStruct { - google.protobuf.Any F1 = 1; - google.protobuf.Any F2 = 2; - google.protobuf.Any F3 = 3; - google.protobuf.Any F4 = 4; + google.protobuf.Any f1 = 1 [json_name = "F1"]; + google.protobuf.Any f2 = 2 [json_name = "F2"]; + google.protobuf.Any f3 = 3 [json_name = "F3"]; + google.protobuf.Any f4 = 4 [json_name = "F4"]; } message TESTS_BytesList { diff --git a/tm2/pkg/bft/abci/types/abci.proto b/tm2/pkg/bft/abci/types/abci.proto index 2494c94b702..99e7a584c2e 100644 --- a/tm2/pkg/bft/abci/types/abci.proto +++ b/tm2/pkg/bft/abci/types/abci.proto @@ -13,189 +13,189 @@ message RequestBase { } message RequestEcho { - RequestBase RequestBase = 1; - string Message = 2; + RequestBase request_base = 1 [json_name = "RequestBase"]; + string message = 2 [json_name = "Message"]; } message RequestFlush { - RequestBase RequestBase = 1; + RequestBase request_base = 1 [json_name = "RequestBase"]; } message RequestInfo { - RequestBase RequestBase = 1; + RequestBase request_base = 1 [json_name = "RequestBase"]; } message RequestSetOption { - RequestBase RequestBase = 1; - string Key = 2; - string Value = 3; + RequestBase request_base = 1 [json_name = "RequestBase"]; + string key = 2 [json_name = "Key"]; + string value = 3 [json_name = "Value"]; } message RequestInitChain { - RequestBase RequestBase = 1; - google.protobuf.Timestamp Time = 2; - string ChainID = 3; - ConsensusParams ConsensusParams = 4; - repeated ValidatorUpdate Validators = 5; - google.protobuf.Any AppState = 6; + RequestBase request_base = 1 [json_name = "RequestBase"]; + google.protobuf.Timestamp time = 2 [json_name = "Time"]; + string chain_id = 3 [json_name = "ChainID"]; + ConsensusParams consensus_params = 4 [json_name = "ConsensusParams"]; + repeated ValidatorUpdate validators = 5 [json_name = "Validators"]; + google.protobuf.Any app_state = 6 [json_name = "AppState"]; } message RequestQuery { - RequestBase RequestBase = 1; - bytes Data = 2; - string Path = 3; - sint64 Height = 4; - bool Prove = 5; + RequestBase request_base = 1 [json_name = "RequestBase"]; + bytes data = 2 [json_name = "Data"]; + string path = 3 [json_name = "Path"]; + sint64 height = 4 [json_name = "Height"]; + bool prove = 5 [json_name = "Prove"]; } message RequestBeginBlock { - RequestBase RequestBase = 1; - bytes Hash = 2; - google.protobuf.Any Header = 3; - LastCommitInfo LastCommitInfo = 4; + RequestBase request_base = 1 [json_name = "RequestBase"]; + bytes hash = 2 [json_name = "Hash"]; + google.protobuf.Any header = 3 [json_name = "Header"]; + LastCommitInfo last_commit_info = 4 [json_name = "LastCommitInfo"]; } message RequestCheckTx { - RequestBase RequestBase = 1; - bytes Tx = 2; - sint64 Type = 3; + RequestBase request_base = 1 [json_name = "RequestBase"]; + bytes tx = 2 [json_name = "Tx"]; + sint64 type = 3 [json_name = "Type"]; } message RequestDeliverTx { - RequestBase RequestBase = 1; - bytes Tx = 2; + RequestBase request_base = 1 [json_name = "RequestBase"]; + bytes tx = 2 [json_name = "Tx"]; } message RequestEndBlock { - RequestBase RequestBase = 1; - sint64 Height = 2; + RequestBase request_base = 1 [json_name = "RequestBase"]; + sint64 height = 2 [json_name = "Height"]; } message RequestCommit { - RequestBase RequestBase = 1; + RequestBase request_base = 1 [json_name = "RequestBase"]; } message ResponseBase { - google.protobuf.Any Error = 1; - bytes Data = 2; - repeated google.protobuf.Any Events = 3; - string Log = 4; - string Info = 5; + google.protobuf.Any error = 1 [json_name = "Error"]; + bytes data = 2 [json_name = "Data"]; + repeated google.protobuf.Any events = 3 [json_name = "Events"]; + string log = 4 [json_name = "Log"]; + string info = 5 [json_name = "Info"]; } message ResponseException { - ResponseBase ResponseBase = 1; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; } message ResponseEcho { - ResponseBase ResponseBase = 1; - string Message = 2; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; + string message = 2 [json_name = "Message"]; } message ResponseFlush { - ResponseBase ResponseBase = 1; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; } message ResponseInfo { - ResponseBase ResponseBase = 1; - string ABCIVersion = 2; - string AppVersion = 3; - sint64 LastBlockHeight = 4; - bytes LastBlockAppHash = 5; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; + string abci_version = 2 [json_name = "ABCIVersion"]; + string app_version = 3 [json_name = "AppVersion"]; + sint64 last_block_height = 4 [json_name = "LastBlockHeight"]; + bytes last_block_app_hash = 5 [json_name = "LastBlockAppHash"]; } message ResponseSetOption { - ResponseBase ResponseBase = 1; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; } message ResponseInitChain { - ResponseBase ResponseBase = 1; - ConsensusParams ConsensusParams = 2; - repeated ValidatorUpdate Validators = 3; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; + ConsensusParams consensus_params = 2 [json_name = "ConsensusParams"]; + repeated ValidatorUpdate validators = 3 [json_name = "Validators"]; } message ResponseQuery { - ResponseBase ResponseBase = 1; - bytes Key = 2; - bytes Value = 3; - tm.Proof Proof = 4; - sint64 Height = 5; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; + bytes key = 2 [json_name = "Key"]; + bytes value = 3 [json_name = "Value"]; + tm.Proof proof = 4 [json_name = "Proof"]; + sint64 height = 5 [json_name = "Height"]; } message ResponseBeginBlock { - ResponseBase ResponseBase = 1; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; } message ResponseCheckTx { - ResponseBase ResponseBase = 1; - sint64 GasWanted = 2; - sint64 GasUsed = 3; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; + sint64 gas_wanted = 2 [json_name = "GasWanted"]; + sint64 gas_used = 3 [json_name = "GasUsed"]; } message ResponseDeliverTx { - ResponseBase ResponseBase = 1; - sint64 GasWanted = 2; - sint64 GasUsed = 3; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; + sint64 gas_wanted = 2 [json_name = "GasWanted"]; + sint64 gas_used = 3 [json_name = "GasUsed"]; } message ResponseEndBlock { - ResponseBase ResponseBase = 1; - repeated ValidatorUpdate ValidatorUpdates = 2; - ConsensusParams ConsensusParams = 3; - repeated google.protobuf.Any Events = 4; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; + repeated ValidatorUpdate validator_updates = 2 [json_name = "ValidatorUpdates"]; + ConsensusParams consensus_params = 3 [json_name = "ConsensusParams"]; + repeated google.protobuf.Any events = 4 [json_name = "Events"]; } message ResponseCommit { - ResponseBase ResponseBase = 1; + ResponseBase response_base = 1 [json_name = "ResponseBase"]; } message StringError { - string Value = 1; + string value = 1; } message ConsensusParams { - BlockParams Block = 1; - ValidatorParams Validator = 2; + BlockParams block = 1 [json_name = "Block"]; + ValidatorParams validator = 2 [json_name = "Validator"]; } message BlockParams { - sint64 MaxTxBytes = 1; - sint64 MaxDataBytes = 2; - sint64 MaxBlockBytes = 3; - sint64 MaxGas = 4; - sint64 TimeIotaMS = 5; + sint64 max_tx_bytes = 1 [json_name = "MaxTxBytes"]; + sint64 max_data_bytes = 2 [json_name = "MaxDataBytes"]; + sint64 max_block_bytes = 3 [json_name = "MaxBlockBytes"]; + sint64 max_gas = 4 [json_name = "MaxGas"]; + sint64 time_iota_ms = 5 [json_name = "TimeIotaMS"]; } message ValidatorParams { - repeated string PubKeyTypeURLs = 1; + repeated string pub_key_type_ur_ls = 1 [json_name = "PubKeyTypeURLs"]; } message ValidatorUpdate { - string Address = 1; - google.protobuf.Any PubKey = 2; - sint64 Power = 3; + string address = 1 [json_name = "Address"]; + google.protobuf.Any pub_key = 2 [json_name = "PubKey"]; + sint64 power = 3 [json_name = "Power"]; } message LastCommitInfo { - sint32 Round = 1; - repeated VoteInfo Votes = 2; + sint32 round = 1 [json_name = "Round"]; + repeated VoteInfo votes = 2 [json_name = "Votes"]; } message VoteInfo { - string Address = 1; - sint64 Power = 2; - bool SignedLastBlock = 3; + string address = 1 [json_name = "Address"]; + sint64 power = 2 [json_name = "Power"]; + bool signed_last_block = 3 [json_name = "SignedLastBlock"]; } message EventString { - string Value = 1; + string value = 1; } message MockHeader { - string Version = 1; - string ChainID = 2; - sint64 Height = 3; - google.protobuf.Timestamp Time = 4; - sint64 NumTxs = 5; - sint64 TotalTxs = 6; + string version = 1; + string chain_id = 2; + sint64 height = 3; + google.protobuf.Timestamp time = 4; + sint64 num_txs = 5; + sint64 total_txs = 6; } \ No newline at end of file diff --git a/tm2/pkg/bft/blockchain/blockchain.proto b/tm2/pkg/bft/blockchain/blockchain.proto index a618d5abf49..d31d9e7074e 100644 --- a/tm2/pkg/bft/blockchain/blockchain.proto +++ b/tm2/pkg/bft/blockchain/blockchain.proto @@ -11,21 +11,21 @@ import "github.com/gnolang/gno/tm2/pkg/bitarray/bitarray.proto"; // messages message BlockRequest { - sint64 Height = 1; + sint64 height = 1 [json_name = "Height"]; } message BlockResponse { - Block Block = 1; + Block block = 1 [json_name = "Block"]; } message NoBlockResponse { - sint64 Height = 1; + sint64 height = 1 [json_name = "Height"]; } message StatusRequest { - sint64 Height = 1; + sint64 height = 1 [json_name = "Height"]; } message StatusResponse { - sint64 Height = 1; + sint64 height = 1 [json_name = "Height"]; } \ No newline at end of file diff --git a/tm2/pkg/bft/consensus/consensus.proto b/tm2/pkg/bft/consensus/consensus.proto index 1859ab28153..f2c8a70156d 100644 --- a/tm2/pkg/bft/consensus/consensus.proto +++ b/tm2/pkg/bft/consensus/consensus.proto @@ -14,75 +14,75 @@ import "google/protobuf/duration.proto"; // messages message NewRoundStepMessage { - sint64 Height = 1; - sint64 Round = 2; - uint32 Step = 3; - sint64 SecondsSinceStartTime = 4; - sint64 LastCommitRound = 5; + sint64 height = 1 [json_name = "Height"]; + sint64 round = 2 [json_name = "Round"]; + uint32 step = 3 [json_name = "Step"]; + sint64 seconds_since_start_time = 4 [json_name = "SecondsSinceStartTime"]; + sint64 last_commit_round = 5 [json_name = "LastCommitRound"]; } message NewValidBlockMessage { - sint64 Height = 1; - sint64 Round = 2; - PartSetHeader BlockPartsHeader = 3; - BitArray BlockParts = 4; - bool IsCommit = 5; + sint64 height = 1 [json_name = "Height"]; + sint64 round = 2 [json_name = "Round"]; + PartSetHeader block_parts_header = 3 [json_name = "BlockPartsHeader"]; + BitArray block_parts = 4 [json_name = "BlockParts"]; + bool is_commit = 5 [json_name = "IsCommit"]; } message ProposalMessage { - Proposal Proposal = 1; + Proposal proposal = 1 [json_name = "Proposal"]; } message ProposalPOLMessage { - sint64 Height = 1; - sint64 ProposalPOLRound = 2; - BitArray ProposalPOL = 3; + sint64 height = 1 [json_name = "Height"]; + sint64 proposal_pol_round = 2 [json_name = "ProposalPOLRound"]; + BitArray proposal_pol = 3 [json_name = "ProposalPOL"]; } message BlockPartMessage { - sint64 Height = 1; - sint64 Round = 2; - Part Part = 3; + sint64 height = 1 [json_name = "Height"]; + sint64 round = 2 [json_name = "Round"]; + Part part = 3 [json_name = "Part"]; } message VoteMessage { - Vote Vote = 1; + Vote vote = 1 [json_name = "Vote"]; } message HasVoteMessage { - sint64 Height = 1; - sint64 Round = 2; - uint32 Type = 3; - sint64 Index = 4; + sint64 height = 1 [json_name = "Height"]; + sint64 round = 2 [json_name = "Round"]; + uint32 type = 3 [json_name = "Type"]; + sint64 index = 4 [json_name = "Index"]; } message VoteSetMaj23Message { - sint64 Height = 1; - sint64 Round = 2; - uint32 Type = 3; - BlockID BlockID = 4; + sint64 height = 1 [json_name = "Height"]; + sint64 round = 2 [json_name = "Round"]; + uint32 type = 3 [json_name = "Type"]; + BlockID block_id = 4 [json_name = "BlockID"]; } message VoteSetBitsMessage { - sint64 Height = 1; - sint64 Round = 2; - uint32 Type = 3; - BlockID BlockID = 4; - BitArray Votes = 5; + sint64 height = 1 [json_name = "Height"]; + sint64 round = 2 [json_name = "Round"]; + uint32 type = 3 [json_name = "Type"]; + BlockID block_id = 4 [json_name = "BlockID"]; + BitArray votes = 5 [json_name = "Votes"]; } message newRoundStepInfo { - HRS HRS = 1; + HRS hrs = 1; } message msgInfo { - google.protobuf.Any Msg = 1; - string PeerID = 2; + google.protobuf.Any msg = 1; + string peer_id = 2 [json_name = "peer_key"]; } message timeoutInfo { - google.protobuf.Duration Duration = 1; - sint64 Height = 2; - sint64 Round = 3; - uint32 Step = 4; + google.protobuf.Duration duration = 1; + sint64 height = 2; + sint64 round = 3; + uint32 step = 4; } \ No newline at end of file diff --git a/tm2/pkg/bft/consensus/types/cstypes.proto b/tm2/pkg/bft/consensus/types/cstypes.proto index 41a20d585c6..7fb87e71442 100644 --- a/tm2/pkg/bft/consensus/types/cstypes.proto +++ b/tm2/pkg/bft/consensus/types/cstypes.proto @@ -12,92 +12,92 @@ import "google/protobuf/timestamp.proto"; // messages message RoundState { - sint64 Height = 1; - sint64 Round = 2; - uint32 Step = 3; - google.protobuf.Timestamp StartTime = 4; - google.protobuf.Timestamp CommitTime = 5; - ValidatorSet Validators = 6; - Proposal Proposal = 7; - Block ProposalBlock = 8; - PartSet ProposalBlockParts = 9; - sint64 LockedRound = 10; - Block LockedBlock = 11; - PartSet LockedBlockParts = 12; - sint64 ValidRound = 13; - Block ValidBlock = 14; - PartSet ValidBlockParts = 15; - HeightVoteSet Votes = 16; - sint64 CommitRound = 17; - VoteSet LastCommit = 18; - ValidatorSet LastValidators = 19; - bool TriggeredTimeoutPrecommit = 20; + sint64 height = 1; + sint64 round = 2; + uint32 step = 3; + google.protobuf.Timestamp start_time = 4; + google.protobuf.Timestamp commit_time = 5; + ValidatorSet validators = 6; + Proposal proposal = 7; + Block proposal_block = 8; + PartSet proposal_block_parts = 9; + sint64 locked_round = 10; + Block locked_block = 11; + PartSet locked_block_parts = 12; + sint64 valid_round = 13; + Block valid_block = 14; + PartSet valid_block_parts = 15; + HeightVoteSet votes = 16; + sint64 commit_round = 17; + VoteSet last_commit = 18; + ValidatorSet last_validators = 19; + bool triggered_timeout_precommit = 20; } message HRS { - sint64 Height = 1; - sint64 Round = 2; - uint32 Step = 3; + sint64 height = 1; + sint64 round = 2; + uint32 step = 3; } message RoundStateSimple { - string HeightRoundStep = 1; - google.protobuf.Timestamp StartTime = 2; - bytes ProposalBlockHash = 3; - bytes LockedBlockHash = 4; - bytes ValidBlockHash = 5; - HeightVoteSet Votes = 6; + string height_round_step = 1 [json_name = "height/round/step"]; + google.protobuf.Timestamp start_time = 2; + bytes proposal_block_hash = 3; + bytes locked_block_hash = 4; + bytes valid_block_hash = 5; + HeightVoteSet votes = 6 [json_name = "height_vote_set"]; } message PeerRoundState { - sint64 Height = 1; - sint64 Round = 2; - uint32 Step = 3; - google.protobuf.Timestamp StartTime = 4; - bool Proposal = 5; - PartSetHeader ProposalBlockPartsHeader = 6; - BitArray ProposalBlockParts = 7; - sint64 ProposalPOLRound = 8; - BitArray ProposalPOL = 9; - BitArray Prevotes = 10; - BitArray Precommits = 11; - sint64 LastCommitRound = 12; - BitArray LastCommit = 13; - sint64 CatchupCommitRound = 14; - BitArray CatchupCommit = 15; + sint64 height = 1; + sint64 round = 2; + uint32 step = 3; + google.protobuf.Timestamp start_time = 4; + bool proposal = 5; + PartSetHeader proposal_block_parts_header = 6; + BitArray proposal_block_parts = 7; + sint64 proposal_pol_round = 8; + BitArray proposal_pol = 9; + BitArray prevotes = 10; + BitArray precommits = 11; + sint64 last_commit_round = 12; + BitArray last_commit = 13; + sint64 catchup_commit_round = 14; + BitArray catchup_commit = 15; } message HeightVoteSet { } message EventNewRoundStep { - HRS HRS = 1; - sint64 SecondsSinceStartTime = 2; - sint64 LastCommitRound = 3; + HRS hrs = 1; + sint64 seconds_since_start_time = 2 [json_name = "SecondsSinceStartTime"]; + sint64 last_commit_round = 3 [json_name = "LastCommitRound"]; } message EventNewValidBlock { - HRS HRS = 1; - PartSetHeader BlockPartsHeader = 2; - BitArray BlockParts = 3; - bool IsCommit = 4; + HRS hrs = 1; + PartSetHeader block_parts_header = 2; + BitArray block_parts = 3; + bool is_commit = 4; } message EventNewRound { - HRS HRS = 1; - Validator Proposer = 2; - sint64 ProposerIndex = 3; + HRS hrs = 1; + Validator proposer = 2; + sint64 proposer_index = 3; } message EventCompleteProposal { - HRS HRS = 1; - BlockID BlockID = 2; + HRS hrs = 1; + BlockID block_id = 2; } message EventTimeoutPropose { - HRS HRS = 1; + HRS hrs = 1; } message EventTimeoutWait { - HRS HRS = 1; + HRS hrs = 1; } \ No newline at end of file diff --git a/tm2/pkg/bft/mempool/mempool.proto b/tm2/pkg/bft/mempool/mempool.proto index 7eb0a7c8ce5..d85de7add85 100644 --- a/tm2/pkg/bft/mempool/mempool.proto +++ b/tm2/pkg/bft/mempool/mempool.proto @@ -5,5 +5,5 @@ option go_package = "github.com/gnolang/gno/tm2/pkg/bft/mempool/pb"; // messages message TxMessage { - bytes Tx = 1; + bytes tx = 1 [json_name = "Tx"]; } \ No newline at end of file diff --git a/tm2/pkg/bft/types/types.proto b/tm2/pkg/bft/types/types.proto index 7514078f26b..ca97ff59781 100644 --- a/tm2/pkg/bft/types/types.proto +++ b/tm2/pkg/bft/types/types.proto @@ -12,158 +12,158 @@ import "google/protobuf/any.proto"; // messages message Proposal { - uint32 Type = 1; - sint64 Height = 2; - sint64 Round = 3; - sint64 POLRound = 4; - BlockID BlockID = 5; - google.protobuf.Timestamp Timestamp = 6; - bytes Signature = 7; + uint32 type = 1 [json_name = "Type"]; + sint64 height = 2; + sint64 round = 3; + sint64 pol_round = 4; + BlockID block_id = 5; + google.protobuf.Timestamp timestamp = 6; + bytes signature = 7; } message Block { - Header Header = 1; - Data Data = 2; - Commit LastCommit = 3; + Header header = 1; + Data data = 2; + Commit last_commit = 3; } message Header { - string Version = 1; - string ChainID = 2; - sint64 Height = 3; - google.protobuf.Timestamp Time = 4; - sint64 NumTxs = 5; - sint64 TotalTxs = 6; - string AppVersion = 7; - BlockID LastBlockID = 8; - bytes LastCommitHash = 9; - bytes DataHash = 10; - bytes ValidatorsHash = 11; - bytes NextValidatorsHash = 12; - bytes ConsensusHash = 13; - bytes AppHash = 14; - bytes LastResultsHash = 15; - string ProposerAddress = 16; + string version = 1; + string chain_id = 2; + sint64 height = 3; + google.protobuf.Timestamp time = 4; + sint64 num_txs = 5; + sint64 total_txs = 6; + string app_version = 7; + BlockID last_block_id = 8; + bytes last_commit_hash = 9; + bytes data_hash = 10; + bytes validators_hash = 11; + bytes next_validators_hash = 12; + bytes consensus_hash = 13; + bytes app_hash = 14; + bytes last_results_hash = 15; + string proposer_address = 16; } message Data { - repeated bytes Txs = 1; + repeated bytes txs = 1; } message Commit { - BlockID BlockID = 1; - repeated CommitSig Precommits = 2; + BlockID block_id = 1; + repeated CommitSig precommits = 2; } message BlockID { - bytes Hash = 1; - PartSetHeader PartsHeader = 2; + bytes hash = 1; + PartSetHeader parts_header = 2 [json_name = "parts"]; } message CommitSig { - uint32 Type = 1; - sint64 Height = 2; - sint64 Round = 3; - BlockID BlockID = 4; - google.protobuf.Timestamp Timestamp = 5; - string ValidatorAddress = 6; - sint64 ValidatorIndex = 7; - bytes Signature = 8; + uint32 type = 1; + sint64 height = 2; + sint64 round = 3; + BlockID block_id = 4; + google.protobuf.Timestamp timestamp = 5; + string validator_address = 6; + sint64 validator_index = 7; + bytes signature = 8; } message Vote { - uint32 Type = 1; - sint64 Height = 2; - sint64 Round = 3; - BlockID BlockID = 4; - google.protobuf.Timestamp Timestamp = 5; - string ValidatorAddress = 6; - sint64 ValidatorIndex = 7; - bytes Signature = 8; + uint32 type = 1; + sint64 height = 2; + sint64 round = 3; + BlockID block_id = 4; + google.protobuf.Timestamp timestamp = 5; + string validator_address = 6; + sint64 validator_index = 7; + bytes signature = 8; } message Part { - sint64 Index = 1; - bytes Bytes = 2; - SimpleProof Proof = 3; + sint64 index = 1; + bytes bytes = 2; + SimpleProof proof = 3; } message PartSet { } message PartSetHeader { - sint64 Total = 1; - bytes Hash = 2; + sint64 total = 1; + bytes hash = 2; } message Validator { - string Address = 1; - google.protobuf.Any PubKey = 2; - sint64 VotingPower = 3; - sint64 ProposerPriority = 4; + string address = 1; + google.protobuf.Any pub_key = 2; + sint64 voting_power = 3; + sint64 proposer_priority = 4; } message ValidatorSet { - repeated Validator Validators = 1; - Validator Proposer = 2; + repeated Validator validators = 1; + Validator proposer = 2; } message EventNewBlock { - Block Block = 1; - abci.ResponseBeginBlock ResultBeginBlock = 2; - abci.ResponseEndBlock ResultEndBlock = 3; + Block block = 1; + abci.ResponseBeginBlock result_begin_block = 2; + abci.ResponseEndBlock result_end_block = 3; } message EventNewBlockHeader { - Header Header = 1; - abci.ResponseBeginBlock ResultBeginBlock = 2; - abci.ResponseEndBlock ResultEndBlock = 3; + Header header = 1; + abci.ResponseBeginBlock result_begin_block = 2; + abci.ResponseEndBlock result_end_block = 3; } message EventTx { - TxResult Result = 1; + TxResult result = 1; } message EventVote { - Vote Vote = 1; + Vote vote = 1; } message EventString { - string Value = 1; + string value = 1; } message EventValidatorSetUpdates { - repeated abci.ValidatorUpdate ValidatorUpdates = 1; + repeated abci.ValidatorUpdate validator_updates = 1; } message DuplicateVoteEvidence { - google.protobuf.Any PubKey = 1; - Vote VoteA = 2; - Vote VoteB = 3; + google.protobuf.Any pub_key = 1 [json_name = "PubKey"]; + Vote vote_a = 2 [json_name = "VoteA"]; + Vote vote_b = 3 [json_name = "VoteB"]; } message MockGoodEvidence { - sint64 Height = 1; - string Address = 2; + sint64 height = 1 [json_name = "Height"]; + string address = 2 [json_name = "Address"]; } message MockRandomGoodEvidence { - MockGoodEvidence MockGoodEvidence = 1; + MockGoodEvidence mock_good_evidence = 1 [json_name = "MockGoodEvidence"]; } message MockBadEvidence { - MockGoodEvidence MockGoodEvidence = 1; + MockGoodEvidence mock_good_evidence = 1 [json_name = "MockGoodEvidence"]; } message TxResult { - sint64 Height = 1; - uint32 Index = 2; - bytes Tx = 3; - abci.ResponseDeliverTx Response = 4; + sint64 height = 1; + uint32 index = 2; + bytes tx = 3; + abci.ResponseDeliverTx response = 4; } message MockAppState { - string AccountOwner = 1; + string account_owner = 1; } message VoteSet { diff --git a/tm2/pkg/bitarray/bitarray.proto b/tm2/pkg/bitarray/bitarray.proto index b7ff61c7e23..3e6bd03a0ae 100644 --- a/tm2/pkg/bitarray/bitarray.proto +++ b/tm2/pkg/bitarray/bitarray.proto @@ -5,6 +5,6 @@ option go_package = "github.com/gnolang/gno/tm2/pkg/bitarray/pb"; // messages message BitArray { - sint64 Bits = 1; - repeated uint64 Elems = 2; + sint64 bits = 1; + repeated uint64 elems = 2; } \ No newline at end of file diff --git a/tm2/pkg/crypto/ed25519/ed25519.proto b/tm2/pkg/crypto/ed25519/ed25519.proto index 35a6b4e443e..407de42b668 100644 --- a/tm2/pkg/crypto/ed25519/ed25519.proto +++ b/tm2/pkg/crypto/ed25519/ed25519.proto @@ -5,9 +5,9 @@ option go_package = "github.com/gnolang/gno/tm2/pkg/crypto/ed25519/pb"; // messages message PubKeyEd25519 { - bytes Value = 1; + bytes value = 1; } message PrivKeyEd25519 { - bytes Value = 1; + bytes value = 1; } \ No newline at end of file diff --git a/tm2/pkg/crypto/ed25519/ed25519_test.go b/tm2/pkg/crypto/ed25519/ed25519_test.go index fdf269018c0..67daacaaff5 100644 --- a/tm2/pkg/crypto/ed25519/ed25519_test.go +++ b/tm2/pkg/crypto/ed25519/ed25519_test.go @@ -1,12 +1,14 @@ package ed25519_test import ( + "encoding/hex" "testing" - "github.com/gnolang/gno/tm2/pkg/crypto" - "github.com/gnolang/gno/tm2/pkg/crypto/ed25519" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/gnolang/gno/tm2/pkg/crypto" + "github.com/gnolang/gno/tm2/pkg/crypto/ed25519" ) func TestSignAndValidateEd25519(t *testing.T) { @@ -28,3 +30,19 @@ func TestSignAndValidateEd25519(t *testing.T) { assert.False(t, pubKey.VerifyBytes(msg, sig)) } + +const ( + privKeySecretGolden = "secret_golden" + msgGolden = "msg_golden" + signedGolden = "f9d4e6a665dfb6cd7e2fedf0d46a1725472e640a5e93d654ce4caa986e5defd23c8b3af76aa6e39c24c582f0ebee860f66254b29cf6d034ce461ae2773133703" +) + +func TestSignAndVerifyGolden(t *testing.T) { + privKey := ed25519.GenPrivKeyFromSecret([]byte(privKeySecretGolden)) + // pubKey := privKey.PubKey() + out, err := privKey.Sign([]byte(msgGolden)) + require.NoError(t, err) + + hexOut := hex.EncodeToString(out) + require.Equal(t, signedGolden, hexOut) +} diff --git a/tm2/pkg/crypto/hd/hd.proto b/tm2/pkg/crypto/hd/hd.proto index 949408bb00c..48e2524c28f 100644 --- a/tm2/pkg/crypto/hd/hd.proto +++ b/tm2/pkg/crypto/hd/hd.proto @@ -5,9 +5,9 @@ option go_package = "github.com/gnolang/gno/tm2/pkg/crypto/hd/pb"; // messages message Bip44Params { - uint32 Purpose = 1; - uint32 CoinType = 2; - uint32 Account = 3; - bool Change = 4; - uint32 AddressIndex = 5; + uint32 purpose = 1; + uint32 coin_type = 2 [json_name = "coinType"]; + uint32 account = 3; + bool change = 4; + uint32 address_index = 5 [json_name = "addressIndex"]; } \ No newline at end of file diff --git a/tm2/pkg/crypto/hd/hdpath.go b/tm2/pkg/crypto/hd/hdpath.go index a03c34fb0f3..32de2c5bff6 100644 --- a/tm2/pkg/crypto/hd/hdpath.go +++ b/tm2/pkg/crypto/hd/hdpath.go @@ -24,7 +24,7 @@ import ( "strconv" "strings" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" ) // BIP44Params wraps BIP 44 params (5 level BIP 32 path). @@ -212,7 +212,7 @@ func derivePrivateKey(privKeyBytes [32]byte, chainCode [32]byte, index uint32, h data = append([]byte{byte(0)}, privKeyBytes[:]...) } else { // this can't return an error: - _, ecPub := btcec.PrivKeyFromBytes(btcec.S256(), privKeyBytes[:]) + _, ecPub := btcec.PrivKeyFromBytes(privKeyBytes[:]) pubkeyBytes := ecPub.SerializeCompressed() data = pubkeyBytes diff --git a/tm2/pkg/crypto/keys/client/common.go b/tm2/pkg/crypto/keys/client/common.go index cfadd05120b..a6b52b6cad3 100644 --- a/tm2/pkg/crypto/keys/client/common.go +++ b/tm2/pkg/crypto/keys/client/common.go @@ -1,11 +1,5 @@ package client -import ( - "fmt" - "os" - "path/filepath" -) - type BaseOptions struct { Home string Remote string @@ -15,27 +9,9 @@ type BaseOptions struct { } var DefaultBaseOptions = BaseOptions{ - Home: HomeDir(), + Home: "", Remote: "127.0.0.1:26657", Quiet: false, InsecurePasswordStdin: false, Config: "", } - -func HomeDir() string { - // if environment variable is set, always use that. - // otherwise, use config dir (varies depending on OS) + "gno" - var err error - dir := os.Getenv("GNO_HOME") - if dir != "" { - return dir - } - dir, err = os.UserConfigDir() - if err != nil { - panic(fmt.Errorf("couldn't get user config dir: %w", err)) - } - gnoHome := filepath.Join(dir, "gno") - // XXX: added april 2023 as a transitory measure - remove after test4 - fixOldDefaultGnoHome(gnoHome) - return gnoHome -} diff --git a/tm2/pkg/crypto/keys/client/maketx.go b/tm2/pkg/crypto/keys/client/maketx.go index e3fe89b930d..c424b566c95 100644 --- a/tm2/pkg/crypto/keys/client/maketx.go +++ b/tm2/pkg/crypto/keys/client/maketx.go @@ -36,6 +36,7 @@ func newMakeTxCmd(rootCfg *baseCfg, io commands.IO) *commands.Command { newAddPkgCmd(cfg, io), newSendCmd(cfg, io), newCallCmd(cfg, io), + newRunCmd(cfg, io), ) return cmd diff --git a/tm2/pkg/crypto/keys/client/root.go b/tm2/pkg/crypto/keys/client/root.go index 61fd7d077b5..e09b31d45dd 100644 --- a/tm2/pkg/crypto/keys/client/root.go +++ b/tm2/pkg/crypto/keys/client/root.go @@ -19,7 +19,13 @@ type baseCfg struct { } func NewRootCmd(io commands.IO) *commands.Command { - cfg := &baseCfg{} + return NewRootCmdWithBaseConfig(io, DefaultBaseOptions) +} + +func NewRootCmdWithBaseConfig(io commands.IO, base BaseOptions) *commands.Command { + cfg := &baseCfg{ + BaseOptions: base, + } cmd := commands.NewCommand( commands.Metadata{ @@ -56,35 +62,35 @@ func (c *baseCfg) RegisterFlags(fs *flag.FlagSet) { fs.StringVar( &c.Home, "home", - DefaultBaseOptions.Home, + c.Home, "home directory", ) fs.StringVar( &c.Remote, "remote", - DefaultBaseOptions.Remote, + c.Remote, "remote node URL", ) fs.BoolVar( &c.Quiet, "quiet", - DefaultBaseOptions.Quiet, + c.Quiet, "suppress output during execution", ) fs.BoolVar( &c.InsecurePasswordStdin, "insecure-password-stdin", - DefaultBaseOptions.Quiet, + c.Quiet, "WARNING! take password from stdin", ) fs.StringVar( &c.Config, "config", - DefaultBaseOptions.Config, + c.Config, "config file (optional)", ) } diff --git a/tm2/pkg/crypto/keys/client/run.go b/tm2/pkg/crypto/keys/client/run.go new file mode 100644 index 00000000000..1ae702c990e --- /dev/null +++ b/tm2/pkg/crypto/keys/client/run.go @@ -0,0 +1,139 @@ +package client + +import ( + "context" + "flag" + "fmt" + "io/ioutil" + "os" + + "github.com/gnolang/gno/gno.land/pkg/sdk/vm" + gno "github.com/gnolang/gno/gnovm/pkg/gnolang" + "github.com/gnolang/gno/tm2/pkg/amino" + "github.com/gnolang/gno/tm2/pkg/commands" + "github.com/gnolang/gno/tm2/pkg/crypto/keys" + "github.com/gnolang/gno/tm2/pkg/errors" + "github.com/gnolang/gno/tm2/pkg/std" +) + +type runCfg struct { + rootCfg *makeTxCfg +} + +func newRunCmd(rootCfg *makeTxCfg, io commands.IO) *commands.Command { + cfg := &runCfg{ + rootCfg: rootCfg, + } + + return commands.NewCommand( + commands.Metadata{ + Name: "run", + ShortUsage: "run [flags] ", + ShortHelp: "Runs Gno code by invoking main() in a package", + }, + cfg, + func(_ context.Context, args []string) error { + return runRun(cfg, args, io) + }, + ) +} + +func (c *runCfg) RegisterFlags(fs *flag.FlagSet) {} + +func runRun(cfg *runCfg, args []string, io commands.IO) error { + if len(args) != 2 { + return flag.ErrHelp + } + if cfg.rootCfg.gasWanted == 0 { + return errors.New("gas-wanted not specified") + } + if cfg.rootCfg.gasFee == "" { + return errors.New("gas-fee not specified") + } + + nameOrBech32 := args[0] + sourcePath := args[1] // can be a file path, a dir path, or '-' for stdin + + // read account pubkey. + kb, err := keys.NewKeyBaseFromDir(cfg.rootCfg.rootCfg.Home) + if err != nil { + return err + } + info, err := kb.GetByNameOrAddress(nameOrBech32) + if err != nil { + return err + } + caller := info.GetAddress() + + // parse gas wanted & fee. + gaswanted := cfg.rootCfg.gasWanted + gasfee, err := std.ParseCoin(cfg.rootCfg.gasFee) + if err != nil { + return errors.Wrap(err, "parsing gas fee coin") + } + + memPkg := &std.MemPackage{} + if sourcePath == "-" { // stdin + data, err := ioutil.ReadAll(io.In()) + if err != nil { + return fmt.Errorf("could not read stdin: %w", err) + } + memPkg.Files = []*std.MemFile{ + { + Name: "stdin.gno", + Body: string(data), + }, + } + } else { + info, err := os.Stat(sourcePath) + if err != nil { + return fmt.Errorf("could not read source path: %q, %w", sourcePath, err) + } + if info.IsDir() { + memPkg = gno.ReadMemPackage(sourcePath, "") + } else { // is file + b, err := os.ReadFile(sourcePath) + if err != nil { + return fmt.Errorf("could not read %q: %w", sourcePath, err) + } + memPkg.Files = []*std.MemFile{ + { + Name: info.Name(), + Body: string(b), + }, + } + } + } + if memPkg.IsEmpty() { + panic(fmt.Sprintf("found an empty package %q", memPkg.Path)) + } + // precompile and validate syntax + err = gno.PrecompileAndCheckMempkg(memPkg) + if err != nil { + panic(err) + } + memPkg.Name = "main" + memPkg.Path = "gno.land/r/" + caller.String() + "/run" + + // construct msg & tx and marshal. + msg := vm.MsgRun{ + Caller: caller, + Package: memPkg, + } + tx := std.Tx{ + Msgs: []std.Msg{msg}, + Fee: std.NewFee(gaswanted, gasfee), + Signatures: nil, + Memo: cfg.rootCfg.memo, + } + + if cfg.rootCfg.broadcast { + err := signAndBroadcast(cfg.rootCfg, args, tx, io) + if err != nil { + return err + } + } else { + fmt.Println(string(amino.MustMarshalJSON(tx))) + } + return nil +} diff --git a/tm2/pkg/crypto/ledger/ledger_secp256k1.go b/tm2/pkg/crypto/ledger/ledger_secp256k1.go index f0b74cd48d4..c3586f833fe 100644 --- a/tm2/pkg/crypto/ledger/ledger_secp256k1.go +++ b/tm2/pkg/crypto/ledger/ledger_secp256k1.go @@ -4,7 +4,8 @@ import ( "fmt" "os" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" "github.com/gnolang/gno/tm2/pkg/amino" "github.com/gnolang/gno/tm2/pkg/crypto" @@ -166,12 +167,12 @@ func warnIfErrors(f func() error) { } func convertDERtoBER(signatureDER []byte) ([]byte, error) { - sigDER, err := btcec.ParseDERSignature(signatureDER[:], btcec.S256()) + sigDER, err := ecdsa.ParseDERSignature(signatureDER[:]) if err != nil { return nil, err } - sigBER := btcec.Signature{R: sigDER.R, S: sigDER.S} - return sigBER.Serialize(), nil + + return sigDER.Serialize(), nil } func getLedgerDevice() (LedgerSECP256K1, error) { @@ -235,7 +236,7 @@ func getPubKeyUnsafe(device LedgerSECP256K1, path hd.BIP44Params) (crypto.PubKey } // re-serialize in the 33-byte compressed format - cmp, err := btcec.ParsePubKey(publicKey[:], btcec.S256()) + cmp, err := btcec.ParsePubKey(publicKey[:]) if err != nil { return nil, fmt.Errorf("error parsing public key: %w", err) } @@ -259,7 +260,7 @@ func getPubKeyAddrSafe(device LedgerSECP256K1, path hd.BIP44Params, hrp string) } // re-serialize in the 33-byte compressed format - cmp, err := btcec.ParsePubKey(publicKey[:], btcec.S256()) + cmp, err := btcec.ParsePubKey(publicKey[:]) if err != nil { return nil, "", fmt.Errorf("error parsing public key: %w", err) } diff --git a/tm2/pkg/crypto/merkle/merkle.proto b/tm2/pkg/crypto/merkle/merkle.proto index f415caaaa2f..74aed458a20 100644 --- a/tm2/pkg/crypto/merkle/merkle.proto +++ b/tm2/pkg/crypto/merkle/merkle.proto @@ -5,27 +5,27 @@ option go_package = "github.com/gnolang/gno/tm2/pkg/crypto/merkle/pb"; // messages message ProofOp { - string Type = 1; - bytes Key = 2; - bytes Data = 3; + string type = 1; + bytes key = 2; + bytes data = 3; } message Proof { - repeated ProofOp Ops = 1; + repeated ProofOp ops = 1; } message SimpleProof { - sint64 Total = 1; - sint64 Index = 2; - bytes LeafHash = 3; - repeated bytes Aunts = 4; + sint64 total = 1; + sint64 index = 2; + bytes leaf_hash = 3; + repeated bytes aunts = 4; } message SimpleProofNode { - bytes Hash = 1; - SimpleProofNode Parent = 2; - SimpleProofNode Left = 3; - SimpleProofNode Right = 4; + bytes hash = 1 [json_name = "Hash"]; + SimpleProofNode parent = 2 [json_name = "Parent"]; + SimpleProofNode left = 3 [json_name = "Left"]; + SimpleProofNode right = 4 [json_name = "Right"]; } message MERKLE_BytesList { diff --git a/tm2/pkg/crypto/multisig/multisig.proto b/tm2/pkg/crypto/multisig/multisig.proto index 47667a02f02..4adf6b02a6f 100644 --- a/tm2/pkg/crypto/multisig/multisig.proto +++ b/tm2/pkg/crypto/multisig/multisig.proto @@ -8,6 +8,6 @@ import "google/protobuf/any.proto"; // messages message PubKeyMultisig { - uint64 K = 1; - repeated google.protobuf.Any PubKeys = 2; + uint64 k = 1 [json_name = "threshold"]; + repeated google.protobuf.Any pub_keys = 2 [json_name = "pubkeys"]; } \ No newline at end of file diff --git a/tm2/pkg/crypto/secp256k1/secp256k1.go b/tm2/pkg/crypto/secp256k1/secp256k1.go index 32af38bcdd9..03f51f5ebf9 100644 --- a/tm2/pkg/crypto/secp256k1/secp256k1.go +++ b/tm2/pkg/crypto/secp256k1/secp256k1.go @@ -7,9 +7,9 @@ import ( "io" "math/big" + secp256k1 "github.com/btcsuite/btcd/btcec/v2" "golang.org/x/crypto/ripemd160" - secp256k1 "github.com/btcsuite/btcd/btcec" "github.com/gnolang/gno/tm2/pkg/amino" "github.com/gnolang/gno/tm2/pkg/crypto" ) @@ -29,7 +29,7 @@ func (privKey PrivKeySecp256k1) Bytes() []byte { // PubKey performs the point-scalar multiplication from the privKey on the // generator point to get the pubkey. func (privKey PrivKeySecp256k1) PubKey() crypto.PubKey { - _, pubkeyObject := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey[:]) + _, pubkeyObject := secp256k1.PrivKeyFromBytes(privKey[:]) var pubkeyBytes PubKeySecp256k1 copy(pubkeyBytes[:], pubkeyObject.SerializeCompressed()) return pubkeyBytes diff --git a/tm2/pkg/crypto/secp256k1/secp256k1_internal_test.go b/tm2/pkg/crypto/secp256k1/secp256k1_internal_test.go index d80bea83dba..65d657d98cb 100644 --- a/tm2/pkg/crypto/secp256k1/secp256k1_internal_test.go +++ b/tm2/pkg/crypto/secp256k1/secp256k1_internal_test.go @@ -5,9 +5,8 @@ import ( "math/big" "testing" + underlyingSecp256k1 "github.com/btcsuite/btcd/btcec/v2" "github.com/stretchr/testify/require" - - underlyingSecp256k1 "github.com/btcsuite/btcd/btcec" ) func Test_genPrivKey(t *testing.T) { diff --git a/tm2/pkg/crypto/secp256k1/secp256k1_nocgo.go b/tm2/pkg/crypto/secp256k1/secp256k1_nocgo.go index 86da257c264..ccf2104a8d3 100644 --- a/tm2/pkg/crypto/secp256k1/secp256k1_nocgo.go +++ b/tm2/pkg/crypto/secp256k1/secp256k1_nocgo.go @@ -3,29 +3,25 @@ package secp256k1 import ( - "math/big" - - secp256k1 "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" + "github.com/decred/dcrd/dcrec/secp256k1/v4" "github.com/gnolang/gno/tm2/pkg/crypto" ) -// used to reject malleable signatures -// see: -// - https://github.com/ethereum/go-ethereum/blob/f9401ae011ddf7f8d2d95020b7446c17f8d98dc1/crypto/signature_nocgo.go#L90-L93 -// - https://github.com/ethereum/go-ethereum/blob/f9401ae011ddf7f8d2d95020b7446c17f8d98dc1/crypto/crypto.go#L39 -var secp256k1halfN = new(big.Int).Rsh(secp256k1.S256().N, 1) - // Sign creates an ECDSA signature on curve Secp256k1, using SHA256 on the msg. // The returned signature will be of the form R || S (in lower-S form). func (privKey PrivKeySecp256k1) Sign(msg []byte) ([]byte, error) { - priv, _ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey[:]) - sig, err := priv.Sign(crypto.Sha256(msg)) + priv, _ := btcec.PrivKeyFromBytes(privKey[:]) + + sig, err := ecdsa.SignCompact(priv, crypto.Sha256(msg), false) // ref uncompressed pubkey if err != nil { return nil, err } - sigBytes := serializeSig(sig) - return sigBytes, nil + + // remove compact sig recovery code byte at the beginning + return sig[1:], nil } // VerifyBytes verifies a signature of the form R || S. @@ -34,37 +30,36 @@ func (pubKey PubKeySecp256k1) VerifyBytes(msg []byte, sigStr []byte) bool { if len(sigStr) != 64 { return false } - pub, err := secp256k1.ParsePubKey(pubKey[:], secp256k1.S256()) + + pub, err := secp256k1.ParsePubKey(pubKey[:]) if err != nil { return false } - // parse the signature: - signature := signatureFromBytes(sigStr) - // Reject malleable signatures. libsecp256k1 does this check but btcec doesn't. - // see: https://github.com/ethereum/go-ethereum/blob/f9401ae011ddf7f8d2d95020b7446c17f8d98dc1/crypto/signature_nocgo.go#L90-L93 - if signature.S.Cmp(secp256k1halfN) > 0 { + + psig, ok := signatureFromBytes(sigStr) + if !ok { return false } - return signature.Verify(crypto.Sha256(msg), pub) + + return psig.Verify(crypto.Sha256(msg), pub) } // Read Signature struct from R || S. Caller needs to ensure // that len(sigStr) == 64. -func signatureFromBytes(sigStr []byte) *secp256k1.Signature { - return &secp256k1.Signature{ - R: new(big.Int).SetBytes(sigStr[:32]), - S: new(big.Int).SetBytes(sigStr[32:64]), +func signatureFromBytes(sigStr []byte) (*ecdsa.Signature, bool) { + // parse the signature: + var r, s secp256k1.ModNScalar + if r.SetByteSlice(sigStr[:32]) { + return nil, false // overflow + } + if s.SetByteSlice(sigStr[32:]) { + return nil, false + } + + // Reject malleable signatures. libsecp256k1 does this check but btcec doesn't. + if s.IsOverHalfOrder() { + return nil, false } -} -// Serialize signature to R || S. -// R, S are padded to 32 bytes respectively. -func serializeSig(sig *secp256k1.Signature) []byte { - rBytes := sig.R.Bytes() - sBytes := sig.S.Bytes() - sigBytes := make([]byte, 64) - // 0 pad the byte arrays from the left if they aren't big enough. - copy(sigBytes[32-len(rBytes):32], rBytes) - copy(sigBytes[64-len(sBytes):64], sBytes) - return sigBytes + return ecdsa.NewSignature(&r, &s), true } diff --git a/tm2/pkg/crypto/secp256k1/secp256k1_nocgo_test.go b/tm2/pkg/crypto/secp256k1/secp256k1_nocgo_test.go index aeaca9df47f..ae8c47fdfed 100644 --- a/tm2/pkg/crypto/secp256k1/secp256k1_nocgo_test.go +++ b/tm2/pkg/crypto/secp256k1/secp256k1_nocgo_test.go @@ -5,7 +5,6 @@ package secp256k1 import ( "testing" - secp256k1 "github.com/btcsuite/btcd/btcec" "github.com/stretchr/testify/require" ) @@ -20,21 +19,25 @@ func TestSignatureVerificationAndRejectUpperS(t *testing.T) { priv := GenPrivKey() sigStr, err := priv.Sign(msg) require.NoError(t, err) - sig := signatureFromBytes(sigStr) - require.False(t, sig.S.Cmp(secp256k1halfN) > 0) + _, ok := signatureFromBytes(sigStr) + require.True(t, ok) pub := priv.PubKey() require.True(t, pub.VerifyBytes(msg, sigStr)) + } +} + +func BenchmarkVerify(b *testing.B) { + priv := GenPrivKey() + msg := []byte("We have lingered long enough on the shores of the cosmic ocean.") + sigStr, err := priv.Sign(msg) + require.NoError(b, err) - // malleate: - sig.S.Sub(secp256k1.S256().CurveParams.N, sig.S) - require.True(t, sig.S.Cmp(secp256k1halfN) > 0) - malSigStr := serializeSig(sig) + pub := priv.PubKey() + b.ResetTimer() - require.False(t, pub.VerifyBytes(msg, malSigStr), - "VerifyBytes incorrect with malleated & invalid S. sig=%v, key=%v", - sig, - priv, - ) + for i := 0; i < b.N; i++ { + ok := pub.VerifyBytes(msg, sigStr) + require.True(b, ok) } } diff --git a/tm2/pkg/crypto/secp256k1/secp256k1_test.go b/tm2/pkg/crypto/secp256k1/secp256k1_test.go index e04f622fdbb..bc0b472d50c 100644 --- a/tm2/pkg/crypto/secp256k1/secp256k1_test.go +++ b/tm2/pkg/crypto/secp256k1/secp256k1_test.go @@ -5,14 +5,13 @@ import ( "math/big" "testing" - "github.com/btcsuite/btcutil/base58" + underlyingSecp256k1 "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil/base58" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/gnolang/gno/tm2/pkg/crypto" "github.com/gnolang/gno/tm2/pkg/crypto/secp256k1" - - underlyingSecp256k1 "github.com/btcsuite/btcd/btcec" ) type keyData struct { @@ -82,7 +81,7 @@ func TestSecp256k1LoadPrivkeyAndSerializeIsIdentity(t *testing.T) { // This function creates a private and public key in the underlying libraries format. // The private key is basically calling new(big.Int).SetBytes(pk), which removes leading zero bytes - priv, _ := underlyingSecp256k1.PrivKeyFromBytes(underlyingSecp256k1.S256(), privKeyBytes[:]) + priv, _ := underlyingSecp256k1.PrivKeyFromBytes(privKeyBytes[:]) // this takes the bytes returned by `(big int).Bytes()`, and if the length is less than 32 bytes, // pads the bytes from the left with zero bytes. Therefore these two functions composed // result in the identity function on privKeyBytes, hence the following equality check diff --git a/tm2/pkg/sdk/auth/ante.go b/tm2/pkg/sdk/auth/ante.go index c00a98df4d3..6abc4380e89 100644 --- a/tm2/pkg/sdk/auth/ante.go +++ b/tm2/pkg/sdk/auth/ante.go @@ -238,7 +238,7 @@ func processSig( } if !simulate && !pubKey.VerifyBytes(signBytes, sig.Signature) { - return nil, abciResult(std.ErrUnauthorized("signature verification failed; verify correct account sequence and chain-id")) + return nil, abciResult(std.ErrUnauthorized("signature verification failed; verify correct account, sequence, and chain-id")) } if err := acc.SetSequence(acc.GetSequence() + 1); err != nil { diff --git a/tm2/pkg/sdk/bank/bank.proto b/tm2/pkg/sdk/bank/bank.proto index b2a1b0e8249..fd8d6437e63 100644 --- a/tm2/pkg/sdk/bank/bank.proto +++ b/tm2/pkg/sdk/bank/bank.proto @@ -14,7 +14,7 @@ message InputOutputMismatchError { } message MsgSend { - string FromAddress = 1; - string ToAddress = 2; - string Amount = 3; + string from_address = 1; + string to_address = 2; + string amount = 3; } \ No newline at end of file diff --git a/tm2/pkg/sdk/sdk.proto b/tm2/pkg/sdk/sdk.proto index 50e2e6c42eb..62fbfc19758 100644 --- a/tm2/pkg/sdk/sdk.proto +++ b/tm2/pkg/sdk/sdk.proto @@ -9,7 +9,7 @@ import "github.com/gnolang/gno/tm2/pkg/crypto/merkle/merkle.proto"; // messages message Result { - abci.ResponseBase ResponseBase = 1; - sint64 GasWanted = 2; - sint64 GasUsed = 3; + abci.ResponseBase response_base = 1 [json_name = "ResponseBase"]; + sint64 gas_wanted = 2 [json_name = "GasWanted"]; + sint64 gas_used = 3 [json_name = "GasUsed"]; } \ No newline at end of file diff --git a/tm2/pkg/std/std.proto b/tm2/pkg/std/std.proto index d7b9b9c737b..2fad1eeff38 100644 --- a/tm2/pkg/std/std.proto +++ b/tm2/pkg/std/std.proto @@ -8,22 +8,22 @@ import "google/protobuf/any.proto"; // messages message BaseAccount { - string Address = 1; - string Coins = 2; - google.protobuf.Any PubKey = 3; - uint64 AccountNumber = 4; - uint64 Sequence = 5; + string address = 1; + string coins = 2; + google.protobuf.Any pub_key = 3 [json_name = "public_key"]; + uint64 account_number = 4; + uint64 sequence = 5; } message MemFile { - string Name = 1; - string Body = 2; + string name = 1 [json_name = "Name"]; + string body = 2 [json_name = "Body"]; } message MemPackage { - string Name = 1; - string Path = 2; - repeated MemFile Files = 3; + string name = 1 [json_name = "Name"]; + string path = 2 [json_name = "Path"]; + repeated MemFile files = 3 [json_name = "Files"]; } message InternalError {